[vlc-commits] vout:win32: add support for wallpaper mode to the Win32 vout_window_t

Steve Lhomme git at videolan.org
Tue Apr 2 16:33:16 CEST 2019


vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Fri Mar 29 10:24:08 2019 +0100| [1b322d43df0eb2f19a59ec759eecaf0eba5124b3] | committer: Steve Lhomme

vout:win32: add support for wallpaper mode to the Win32 vout_window_t

This is used when setting the wallpaper mode on startup (not when toggling it
from the GUI).

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1b322d43df0eb2f19a59ec759eecaf0eba5124b3
---

 modules/video_output/win32/window.c | 106 +++++++++++++++++++++++++++---------
 1 file changed, 80 insertions(+), 26 deletions(-)

diff --git a/modules/video_output/win32/window.c b/modules/video_output/win32/window.c
index 75da962351..04e83727d5 100644
--- a/modules/video_output/win32/window.c
+++ b/modules/video_output/win32/window.c
@@ -40,7 +40,7 @@
 #define RECTHeight(r)  (LONG)((r).bottom - (r).top)
 
 #define WM_VLC_CHANGE_TEXT   (WM_APP + 1)
-#define WM_VLC_SET_ON_TOP    (WM_APP + 2)
+#define WM_VLC_SET_TOP_STATE (WM_APP + 2)
 
 #define IDM_TOGGLE_ON_TOP  (WM_USER + 1)
 
@@ -120,17 +120,8 @@ static void Disable(struct vout_window_t *wnd)
 
 static void SetState(vout_window_t *wnd, unsigned state)
 {
-    enum vout_window_state wstate = state;
     vout_window_sys_t *sys = wnd->sys;
-    switch (wstate)
-    {
-    case VOUT_WINDOW_STATE_ABOVE:
-        PostMessage( sys->hwnd, WM_VLC_SET_ON_TOP, TRUE, 0);
-        break;
-    case VOUT_WINDOW_STATE_NORMAL:
-        PostMessage( sys->hwnd, WM_VLC_SET_ON_TOP, FALSE, 0);
-        break;
-    }
+    PostMessage( sys->hwnd, WM_VLC_SET_TOP_STATE, state, 0);
 }
 
 static void SetTitle(vout_window_t *wnd, const char *title)
@@ -192,15 +183,30 @@ static void UnsetFullscreen(vout_window_t *wnd)
     ShowWindow(sys->hwnd, SW_SHOWNORMAL);
 }
 
