[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