[vlc-devel] [PATCH 08/13] common/win32_fullscreen: attach VlcControlsWnd to VLCHolderWnd
Sergey Radionov
rsatom at gmail.com
Fri Jan 13 04:54:32 CET 2012
---
common/win32_fullscreen.cpp | 58 +++++++++++++++++++++++++++++++++++++-----
common/win32_fullscreen.h | 8 +++++-
2 files changed, 58 insertions(+), 8 deletions(-)
diff --git a/common/win32_fullscreen.cpp b/common/win32_fullscreen.cpp
index 41b5745..b4a9162 100644
--- a/common/win32_fullscreen.cpp
+++ b/common/win32_fullscreen.cpp
@@ -655,6 +655,9 @@ LRESULT CALLBACK VLCHolderWnd::VLCHolderClassWndProc(HWND hWnd, UINT uMsg, WPARA
MoveWindow(hWnd, 0, 0,
(ParentClientRect.right-ParentClientRect.left),
(ParentClientRect.bottom-ParentClientRect.top), FALSE);
+ h_data->_CtrlsWnd =
+ VLCControlsWnd::CreateControlsWindow(h_data->_hinstance, WM,
+ hWnd);
break;
}
case WM_PAINT:{
@@ -668,6 +671,12 @@ LRESULT CALLBACK VLCHolderWnd::VLCHolderClassWndProc(HWND hWnd, UINT uMsg, WPARA
EndPaint(hWnd, &PaintStruct);
break;
}
+ case WM_SHOWWINDOW:{
+ if(FALSE!=wParam){ //showing
+ h_data->NeedShowControls();
+ }
+ break;
+ }
case WM_NCDESTROY:
delete h_data;
SetWindowLongPtr(hWnd, GWLP_USERDATA, 0);
@@ -676,6 +685,19 @@ LRESULT CALLBACK VLCHolderWnd::VLCHolderClassWndProc(HWND hWnd, UINT uMsg, WPARA
h_data->MouseHook(true);
break;
}
+ case WM_SIZE:
+ if(h_data->_CtrlsWnd){
+ int new_client_width = LOWORD(lParam);
+ int new_client_height = HIWORD(lParam);
+
+ RECT rect;
+ GetWindowRect(h_data->_CtrlsWnd->hWnd(), &rect);
+
+ MoveWindow(h_data->_CtrlsWnd->hWnd(),
+ 0, new_client_height - (rect.bottom - rect.top),
+ new_client_width, (rect.bottom-rect.top), TRUE);
+ }
+ break;
case WM_MOUSEMOVE:
case WM_LBUTTONDBLCLK:
h_data->_WindowsManager->OnMouseEvent(uMsg);
@@ -693,6 +715,12 @@ LRESULT CALLBACK VLCHolderWnd::VLCHolderClassWndProc(HWND hWnd, UINT uMsg, WPARA
void VLCHolderWnd::DestroyWindow()
{
LibVlcDetach();
+
+ if(_CtrlsWnd){
+ delete _CtrlsWnd;
+ _CtrlsWnd = 0;
+ }
+
if(_hWnd)
::DestroyWindow(_hWnd);
};
@@ -730,14 +758,14 @@ LRESULT CALLBACK VLCHolderWnd::MouseHookProc(int nCode, WPARAM wParam, LPARAM lP
void VLCHolderWnd::MouseHook(bool SetHook)
{
if(SetHook){
- const HWND hChildWnd = GetWindow(getHWND(), GW_CHILD);
- const DWORD WndThreadID = (hChildWnd) ? GetWindowThreadProcessId(hChildWnd, NULL) : 0;
- if( _hMouseHook &&( !hChildWnd || WndThreadID != _MouseHookThreadId) ){
+ HWND hMPWnd = FindMP_hWnd();
+ const DWORD WndThreadID = (hMPWnd) ? GetWindowThreadProcessId(hMPWnd, NULL) : 0;
+ if( _hMouseHook &&( !hMPWnd || WndThreadID != _MouseHookThreadId) ){
//unhook if something changed
MouseHook(false);
}
- if(!_hMouseHook && hChildWnd && WndThreadID){
+ if(!_hMouseHook && hMPWnd && WndThreadID){
_MouseHookThreadId = WndThreadID;
_hMouseHook =
SetWindowsHookEx(WH_MOUSE, VLCHolderWnd::MouseHookProc,
@@ -753,6 +781,14 @@ void VLCHolderWnd::MouseHook(bool SetHook)
}
}
+HWND VLCHolderWnd::FindMP_hWnd()
+{
+ if(_CtrlsWnd)
+ return GetWindow(_CtrlsWnd->hWnd(), GW_HWNDNEXT);
+ else
+ return GetWindow(getHWND(), GW_CHILD);
+}
+
//libvlc events arrives from separate thread
void VLCHolderWnd::OnLibVlcEvent(const libvlc_event_t* event)
{
@@ -762,14 +798,21 @@ void VLCHolderWnd::OnLibVlcEvent(const libvlc_event_t* event)
//So we try catch events,
//(suppose wnd will be ever created),
//and then try set mouse hook.
- const HWND hChildWnd = GetWindow(getHWND(), GW_CHILD);
- const DWORD WndThreadID = (hChildWnd) ? GetWindowThreadProcessId(hChildWnd, NULL) : 0;
+ HWND hMPWnd = FindMP_hWnd();
+ const DWORD WndThreadID = (hMPWnd) ? GetWindowThreadProcessId(hMPWnd, NULL) : 0;
//if no hook, or window thread has changed
- if(!_hMouseHook || (hChildWnd && WndThreadID != _MouseHookThreadId)){
+ if(!_hMouseHook || (hMPWnd && WndThreadID != _MouseHookThreadId)){
+ DWORD s = GetWindowLong(hMPWnd, GWL_STYLE);
+ s |= WS_CLIPSIBLINGS;
+ SetWindowLong(hMPWnd, GWL_STYLE, s);
+
//libvlc events arrives from separate thread,
//so we need post message to main thread, to notify it.
PostMessage(getHWND(), WM_TRY_SET_MOUSE_HOOK, 0, 0);
}
+
+ if( _CtrlsWnd )
+ _CtrlsWnd->OnLibVlcEvent(event);
}
void VLCHolderWnd::LibVlcAttach()
@@ -1040,6 +1083,7 @@ void VLCWindowsManager::OnMouseEvent(UINT uMouseMsg)
DWORD MsgPos = GetMessagePos();
if(Last_WM_MOUSEMOVE_Pos != MsgPos){
Last_WM_MOUSEMOVE_Pos = MsgPos;
+ _HolderWnd->NeedShowControls();
}
break;
}
diff --git a/common/win32_fullscreen.h b/common/win32_fullscreen.h
index fba8e3a..5be1f63 100644
--- a/common/win32_fullscreen.h
+++ b/common/win32_fullscreen.h
@@ -143,6 +143,9 @@ public:
void LibVlcAttach();
void LibVlcDetach();
+ void NeedShowControls()
+ { if(_CtrlsWnd) _CtrlsWnd->NeedShowControls(); }
+
//libvlc events arrives from separate thread
void OnLibVlcEvent(const libvlc_event_t* event);
@@ -151,6 +154,8 @@ private:
static LRESULT CALLBACK VLCHolderClassWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam);
+ HWND FindMP_hWnd();
+
HHOOK _hMouseHook;
DWORD _MouseHookThreadId;
void MouseHook(bool SetHook);
@@ -167,7 +172,7 @@ private:
private:
VLCHolderWnd(HWND hWnd, VLCWindowsManager* WM)
: _hMouseHook(NULL), _MouseHookThreadId(0), _hWnd(hWnd),
- _WindowsManager(WM){};
+ _WindowsManager(WM), _CtrlsWnd(0) {};
public:
HWND getHWND() const {return _hWnd;}
@@ -175,6 +180,7 @@ public:
private:
HWND _hWnd;
VLCWindowsManager* _WindowsManager;
+ VLCControlsWnd* _CtrlsWnd;
};
///////////////////////
--
1.7.7.1.msysgit.0
More information about the vlc-devel
mailing list