[mutter] Allow explicit raises from same client, not just same app



commit 12c46c5d8b55149888d24b19090fddeed76ce2a9
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Mon Oct 19 19:41:54 2009 -0400

    Allow explicit raises from same client, not just same app
    
    We currently allow XRaiseWindow when the same application (defined
    by the window group) is focused, but the kind of old applications
    that XRaiseWindow are frequently not setting the window group.
    
    Expand the check to allow the same X client (defined by the looking
    at client ID) to raise windows above the focus window.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=567528

 src/core/window.c |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+), 0 deletions(-)
---
diff --git a/src/core/window.c b/src/core/window.c
index aa6c691..cf813e8 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -45,6 +45,7 @@
 #include "mutter-enum-types.h"
 
 #include <X11/Xatom.h>
+#include <X11/Xlibint.h> /* For display->resource_mask */
 #include <string.h>
 
 #ifdef HAVE_SHAPE
@@ -72,6 +73,9 @@ static gboolean process_property_notify   (MetaWindow     *window,
 static void     meta_window_show          (MetaWindow     *window);
 static void     meta_window_hide          (MetaWindow     *window);
 
+static gboolean meta_window_same_client (MetaWindow *window,
+                                         MetaWindow *other_window);
+
 static void     meta_window_save_rect         (MetaWindow    *window);
 static void     save_user_window_placement    (MetaWindow    *window);
 static void     force_save_user_window_placement (MetaWindow    *window);
@@ -5184,6 +5188,7 @@ meta_window_configure_request (MetaWindow *window,
         }
       else if (active_window &&
                !meta_window_same_application (window, active_window) &&
+               !meta_window_same_client (window, active_window) &&
                XSERVER_TIME_IS_BEFORE (window->net_wm_user_time,
                                        active_window->net_wm_user_time))
         {
@@ -8157,6 +8162,23 @@ meta_window_same_application (MetaWindow *window,
     group==other_group;
 }
 
+/* Generally meta_window_same_application() is a better idea
+ * of "sameness", since it handles the case where multiple apps
+ * want to look like the same app or the same app wants to look
+ * like multiple apps, but in the case of workarounds for legacy
+ * applications (which likely aren't setting the group properly
+ * anyways), it may be desirable to check this as well.
+ */
+static gboolean
+meta_window_same_client (MetaWindow *window,
+                         MetaWindow *other_window)
+{
+  int resource_mask = window->display->xdisplay->resource_mask;
+
+  return ((window->xwindow & ~resource_mask) ==
+          (other_window->xwindow & ~resource_mask));
+}
+
 void
 meta_window_refresh_resize_popup (MetaWindow *window)
 {



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