[mutter] x11: Double check whether the user time window was previously used



commit ae73e9d84d72ab55a1cae0626763039d645ce7c7
Author: Carlos Garnacho <carlosg gnome org>
Date:   Fri Nov 11 20:29:59 2016 +0100

    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 files changed, 11 insertions(+), 0 deletions(-)
---
diff --git a/src/x11/window-props.c b/src/x11/window-props.c
index 3dc4af8..29d6007 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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]