xref: /reactos/sdk/lib/3rdparty/strmbase/window.c (revision 10517de5)
1 /*
2  * Generic Implementation of strmbase window classes
3  *
4  * Copyright 2012 Aric Stewart, CodeWeavers
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #define COBJMACROS
22 
23 #include "dshow.h"
24 #include "wine/debug.h"
25 #include "wine/unicode.h"
26 #include "wine/strmbase.h"
27 #include "uuids.h"
28 #include "vfwmsgs.h"
29 #include <assert.h>
30 
31 WINE_DEFAULT_DEBUG_CHANNEL(strmbase);
32 
impl_from_IVideoWindow(IVideoWindow * iface)33 static inline BaseControlWindow *impl_from_IVideoWindow( IVideoWindow *iface)
34 {
35     return CONTAINING_RECORD(iface, BaseControlWindow, IVideoWindow_iface);
36 }
37 
impl_from_BaseWindow(BaseWindow * iface)38 static inline BaseControlWindow *impl_from_BaseWindow(BaseWindow *iface)
39 {
40     return CONTAINING_RECORD(iface, BaseControlWindow, baseWindow);
41 }
42 
WndProcW(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)43 static LRESULT CALLBACK WndProcW(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
44 {
45     BaseWindow* This = (BaseWindow*)GetWindowLongPtrW(hwnd, 0);
46 
47     if (!This)
48         return DefWindowProcW(hwnd, uMsg, wParam, lParam);
49 
50     if (This->pFuncsTable->pfnOnReceiveMessage)
51         return This->pFuncsTable->pfnOnReceiveMessage(This, hwnd, uMsg, wParam, lParam);
52     else
53         return BaseWindowImpl_OnReceiveMessage(This, hwnd, uMsg, wParam, lParam);
54 }
55 
BaseWindowImpl_OnReceiveMessage(BaseWindow * This,HWND hwnd,INT uMsg,WPARAM wParam,LPARAM lParam)56 LRESULT WINAPI BaseWindowImpl_OnReceiveMessage(BaseWindow *This, HWND hwnd, INT uMsg, WPARAM wParam, LPARAM lParam)
57 {
58     if (This->pFuncsTable->pfnPossiblyEatMessage && This->pFuncsTable->pfnPossiblyEatMessage(This, uMsg, wParam, lParam))
59         return 0;
60 
61     switch (uMsg)
62     {
63         case WM_SIZE:
64             if (This->pFuncsTable->pfnOnSize)
65                 return This->pFuncsTable->pfnOnSize(This, LOWORD(lParam), HIWORD(lParam));
66             else
67                 return BaseWindowImpl_OnSize(This, LOWORD(lParam), HIWORD(lParam));
68     }
69 
70     return DefWindowProcW(hwnd, uMsg, wParam, lParam);
71 }
72 
BaseWindowImpl_OnSize(BaseWindow * This,LONG Width,LONG Height)73 BOOL WINAPI BaseWindowImpl_OnSize(BaseWindow *This, LONG Width, LONG Height)
74 {
75     This->Width = Width;
76     This->Height = Height;
77     return TRUE;
78 }
79 
BaseWindow_Init(BaseWindow * pBaseWindow,const BaseWindowFuncTable * pFuncsTable)80 HRESULT WINAPI BaseWindow_Init(BaseWindow *pBaseWindow, const BaseWindowFuncTable* pFuncsTable)
81 {
82     if (!pFuncsTable)
83         return E_INVALIDARG;
84 
85     ZeroMemory(pBaseWindow,sizeof(BaseWindow));
86     pBaseWindow->pFuncsTable = pFuncsTable;
87 
88     return S_OK;
89 }
90 
BaseWindow_Destroy(BaseWindow * This)91 HRESULT WINAPI BaseWindow_Destroy(BaseWindow *This)
92 {
93     if (This->hWnd)
94         BaseWindowImpl_DoneWithWindow(This);
95 
96     HeapFree(GetProcessHeap(), 0, This);
97     return S_OK;
98 }
99 
BaseWindowImpl_PrepareWindow(BaseWindow * This)100 HRESULT WINAPI BaseWindowImpl_PrepareWindow(BaseWindow *This)
101 {
102     WNDCLASSW winclass;
103     static const WCHAR windownameW[] = { 'A','c','t','i','v','e','M','o','v','i','e',' ','W','i','n','d','o','w',0 };
104 
105     This->pClassName = This->pFuncsTable->pfnGetClassWindowStyles(This, &This->ClassStyles, &This->WindowStyles, &This->WindowStylesEx);
106 
107     winclass.style = This->ClassStyles;
108     winclass.lpfnWndProc = WndProcW;
109     winclass.cbClsExtra = 0;
110     winclass.cbWndExtra = sizeof(BaseWindow*);
111     winclass.hInstance = This->hInstance;
112     winclass.hIcon = NULL;
113     winclass.hCursor = NULL;
114     winclass.hbrBackground = GetStockObject(BLACK_BRUSH);
115     winclass.lpszMenuName = NULL;
116     winclass.lpszClassName = This->pClassName;
117     if (!RegisterClassW(&winclass) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS)
118     {
119         ERR("Unable to register window class: %u\n", GetLastError());
120         return E_FAIL;
121     }
122 
123     This->hWnd = CreateWindowExW(This->WindowStylesEx,
124                                  This->pClassName, windownameW,
125                                  This->WindowStyles,
126                                  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
127                                  CW_USEDEFAULT, NULL, NULL, This->hInstance,
128                                  NULL);
129 
130     if (!This->hWnd)
131     {
132         ERR("Unable to create window\n");
133         return E_FAIL;
134     }
135 
136     SetWindowLongPtrW(This->hWnd, 0, (LONG_PTR)This);
137 
138     This->hDC = GetDC(This->hWnd);
139 
140     return S_OK;
141 }
142 
BaseWindowImpl_DoneWithWindow(BaseWindow * This)143 HRESULT WINAPI BaseWindowImpl_DoneWithWindow(BaseWindow *This)
144 {
145     if (!This->hWnd)
146         return S_OK;
147 
148     if (This->hDC)
149         ReleaseDC(This->hWnd, This->hDC);
150     This->hDC = NULL;
151 
152     DestroyWindow(This->hWnd);
153     This->hWnd = NULL;
154 
155     return S_OK;
156 }
157 
BaseWindowImpl_GetDefaultRect(BaseWindow * This)158 RECT WINAPI BaseWindowImpl_GetDefaultRect(BaseWindow *This)
159 {
160     static RECT defRect = {0, 0, 800, 600};
161     return defRect;
162 }
163 
BaseControlWindowImpl_PossiblyEatMessage(BaseWindow * This,UINT uMsg,WPARAM wParam,LPARAM lParam)164 BOOL WINAPI BaseControlWindowImpl_PossiblyEatMessage(BaseWindow *This, UINT uMsg, WPARAM wParam, LPARAM lParam)
165 {
166     BaseControlWindow* pControlWindow = impl_from_BaseWindow(This);
167 
168     if (pControlWindow->hwndDrain)
169     {
170         switch(uMsg)
171         {
172             case WM_KEYDOWN:
173             case WM_KEYUP:
174             case WM_LBUTTONDBLCLK:
175             case WM_LBUTTONDOWN:
176             case WM_LBUTTONUP:
177             case WM_MBUTTONDBLCLK:
178             case WM_MBUTTONDOWN:
179             case WM_MBUTTONUP:
180             case WM_MOUSEACTIVATE:
181             case WM_MOUSEMOVE:
182             case WM_NCLBUTTONDBLCLK:
183             case WM_NCLBUTTONDOWN:
184             case WM_NCLBUTTONUP:
185             case WM_NCMBUTTONDBLCLK:
186             case WM_NCMBUTTONDOWN:
187             case WM_NCMBUTTONUP:
188             case WM_NCMOUSEMOVE:
189             case WM_NCRBUTTONDBLCLK:
190             case WM_NCRBUTTONDOWN:
191             case WM_NCRBUTTONUP:
192             case WM_RBUTTONDBLCLK:
193             case WM_RBUTTONDOWN:
194             case WM_RBUTTONUP:
195                 PostMessageW(pControlWindow->hwndDrain, uMsg, wParam, lParam);
196                 return TRUE;
197             default:
198                 break;
199         }
200     }
201     return FALSE;
202 }
203 
BaseControlWindow_Init(BaseControlWindow * pControlWindow,const IVideoWindowVtbl * lpVtbl,BaseFilter * owner,CRITICAL_SECTION * lock,BasePin * pPin,const BaseWindowFuncTable * pFuncsTable)204 HRESULT WINAPI BaseControlWindow_Init(BaseControlWindow *pControlWindow, const IVideoWindowVtbl *lpVtbl, BaseFilter *owner, CRITICAL_SECTION *lock, BasePin* pPin,const BaseWindowFuncTable *pFuncsTable)
205 {
206     HRESULT hr;
207 
208     hr = BaseWindow_Init(&pControlWindow->baseWindow, pFuncsTable);
209     if (SUCCEEDED(hr))
210     {
211         BaseDispatch_Init(&pControlWindow->baseDispatch, &IID_IVideoWindow);
212         pControlWindow->IVideoWindow_iface.lpVtbl = lpVtbl;
213         pControlWindow->AutoShow = TRUE;
214         pControlWindow->hwndDrain = NULL;
215         pControlWindow->hwndOwner = NULL;
216         pControlWindow->pFilter = owner;
217         pControlWindow->pInterfaceLock = lock;
218         pControlWindow->pPin = pPin;
219     }
220     return hr;
221 }
222 
BaseControlWindow_Destroy(BaseControlWindow * pControlWindow)223 HRESULT WINAPI BaseControlWindow_Destroy(BaseControlWindow *pControlWindow)
224 {
225     BaseWindowImpl_DoneWithWindow(&pControlWindow->baseWindow);
226     return BaseDispatch_Destroy(&pControlWindow->baseDispatch);
227 }
228 
BaseControlWindowImpl_GetTypeInfoCount(IVideoWindow * iface,UINT * pctinfo)229 HRESULT WINAPI BaseControlWindowImpl_GetTypeInfoCount(IVideoWindow *iface, UINT *pctinfo)
230 {
231     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
232 
233     return BaseDispatchImpl_GetTypeInfoCount(&This->baseDispatch, pctinfo);
234 }
235 
BaseControlWindowImpl_GetTypeInfo(IVideoWindow * iface,UINT iTInfo,LCID lcid,ITypeInfo ** ppTInfo)236 HRESULT WINAPI BaseControlWindowImpl_GetTypeInfo(IVideoWindow *iface, UINT iTInfo, LCID lcid, ITypeInfo**ppTInfo)
237 {
238     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
239 
240     return BaseDispatchImpl_GetTypeInfo(&This->baseDispatch, &IID_NULL, iTInfo, lcid, ppTInfo);
241 }
242 
BaseControlWindowImpl_GetIDsOfNames(IVideoWindow * iface,REFIID riid,LPOLESTR * rgszNames,UINT cNames,LCID lcid,DISPID * rgDispId)243 HRESULT WINAPI BaseControlWindowImpl_GetIDsOfNames(IVideoWindow *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
244  {
245     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
246 
247     return BaseDispatchImpl_GetIDsOfNames(&This->baseDispatch, riid, rgszNames, cNames, lcid, rgDispId);
248 }
249 
BaseControlWindowImpl_Invoke(IVideoWindow * iface,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO * pExepInfo,UINT * puArgErr)250 HRESULT WINAPI BaseControlWindowImpl_Invoke(IVideoWindow *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExepInfo, UINT *puArgErr)
251 {
252     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
253     ITypeInfo *pTypeInfo;
254     HRESULT hr;
255 
256     hr = BaseDispatchImpl_GetTypeInfo(&This->baseDispatch, riid, 1, lcid, &pTypeInfo);
257     if (SUCCEEDED(hr))
258     {
259         hr = ITypeInfo_Invoke(pTypeInfo, &This->IVideoWindow_iface, dispIdMember, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
260         ITypeInfo_Release(pTypeInfo);
261     }
262 
263     return hr;
264 }
265 
BaseControlWindowImpl_put_Caption(IVideoWindow * iface,BSTR strCaption)266 HRESULT WINAPI BaseControlWindowImpl_put_Caption(IVideoWindow *iface, BSTR strCaption)
267 {
268     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
269 
270     TRACE("(%p/%p)->(%s (%p))\n", This, iface, debugstr_w(strCaption), strCaption);
271 
272     if (!SetWindowTextW(This->baseWindow.hWnd, strCaption))
273         return E_FAIL;
274 
275     return S_OK;
276 }
277 
BaseControlWindowImpl_get_Caption(IVideoWindow * iface,BSTR * strCaption)278 HRESULT WINAPI BaseControlWindowImpl_get_Caption(IVideoWindow *iface, BSTR *strCaption)
279 {
280     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
281 
282     TRACE("(%p/%p)->(%p)\n", This, iface, strCaption);
283 
284     GetWindowTextW(This->baseWindow.hWnd, (LPWSTR)strCaption, 100);
285 
286     return S_OK;
287 }
288 
BaseControlWindowImpl_put_WindowStyle(IVideoWindow * iface,LONG WindowStyle)289 HRESULT WINAPI BaseControlWindowImpl_put_WindowStyle(IVideoWindow *iface, LONG WindowStyle)
290 {
291     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
292     LONG old;
293 
294     old = GetWindowLongW(This->baseWindow.hWnd, GWL_STYLE);
295 
296     TRACE("(%p/%p)->(%x -> %x)\n", This, iface, old, WindowStyle);
297 
298     if (WindowStyle & (WS_DISABLED|WS_HSCROLL|WS_MAXIMIZE|WS_MINIMIZE|WS_VSCROLL))
299         return E_INVALIDARG;
300 
301     SetWindowLongW(This->baseWindow.hWnd, GWL_STYLE, WindowStyle);
302     SetWindowPos(This->baseWindow.hWnd,0,0,0,0,0,SWP_FRAMECHANGED|SWP_NOSIZE|SWP_NOZORDER);
303     This->baseWindow.WindowStyles = WindowStyle;
304 
305     return S_OK;
306 }
307 
BaseControlWindowImpl_get_WindowStyle(IVideoWindow * iface,LONG * WindowStyle)308 HRESULT WINAPI BaseControlWindowImpl_get_WindowStyle(IVideoWindow *iface, LONG *WindowStyle)
309 {
310     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
311 
312     TRACE("(%p/%p)->(%p)\n", This, iface, WindowStyle);
313 
314     *WindowStyle = This->baseWindow.WindowStyles;
315 
316     return S_OK;
317 }
318 
BaseControlWindowImpl_put_WindowStyleEx(IVideoWindow * iface,LONG WindowStyleEx)319 HRESULT WINAPI BaseControlWindowImpl_put_WindowStyleEx(IVideoWindow *iface, LONG WindowStyleEx)
320 {
321     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
322 
323     TRACE("(%p/%p)->(%d)\n", This, iface, WindowStyleEx);
324 
325     if (!SetWindowLongW(This->baseWindow.hWnd, GWL_EXSTYLE, WindowStyleEx))
326         return E_FAIL;
327 
328     return S_OK;
329 }
330 
BaseControlWindowImpl_get_WindowStyleEx(IVideoWindow * iface,LONG * WindowStyleEx)331 HRESULT WINAPI BaseControlWindowImpl_get_WindowStyleEx(IVideoWindow *iface, LONG *WindowStyleEx)
332 {
333     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
334 
335     TRACE("(%p/%p)->(%p)\n", This, iface, WindowStyleEx);
336 
337     *WindowStyleEx = GetWindowLongW(This->baseWindow.hWnd, GWL_EXSTYLE);
338 
339     return S_OK;
340 }
341 
BaseControlWindowImpl_put_AutoShow(IVideoWindow * iface,LONG AutoShow)342 HRESULT WINAPI BaseControlWindowImpl_put_AutoShow(IVideoWindow *iface, LONG AutoShow)
343 {
344     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
345 
346     TRACE("(%p/%p)->(%d)\n", This, iface, AutoShow);
347 
348     This->AutoShow = AutoShow;
349 
350     return S_OK;
351 }
352 
BaseControlWindowImpl_get_AutoShow(IVideoWindow * iface,LONG * AutoShow)353 HRESULT WINAPI BaseControlWindowImpl_get_AutoShow(IVideoWindow *iface, LONG *AutoShow)
354 {
355     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
356 
357     TRACE("(%p/%p)->(%p)\n", This, iface, AutoShow);
358 
359     *AutoShow = This->AutoShow;
360 
361     return S_OK;
362 }
363 
BaseControlWindowImpl_put_WindowState(IVideoWindow * iface,LONG WindowState)364 HRESULT WINAPI BaseControlWindowImpl_put_WindowState(IVideoWindow *iface, LONG WindowState)
365 {
366     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
367 
368     TRACE("(%p/%p)->(%d)\n", This, iface, WindowState);
369     ShowWindow(This->baseWindow.hWnd, WindowState);
370     return S_OK;
371 }
372 
BaseControlWindowImpl_get_WindowState(IVideoWindow * iface,LONG * WindowState)373 HRESULT WINAPI BaseControlWindowImpl_get_WindowState(IVideoWindow *iface, LONG *WindowState)
374 {
375     WINDOWPLACEMENT place;
376     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
377 
378     place.length = sizeof(place);
379     GetWindowPlacement(This->baseWindow.hWnd, &place);
380     TRACE("(%p/%p)->(%p)\n", This, iface, WindowState);
381     *WindowState = place.showCmd;
382 
383     return S_OK;
384 }
385 
BaseControlWindowImpl_put_BackgroundPalette(IVideoWindow * iface,LONG BackgroundPalette)386 HRESULT WINAPI BaseControlWindowImpl_put_BackgroundPalette(IVideoWindow *iface, LONG BackgroundPalette)
387 {
388     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
389 
390     FIXME("(%p/%p)->(%d): stub !!!\n", This, iface, BackgroundPalette);
391 
392     return S_OK;
393 }
394 
BaseControlWindowImpl_get_BackgroundPalette(IVideoWindow * iface,LONG * pBackgroundPalette)395 HRESULT WINAPI BaseControlWindowImpl_get_BackgroundPalette(IVideoWindow *iface, LONG *pBackgroundPalette)
396 {
397     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
398 
399     FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, pBackgroundPalette);
400 
401     return S_OK;
402 }
403 
BaseControlWindowImpl_put_Visible(IVideoWindow * iface,LONG Visible)404 HRESULT WINAPI BaseControlWindowImpl_put_Visible(IVideoWindow *iface, LONG Visible)
405 {
406     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
407 
408     TRACE("(%p/%p)->(%d)\n", This, iface, Visible);
409 
410     ShowWindow(This->baseWindow.hWnd, Visible ? SW_SHOW : SW_HIDE);
411 
412     return S_OK;
413 }
414 
BaseControlWindowImpl_get_Visible(IVideoWindow * iface,LONG * pVisible)415 HRESULT WINAPI BaseControlWindowImpl_get_Visible(IVideoWindow *iface, LONG *pVisible)
416 {
417     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
418 
419     TRACE("(%p/%p)->(%p)\n", This, iface, pVisible);
420 
421     *pVisible = IsWindowVisible(This->baseWindow.hWnd);
422 
423     return S_OK;
424 }
425 
BaseControlWindowImpl_put_Left(IVideoWindow * iface,LONG Left)426 HRESULT WINAPI BaseControlWindowImpl_put_Left(IVideoWindow *iface, LONG Left)
427 {
428     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
429     RECT WindowPos;
430 
431     TRACE("(%p/%p)->(%d)\n", This, iface, Left);
432 
433     GetWindowRect(This->baseWindow.hWnd, &WindowPos);
434     if (!SetWindowPos(This->baseWindow.hWnd, NULL, Left, WindowPos.top, 0, 0, SWP_NOZORDER|SWP_NOSIZE))
435         return E_FAIL;
436 
437     return S_OK;
438 }
439 
BaseControlWindowImpl_get_Left(IVideoWindow * iface,LONG * pLeft)440 HRESULT WINAPI BaseControlWindowImpl_get_Left(IVideoWindow *iface, LONG *pLeft)
441 {
442     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
443     RECT WindowPos;
444 
445     TRACE("(%p/%p)->(%p)\n", This, iface, pLeft);
446     GetWindowRect(This->baseWindow.hWnd, &WindowPos);
447 
448     *pLeft = WindowPos.left;
449 
450     return S_OK;
451 }
452 
BaseControlWindowImpl_put_Width(IVideoWindow * iface,LONG Width)453 HRESULT WINAPI BaseControlWindowImpl_put_Width(IVideoWindow *iface, LONG Width)
454 {
455     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
456 
457     TRACE("(%p/%p)->(%d)\n", This, iface, Width);
458 
459     if (!SetWindowPos(This->baseWindow.hWnd, NULL, 0, 0, Width, This->baseWindow.Height, SWP_NOZORDER|SWP_NOMOVE))
460         return E_FAIL;
461 
462     This->baseWindow.Width = Width;
463 
464     return S_OK;
465 }
466 
BaseControlWindowImpl_get_Width(IVideoWindow * iface,LONG * pWidth)467 HRESULT WINAPI BaseControlWindowImpl_get_Width(IVideoWindow *iface, LONG *pWidth)
468 {
469     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
470 
471     TRACE("(%p/%p)->(%p)\n", This, iface, pWidth);
472 
473     *pWidth = This->baseWindow.Width;
474 
475     return S_OK;
476 }
477 
BaseControlWindowImpl_put_Top(IVideoWindow * iface,LONG Top)478 HRESULT WINAPI BaseControlWindowImpl_put_Top(IVideoWindow *iface, LONG Top)
479 {
480     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
481     RECT WindowPos;
482 
483     TRACE("(%p/%p)->(%d)\n", This, iface, Top);
484     GetWindowRect(This->baseWindow.hWnd, &WindowPos);
485 
486     if (!SetWindowPos(This->baseWindow.hWnd, NULL, WindowPos.left, Top, 0, 0, SWP_NOZORDER|SWP_NOSIZE))
487         return E_FAIL;
488 
489     return S_OK;
490 }
491 
BaseControlWindowImpl_get_Top(IVideoWindow * iface,LONG * pTop)492 HRESULT WINAPI BaseControlWindowImpl_get_Top(IVideoWindow *iface, LONG *pTop)
493 {
494     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
495     RECT WindowPos;
496 
497     TRACE("(%p/%p)->(%p)\n", This, iface, pTop);
498     GetWindowRect(This->baseWindow.hWnd, &WindowPos);
499 
500     *pTop = WindowPos.top;
501 
502     return S_OK;
503 }
504 
BaseControlWindowImpl_put_Height(IVideoWindow * iface,LONG Height)505 HRESULT WINAPI BaseControlWindowImpl_put_Height(IVideoWindow *iface, LONG Height)
506 {
507     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
508 
509     TRACE("(%p/%p)->(%d)\n", This, iface, Height);
510 
511     if (!SetWindowPos(This->baseWindow.hWnd, NULL, 0, 0, This->baseWindow.Width, Height, SWP_NOZORDER|SWP_NOMOVE))
512         return E_FAIL;
513 
514     This->baseWindow.Height = Height;
515 
516     return S_OK;
517 }
518 
BaseControlWindowImpl_get_Height(IVideoWindow * iface,LONG * pHeight)519 HRESULT WINAPI BaseControlWindowImpl_get_Height(IVideoWindow *iface, LONG *pHeight)
520 {
521     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
522 
523     TRACE("(%p/%p)->(%p)\n", This, iface, pHeight);
524 
525     *pHeight = This->baseWindow.Height;
526 
527     return S_OK;
528 }
529 
BaseControlWindowImpl_put_Owner(IVideoWindow * iface,OAHWND Owner)530 HRESULT WINAPI BaseControlWindowImpl_put_Owner(IVideoWindow *iface, OAHWND Owner)
531 {
532     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
533 
534     TRACE("(%p/%p)->(%08x)\n", This, iface, (DWORD) Owner);
535 
536     This->hwndOwner = (HWND)Owner;
537     SetParent(This->baseWindow.hWnd, This->hwndOwner);
538     if (This->baseWindow.WindowStyles & WS_CHILD)
539     {
540         LONG old = GetWindowLongW(This->baseWindow.hWnd, GWL_STYLE);
541         if (old != This->baseWindow.WindowStyles)
542         {
543             SetWindowLongW(This->baseWindow.hWnd, GWL_STYLE, This->baseWindow.WindowStyles);
544             SetWindowPos(This->baseWindow.hWnd,0,0,0,0,0,SWP_FRAMECHANGED|SWP_NOSIZE|SWP_NOZORDER);
545         }
546     }
547 
548     return S_OK;
549 }
550 
BaseControlWindowImpl_get_Owner(IVideoWindow * iface,OAHWND * Owner)551 HRESULT WINAPI BaseControlWindowImpl_get_Owner(IVideoWindow *iface, OAHWND *Owner)
552 {
553     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
554 
555     TRACE("(%p/%p)->(%p)\n", This, iface, Owner);
556 
557     *(HWND*)Owner = This->hwndOwner;
558 
559     return S_OK;
560 }
561 
BaseControlWindowImpl_put_MessageDrain(IVideoWindow * iface,OAHWND Drain)562 HRESULT WINAPI BaseControlWindowImpl_put_MessageDrain(IVideoWindow *iface, OAHWND Drain)
563 {
564     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
565 
566     TRACE("(%p/%p)->(%08x)\n", This, iface, (DWORD) Drain);
567 
568     This->hwndDrain = (HWND)Drain;
569 
570     return S_OK;
571 }
572 
BaseControlWindowImpl_get_MessageDrain(IVideoWindow * iface,OAHWND * Drain)573 HRESULT WINAPI BaseControlWindowImpl_get_MessageDrain(IVideoWindow *iface, OAHWND *Drain)
574 {
575     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
576 
577     TRACE("(%p/%p)->(%p)\n", This, iface, Drain);
578 
579     *Drain = (OAHWND)This->hwndDrain;
580 
581     return S_OK;
582 }
583 
BaseControlWindowImpl_get_BorderColor(IVideoWindow * iface,LONG * Color)584 HRESULT WINAPI BaseControlWindowImpl_get_BorderColor(IVideoWindow *iface, LONG *Color)
585 {
586     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
587 
588     FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, Color);
589 
590     return S_OK;
591 }
592 
BaseControlWindowImpl_put_BorderColor(IVideoWindow * iface,LONG Color)593 HRESULT WINAPI BaseControlWindowImpl_put_BorderColor(IVideoWindow *iface, LONG Color)
594 {
595     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
596 
597     FIXME("(%p/%p)->(%d): stub !!!\n", This, iface, Color);
598 
599     return S_OK;
600 }
601 
BaseControlWindowImpl_get_FullScreenMode(IVideoWindow * iface,LONG * FullScreenMode)602 HRESULT WINAPI BaseControlWindowImpl_get_FullScreenMode(IVideoWindow *iface, LONG *FullScreenMode)
603 {
604     TRACE("(%p)->(%p)\n", iface, FullScreenMode);
605 
606     return E_NOTIMPL;
607 }
608 
BaseControlWindowImpl_put_FullScreenMode(IVideoWindow * iface,LONG FullScreenMode)609 HRESULT WINAPI BaseControlWindowImpl_put_FullScreenMode(IVideoWindow *iface, LONG FullScreenMode)
610 {
611     TRACE("(%p)->(%d)\n", iface, FullScreenMode);
612     return E_NOTIMPL;
613 }
614 
BaseControlWindowImpl_SetWindowForeground(IVideoWindow * iface,LONG Focus)615 HRESULT WINAPI BaseControlWindowImpl_SetWindowForeground(IVideoWindow *iface, LONG Focus)
616 {
617     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
618     BOOL ret;
619     IPin* pPin;
620     HRESULT hr;
621 
622     TRACE("(%p/%p)->(%d)\n", This, iface, Focus);
623 
624     if ((Focus != FALSE) && (Focus != TRUE))
625         return E_INVALIDARG;
626 
627     hr = IPin_ConnectedTo(&This->pPin->IPin_iface, &pPin);
628     if ((hr != S_OK) || !pPin)
629         return VFW_E_NOT_CONNECTED;
630 
631     if (Focus)
632         ret = SetForegroundWindow(This->baseWindow.hWnd);
633     else
634         ret = SetWindowPos(This->baseWindow.hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
635 
636     if (!ret)
637         return E_FAIL;
638 
639     return S_OK;
640 }
641 
BaseControlWindowImpl_SetWindowPosition(IVideoWindow * iface,LONG Left,LONG Top,LONG Width,LONG Height)642 HRESULT WINAPI BaseControlWindowImpl_SetWindowPosition(IVideoWindow *iface, LONG Left, LONG Top, LONG Width, LONG Height)
643 {
644     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
645 
646     TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height);
647 
648     if (!SetWindowPos(This->baseWindow.hWnd, NULL, Left, Top, Width, Height, SWP_NOZORDER))
649         return E_FAIL;
650 
651     This->baseWindow.Width = Width;
652     This->baseWindow.Height = Height;
653 
654     return S_OK;
655 }
656 
BaseControlWindowImpl_GetWindowPosition(IVideoWindow * iface,LONG * pLeft,LONG * pTop,LONG * pWidth,LONG * pHeight)657 HRESULT WINAPI BaseControlWindowImpl_GetWindowPosition(IVideoWindow *iface, LONG *pLeft, LONG *pTop, LONG *pWidth, LONG *pHeight)
658 {
659     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
660     RECT WindowPos;
661 
662     TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight);
663     GetWindowRect(This->baseWindow.hWnd, &WindowPos);
664 
665     *pLeft = WindowPos.left;
666     *pTop = WindowPos.top;
667     *pWidth = This->baseWindow.Width;
668     *pHeight = This->baseWindow.Height;
669 
670     return S_OK;
671 }
672 
BaseControlWindowImpl_NotifyOwnerMessage(IVideoWindow * iface,OAHWND hwnd,LONG uMsg,LONG_PTR wParam,LONG_PTR lParam)673 HRESULT WINAPI BaseControlWindowImpl_NotifyOwnerMessage(IVideoWindow *iface, OAHWND hwnd, LONG uMsg, LONG_PTR wParam, LONG_PTR lParam)
674 {
675     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
676 
677     TRACE("(%p/%p)->(%08lx, %d, %08lx, %08lx)\n", This, iface, hwnd, uMsg, wParam, lParam);
678 
679     if (!PostMessageW(This->baseWindow.hWnd, uMsg, wParam, lParam))
680         return E_FAIL;
681 
682     return S_OK;
683 }
684 
BaseControlWindowImpl_GetMinIdealImageSize(IVideoWindow * iface,LONG * pWidth,LONG * pHeight)685 HRESULT WINAPI BaseControlWindowImpl_GetMinIdealImageSize(IVideoWindow *iface, LONG *pWidth, LONG *pHeight)
686 {
687     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
688     RECT defaultRect;
689 
690     TRACE("(%p/%p)->(%p, %p)\n", This, iface, pWidth, pHeight);
691     defaultRect = This->baseWindow.pFuncsTable->pfnGetDefaultRect(&This->baseWindow);
692 
693     *pWidth = defaultRect.right - defaultRect.left;
694     *pHeight = defaultRect.bottom - defaultRect.top;
695 
696     return S_OK;
697 }
698 
BaseControlWindowImpl_GetMaxIdealImageSize(IVideoWindow * iface,LONG * pWidth,LONG * pHeight)699 HRESULT WINAPI BaseControlWindowImpl_GetMaxIdealImageSize(IVideoWindow *iface, LONG *pWidth, LONG *pHeight)
700 {
701     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
702     RECT defaultRect;
703 
704     TRACE("(%p/%p)->(%p, %p)\n", This, iface, pWidth, pHeight);
705     defaultRect = This->baseWindow.pFuncsTable->pfnGetDefaultRect(&This->baseWindow);
706 
707     *pWidth = defaultRect.right - defaultRect.left;
708     *pHeight = defaultRect.bottom - defaultRect.top;
709 
710     return S_OK;
711 }
712 
BaseControlWindowImpl_GetRestorePosition(IVideoWindow * iface,LONG * pLeft,LONG * pTop,LONG * pWidth,LONG * pHeight)713 HRESULT WINAPI BaseControlWindowImpl_GetRestorePosition(IVideoWindow *iface, LONG *pLeft, LONG *pTop, LONG *pWidth, LONG *pHeight)
714 {
715     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
716 
717     FIXME("(%p/%p)->(%p, %p, %p, %p): stub !!!\n", This, iface, pLeft, pTop, pWidth, pHeight);
718 
719     return S_OK;
720 }
721 
BaseControlWindowImpl_HideCursor(IVideoWindow * iface,LONG HideCursor)722 HRESULT WINAPI BaseControlWindowImpl_HideCursor(IVideoWindow *iface, LONG HideCursor)
723 {
724     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
725 
726     FIXME("(%p/%p)->(%d): stub !!!\n", This, iface, HideCursor);
727 
728     return S_OK;
729 }
730 
BaseControlWindowImpl_IsCursorHidden(IVideoWindow * iface,LONG * CursorHidden)731 HRESULT WINAPI BaseControlWindowImpl_IsCursorHidden(IVideoWindow *iface, LONG *CursorHidden)
732 {
733     BaseControlWindow*  This = impl_from_IVideoWindow(iface);
734 
735     FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, CursorHidden);
736 
737     return S_OK;
738 }
739