Module: wine Branch: master Commit: 5a4580730dfcb336738a2a29bf858c508a112728 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a4580730dfcb336738a2a29bf...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Nov 1 19:57:12 2010 +0100
winex11: Re-dock icons when the system tray owner has changed.
---
dlls/winex11.drv/event.c | 12 ++++++++++++ dlls/winex11.drv/systray.c | 15 ++++++++++++++- dlls/winex11.drv/x11drv.h | 3 +++ dlls/winex11.drv/x11drv_main.c | 1 + 4 files changed, 30 insertions(+), 1 deletions(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index 89d3a93..662b068 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -513,6 +513,17 @@ static void set_focus( Display *display, HWND hwnd, Time time )
/********************************************************************** + * handle_manager_message + */ +static void handle_manager_message( HWND hwnd, XClientMessageEvent *event ) +{ + if (hwnd != GetDesktopWindow()) return; + if (systray_atom && event->data.l[1] == systray_atom) + change_systray_owner( event->display, event->data.l[2] ); +} + + +/********************************************************************** * handle_wm_protocols */ static void handle_wm_protocols( HWND hwnd, XClientMessageEvent *event ) @@ -1428,6 +1439,7 @@ struct client_message_handler
static const struct client_message_handler client_messages[] = { + { XATOM_MANAGER, handle_manager_message }, { XATOM_WM_PROTOCOLS, handle_wm_protocols }, { XATOM__XEMBED, handle_xembed_protocol }, { XATOM_DndProtocol, handle_dnd_protocol }, diff --git a/dlls/winex11.drv/systray.c b/dlls/winex11.drv/systray.c index 9d15396..fbbe8c2 100644 --- a/dlls/winex11.drv/systray.c +++ b/dlls/winex11.drv/systray.c @@ -73,7 +73,7 @@ static BOOL delete_icon( struct tray_icon *icon ); #define SYSTEM_TRAY_BEGIN_MESSAGE 1 #define SYSTEM_TRAY_CANCEL_MESSAGE 2
-static Atom systray_atom; +Atom systray_atom = 0;
#define MIN_DISPLAYED 8 #define ICON_BORDER 2 @@ -427,6 +427,19 @@ static void dock_systray_icon( Display *display, struct tray_icon *icon, Window wine_tsx11_unlock(); }
+/* dock systray windows again with the new owner */ +void change_systray_owner( Display *display, Window systray_window ) +{ + struct tray_icon *icon; + + ERR( "new owner %lx\n", systray_window ); + LIST_FOR_EACH_ENTRY( icon, &icon_list, struct tray_icon, entry ) + { + if (icon->display == -1) continue; + hide_icon( icon ); + dock_systray_icon( display, icon, systray_window ); + } +}
/* hide a tray icon */ static BOOL hide_icon( struct tray_icon *icon ) diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 4308823..d6fdbf0 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -619,6 +619,7 @@ enum x11drv_atoms XATOM_CLIPBOARD = FIRST_XATOM, XATOM_COMPOUND_TEXT, XATOM_INCR, + XATOM_MANAGER, XATOM_MULTIPLE, XATOM_SELECTION_DATA, XATOM_TARGETS, @@ -691,6 +692,7 @@ enum x11drv_atoms };
extern Atom X11DRV_Atoms[NB_XATOMS - FIRST_XATOM]; +extern Atom systray_atom;
#define x11drv_atom(name) (X11DRV_Atoms[XATOM_##name - FIRST_XATOM])
@@ -780,6 +782,7 @@ extern void wait_for_withdrawn_state( Display *display, struct x11drv_win_data * extern void update_user_time( Time time ); extern void update_net_wm_states( Display *display, struct x11drv_win_data *data ); extern void make_window_embedded( Display *display, struct x11drv_win_data *data ); +extern void change_systray_owner( Display *display, Window systray_window );
static inline void mirror_rect( const RECT *window_rect, RECT *rect ) { diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index fe4a88c..0d1a7da 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -119,6 +119,7 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] = "CLIPBOARD", "COMPOUND_TEXT", "INCR", + "MANAGER", "MULTIPLE", "SELECTION_DATA", "TARGETS",