-static void SetAbove( HWND hwnd, bool is_on_top )
+static void SetAbove( vout_window_t *wnd, enum vout_window_state state )
 {
-    HMENU hMenu = GetSystemMenu(hwnd, FALSE);
-    if (is_on_top && !(GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)) {
-        CheckMenuItem(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND | MFS_CHECKED);
-        SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
-    } else if (!is_on_top && (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)) {
-        CheckMenuItem(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND | MFS_UNCHECKED);
-        SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
+    vout_window_sys_t *sys = wnd->sys;
+    switch (state) {
+    case VOUT_WINDOW_STATE_NORMAL:
+        if ((GetWindowLong(sys->hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST))
+        {
+            HMENU hMenu = GetSystemMenu(sys->hwnd, FALSE);
+            CheckMenuItem(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND | MFS_UNCHECKED);
+            SetWindowPos(sys->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
+        }
+        break;
+    case VOUT_WINDOW_STATE_ABOVE:
+        if (!(GetWindowLong(sys->hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST))
+        {
+            HMENU hMenu = GetSystemMenu(sys->hwnd, FALSE);
+            CheckMenuItem(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND | MFS_CHECKED);
+            SetWindowPos(sys->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
+        }
+        break;
+    case VOUT_WINDOW_STATE_BELOW:
+        SetWindowPos(sys->hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
+        break;
+
     }
 }
 
@@ -261,8 +267,8 @@ static long FAR PASCAL WinVoutEventProc( HWND hwnd, UINT message,
         }
         break;
 
-    case WM_VLC_SET_ON_TOP:
-        SetAbove( hwnd, wParam != 0);
+    case WM_VLC_SET_TOP_STATE:
+        SetAbove( wnd, (enum vout_window_state) wParam);
         return 0;
 
     case WM_VLC_CHANGE_TEXT:
@@ -323,6 +329,44 @@ static void Close(vout_window_t *wnd)
     wnd->sys = NULL;
 }
 
+#if !VLC_WINSTORE_APP
+static int CALLBACK enumWindowsProc(HWND hwnd, LPARAM lParam)
+{
+    HWND *wnd = (HWND *)lParam;
+
+    char name[128];
+    name[0] = '\0';
+    GetClassNameA( hwnd, name, 128 );
+
+    if( !strcasecmp( name, "WorkerW" ) )
+    {
+        hwnd = FindWindowEx( hwnd, NULL, _T("SHELLDLL_DefView"), NULL );
+        if( hwnd ) hwnd = FindWindowEx( hwnd, NULL, _T("SysListView32"), NULL );
+        if( hwnd )
+        {
+            *wnd = hwnd;
+            return false;
+        }
+    }
+    return true;
+}
+
+static HWND GetDesktopHandle(vlc_object_t *obj)
+{
+    /* Find Program Manager */
+    HWND hwnd = FindWindow( _T("Progman"), NULL );
+    if( hwnd ) hwnd = FindWindowEx( hwnd, NULL, _T("SHELLDLL_DefView"), NULL );
+    if( hwnd ) hwnd = FindWindowEx( hwnd, NULL, _T("SysListView32"), NULL );
+    if( hwnd )
+        return hwnd;
+
+    msg_Dbg( obj, "Couldn't find desktop icon window,. Trying the hard way." );
+
+    EnumWindows( enumWindowsProc, (LPARAM)&hwnd );
+    return hwnd;
+}
+#endif
+
 static void *EventThread( void *p_this )
 {
     vout_window_t *wnd = (vout_window_t *)p_this;
@@ -332,7 +376,20 @@ static void *EventThread( void *p_this )
 
     HINSTANCE hInstance = GetModuleHandle(NULL);
 
-    LONG i_window_style = WS_OVERLAPPEDWINDOW | WS_SIZEBOX | WS_CLIPCHILDREN;
+    LONG i_window_style;
+    HWND hwParent;
+#if !VLC_WINSTORE_APP
+    if (var_InheritBool( wnd, "video-wallpaper" ))
+    {
+        hwParent = GetDesktopHandle(p_this);
+        i_window_style = WS_CLIPCHILDREN|WS_CHILD;
+    }
+    else
+#endif
+    {
+        hwParent = 0;
+        i_window_style = WS_OVERLAPPEDWINDOW | WS_SIZEBOX | WS_CLIPCHILDREN;
+    }
 
     /* allow user to regain control over input events if requested */
     bool b_mouse_support = var_InheritBool( wnd, "mouse-events" );
@@ -350,7 +407,7 @@ static void *EventThread( void *p_this )
                     CW_USEDEFAULT,                   /* default Y coordinate */
                     CW_USEDEFAULT,                           /* window width */
                     CW_USEDEFAULT,                          /* window height */
-                    0,                                      /* parent window */
+                    hwParent,                               /* parent window */
                     NULL,                          /* no menu in this window */
                     hInstance,            /* handle of this program instance */
                     wnd );                           /* send vd to WM_CREATE */
@@ -401,9 +458,6 @@ static const struct vout_window_operations ops = {
 
 static int Open(vout_window_t *wnd)
 {
-    if (var_InheritBool( wnd, "video-wallpaper" ))
-        return VLC_EGENERIC;
-
     vout_window_sys_t *sys = vlc_obj_calloc(VLC_OBJECT(wnd), 1, sizeof(vout_window_sys_t));
     if (unlikely(sys == NULL))
         return VLC_ENOMEM;



More information about the vlc-commits mailing list