From ae73e9d84d72ab55a1cae0626763039d645ce7c7 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 11 Nov 2016 20:29:59 +0100 Subject: [PATCH] x11: Double check whether the user time window was previously used Some applications like Wine may choose to juggle the same user time window across different toplevels, in that case we receive warnings when trying to register the window a second time, leading to wrong accounting. If the window was already used as the user time window for another toplevel, unset it from the previous MetaWindow owner, and unregister so the registration with the new MetaWindow is successful. https://bugzilla.gnome.org/show_bug.cgi?id=774330 --- src/x11/window-props.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/x11/window-props.c b/src/x11/window-props.c index 3dc4af856..29d6007d8 100644 --- a/src/x11/window-props.c +++ b/src/x11/window-props.c @@ -460,6 +460,8 @@ reload_net_wm_user_time_window (MetaWindow *window, { if (value->type != META_PROP_VALUE_INVALID) { + MetaWindow *prev_owner; + /* Unregister old NET_WM_USER_TIME_WINDOW */ if (window->user_time_window != None) { @@ -472,6 +474,15 @@ reload_net_wm_user_time_window (MetaWindow *window, NoEventMask); } + /* Ensure the new user time window is not used on another MetaWindow, + * and unset its user time window if that is the case. + */ + prev_owner = meta_display_lookup_x_window (window->display, value->v.xwindow); + if (prev_owner && prev_owner->user_time_window == value->v.xwindow) + { + meta_display_unregister_x_window (window->display, value->v.xwindow); + prev_owner->user_time_window = None; + } /* Obtain the new NET_WM_USER_TIME_WINDOW and register it */ window->user_time_window = value->v.xwindow;