Jacek Caban : winex11: Use unixlib interface for X11 calls from systray.c.

Alexandre Julliard julliard at winehq.org
Thu May 5 15:56:00 CDT 2022


Module: wine
Branch: master
Commit: e41630612ba2cb2f64ef3f3de7c712aafe7a2288
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e41630612ba2cb2f64ef3f3de7c712aafe7a2288

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed May  4 23:39:17 2022 +0200

winex11: Use unixlib interface for X11 calls from systray.c.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winex11.drv/systray.c     | 33 +++++++-----------------------
 dlls/winex11.drv/unixlib.h     |  3 +++
 dlls/winex11.drv/window.c      | 46 ++++++++++++++++++++++++++++++++++++++++++
 dlls/winex11.drv/x11drv.h      |  3 +++
 dlls/winex11.drv/x11drv_main.c |  3 +++
 5 files changed, 62 insertions(+), 26 deletions(-)

diff --git a/dlls/winex11.drv/systray.c b/dlls/winex11.drv/systray.c
index 45ad0617246..bb2e5d563dd 100644
--- a/dlls/winex11.drv/systray.c
+++ b/dlls/winex11.drv/systray.c
@@ -587,10 +587,13 @@ static BOOL init_systray(void)
 {
     static BOOL init_done;
     WNDCLASSEXW class;
-    Display *display;
 
-    if (is_virtual_desktop()) return FALSE;
     if (init_done) return TRUE;
+    if (!X11DRV_CALL( systray_init, NULL ))
+    {
+        init_done = TRUE;
+        return FALSE;
+    }
 
     icon_cx = GetSystemMetrics( SM_CXSMICON ) + 2 * ICON_BORDER;
     icon_cy = GetSystemMetrics( SM_CYSMICON ) + 2 * ICON_BORDER;
@@ -620,17 +623,6 @@ static BOOL init_systray(void)
         return FALSE;
     }
 
-    display = thread_init_display();
-    if (DefaultScreen( display ) == 0)
-        systray_atom = x11drv_atom(_NET_SYSTEM_TRAY_S0);
-    else
-    {
-        char systray_buffer[29]; /* strlen(_NET_SYSTEM_TRAY_S4294967295)+1 */
-        sprintf( systray_buffer, "_NET_SYSTEM_TRAY_S%u", DefaultScreen( display ) );
-        systray_atom = XInternAtom( display, systray_buffer, False );
-    }
-    XSelectInput( display, root_window, StructureNotifyMask );
-
     init_done = TRUE;
     return TRUE;
 }
@@ -700,18 +692,11 @@ void change_systray_owner( Display *display, Window systray_window )
 /* hide a tray icon */
 static BOOL hide_icon( struct tray_icon *icon )
 {
-    struct x11drv_win_data *data;
-
     TRACE( "id=0x%x, hwnd=%p\n", icon->id, icon->owner );
 
     if (!icon->window) return TRUE;  /* already hidden */
 
-    /* make sure we don't try to unmap it, it confuses some systray docks */
-    if ((data = get_win_data( icon->window )))
-    {
-        if (data->embedded) data->mapped = FALSE;
-        release_win_data( data );
-    }
+    X11DRV_CALL( systray_hide, &icon->window );
     DestroyWindow(icon->window);
     DestroyWindow(icon->tooltip);
     icon->window = 0;
@@ -759,11 +744,7 @@ static BOOL modify_icon( struct tray_icon *icon, NOTIFYICONDATAW *nid )
         {
             if (icon->display != -1) InvalidateRect( icon->window, NULL, TRUE );
             else if (icon->layered) repaint_tray_icon( icon );
-            else
-            {
-                Window win = X11DRV_get_whole_window( icon->window );
-                if (win) XClearArea( gdi_display, win, 0, 0, 0, 0, True );
-            }
+            else X11DRV_CALL( systray_clear, &icon->window );
         }
     }
 
diff --git a/dlls/winex11.drv/unixlib.h b/dlls/winex11.drv/unixlib.h
index fe3b430dc87..ce89f7d4d39 100644
--- a/dlls/winex11.drv/unixlib.h
+++ b/dlls/winex11.drv/unixlib.h
@@ -24,6 +24,9 @@ enum x11drv_funcs
     unix_clipboard_message,
     unix_create_desktop,
     unix_init,
+    unix_systray_clear,
+    unix_systray_hide,
+    unix_systray_init,
     unix_tablet_attach_queue,
     unix_tablet_get_packet,
     unix_tablet_info,
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 7ccec4ee4ec..4ae1d3f11a3 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -2092,6 +2092,52 @@ HWND create_foreign_window( Display *display, Window xwin )
 }
 
 
+NTSTATUS x11drv_systray_init( void *arg )
+{
+    Display *display;
+
+    if (is_virtual_desktop()) return FALSE;
+
+    display = thread_init_display();
+    if (DefaultScreen( display ) == 0)
+        systray_atom = x11drv_atom(_NET_SYSTEM_TRAY_S0);
+    else
+    {
+        char systray_buffer[29]; /* strlen(_NET_SYSTEM_TRAY_S4294967295)+1 */
+        sprintf( systray_buffer, "_NET_SYSTEM_TRAY_S%u", DefaultScreen( display ) );
+        systray_atom = XInternAtom( display, systray_buffer, False );
+    }
+    XSelectInput( display, root_window, StructureNotifyMask );
+
+    return TRUE;
+}
+
+
+NTSTATUS x11drv_systray_clear( void *arg )
+{
+    HWND hwnd = *(HWND*)arg;
+    Window win = X11DRV_get_whole_window( hwnd );
+    if (win) XClearArea( gdi_display, win, 0, 0, 0, 0, True );
+    return 0;
+}
+
+
+NTSTATUS x11drv_systray_hide( void *arg )
+{
+    HWND hwnd = *(HWND*)arg;
+    struct x11drv_win_data *data;
+
+    /* make sure we don't try to unmap it, it confuses some systray docks */
+    if ((data = get_win_data( hwnd )))
+    {
+        if (data->embedded) data->mapped = FALSE;
+        release_win_data( data );
+    }
+
+    return 0;
+}
+
+
 /***********************************************************************
  *		X11DRV_get_whole_window
  *
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 3986733782a..ec72d8a550e 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -827,6 +827,9 @@ static inline BOOL is_window_rect_mapped( const RECT *rect )
 
 extern NTSTATUS x11drv_clipboard_message( void *arg ) DECLSPEC_HIDDEN;
 extern NTSTATUS x11drv_create_desktop( void *arg ) DECLSPEC_HIDDEN;
+extern NTSTATUS x11drv_systray_clear( void *arg ) DECLSPEC_HIDDEN;
+extern NTSTATUS x11drv_systray_hide( void *arg ) DECLSPEC_HIDDEN;
+extern NTSTATUS x11drv_systray_init( void *arg ) DECLSPEC_HIDDEN;
 extern NTSTATUS x11drv_tablet_attach_queue( void *arg ) DECLSPEC_HIDDEN;
 extern NTSTATUS x11drv_tablet_get_packet( void *arg ) DECLSPEC_HIDDEN;
 extern NTSTATUS x11drv_tablet_load_info( void *arg ) DECLSPEC_HIDDEN;
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 749fe2f761b..2d65f2a03d6 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -977,6 +977,9 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
     x11drv_clipboard_message,
     x11drv_create_desktop,
     x11drv_init,
+    x11drv_systray_clear,
+    x11drv_systray_hide,
+    x11drv_systray_init,
     x11drv_tablet_attach_queue,
     x11drv_tablet_get_packet,
     x11drv_tablet_info,




More information about the wine-cvs mailing list