[PATCH v3] systray: Hide systray for fullscreen games

Hamish Claxton hamishclaxton at gmail.com
Thu Jan 3 22:16:27 CST 2019


This patch fixes a bug where if using the Wine virtual desktop,
changing resolutions in a fullscreen game would cause the systray
to be drawn over the game window.

Furthermore it also handles borderless fullscreen modes.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=40828
Signed-off-by: Hamish Claxton <hamishclaxton at gmail.com>
---
v3: Rewritten - properly checks the foreground window.
    Also now supports fullscreen borderless modes.

 programs/explorer/systray.c | 68 +++++++++++++++++++++++++++++++++++--
 1 file changed, 66 insertions(+), 2 deletions(-)

diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c
index 3d36f74e16..0d727a7302 100644
--- a/programs/explorer/systray.c
+++ b/programs/explorer/systray.c
@@ -99,7 +99,7 @@ static unsigned int alloc_displayed;
 static unsigned int nb_displayed;
 static struct icon **displayed;  /* array of currently displayed icons */
 
-static BOOL hide_systray, enable_shell;
+static BOOL systray_hidden, hide_systray, enable_shell;
 static int icon_cx, icon_cy, tray_width, tray_height;
 static int start_button_width, taskbar_button_width;
 static WCHAR start_label[50];
@@ -107,6 +107,9 @@ static WCHAR start_label[50];
 static struct icon *balloon_icon;
 static HWND balloon_window;
 
+/* Fullscreen checking */
+static BOOL fullscreen;
+
 #define MIN_DISPLAYED 8
 #define ICON_BORDER  2
 
@@ -780,7 +783,13 @@ static LRESULT WINAPI tray_wndproc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM l
 
     case WM_DISPLAYCHANGE:
         if (hide_systray || (!nb_displayed && !enable_shell)) do_hide_systray();
-        else do_show_systray();
+        /* Show the systray if the foreground window is not fullscreen */
+        else if ( !fullscreen ) {
+            do_show_systray();
+            systray_hidden = FALSE;
+            InvalidateRect( tray_window, NULL, TRUE ); /* Force a redraw of the systray */
+            SendMessageW( GetDesktopWindow(), WM_PARENTNOTIFY, 0, 0 ); /* Notify desktop of update */
+        }
         break;
 
     case WM_TIMER:
@@ -879,6 +888,60 @@ static LRESULT WINAPI tray_wndproc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM l
     return 0;
 }
 
+/*
+    Check if a window is fullscreen, accounting for a maximum
+    difference of two pixels on width and height for borderless
+    fullscreen modes
+*/
+static BOOL is_window_fullscreen( HWND window )
+{
+    int width_delta, height_delta;
+    RECT window_rect, desktop_rect;
+
+    if ( window == GetShellWindow()
+         || window == GetDesktopWindow()
+         || window == tray_window ) return FALSE;
+
+    GetWindowRect( window, &window_rect );
+    GetWindowRect( GetDesktopWindow(), &desktop_rect );
+
+    width_delta = window_rect.right - desktop_rect.right;
+    height_delta = window_rect.bottom - desktop_rect.bottom;
+
+    return ( width_delta >= 0
+             && width_delta <= 2
+             && height_delta >= 0
+             && height_delta <= 2 );
+}
+
+/* Handle systray visibilty */
+void handle_systray( void )
+{
+    /* Check if fullscreen and the foreground window is not fullscreen */
+    if ( fullscreen && !is_window_fullscreen( GetForegroundWindow() ) )
+        fullscreen = FALSE;
+
+    /* Check if not fullscreen and the foreground window is fullscreen */
+    else if ( !fullscreen && is_window_fullscreen( GetForegroundWindow() ) )
+        fullscreen = TRUE;
+
+    /* Hide the systray */
+    if ( ( hide_systray || ( !nb_displayed && !enable_shell )
+           || fullscreen ) && !systray_hidden )
+    {
+        do_hide_systray();
+        systray_hidden = TRUE;
+    }
+
+    /* Show the systray */
+    else if ( !fullscreen && systray_hidden )
+    {
+        do_show_systray();
+        systray_hidden = FALSE;
+        InvalidateRect( tray_window, NULL, TRUE ); /* Force a redraw of the systray */
+    }
+}
+
 /* notification posted to the desktop window */
 void handle_parent_notify( HWND hwnd, WPARAM wp )
 {
@@ -893,6 +956,7 @@ void handle_parent_notify( HWND hwnd, WPARAM wp )
         break;
     }
     sync_taskbar_buttons();
+    handle_systray();
 }
 
 /* this function creates the listener window */
-- 
2.20.1




More information about the wine-devel mailing list