[mutter] Don't do stacking for override-redirect windows



commit 34e4b594cded1773cd961ba0afea552fe2594e4d
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Mon Jun 15 14:31:04 2009 -0400

    Don't do stacking for override-redirect windows
    
    Don't add override-redirect windows to MetaStack; we shouldn't
    be restacking them.
    
    Since we *aren't* stacking the override-redirect windows, we need to
    be careful that to ignore them when looking for the top managed
    window.
    
    http://bugzilla.gnome.org/show_bug.cgi?id=585984

 src/core/stack.c        |   52 +++++++++++++++++++++++++---------------------
 src/core/window-props.c |    3 +-
 src/core/window.c       |   10 ++++++--
 3 files changed, 37 insertions(+), 28 deletions(-)
---
diff --git a/src/core/stack.c b/src/core/stack.c
index de70fb8..40a9365 100644
--- a/src/core/stack.c
+++ b/src/core/stack.c
@@ -1015,31 +1015,35 @@ raise_window_relative_to_managed_windows (MetaScreen *screen,
            * to be moved below.
            */
         }
-      else if (meta_display_lookup_x_window (screen->display,
-                                             children[i]) != NULL)
+      else
         {
-          XWindowChanges changes;
-          
-          /* children[i] is the topmost managed child */
-          meta_topic (META_DEBUG_STACK,
-                      "Moving 0x%lx above topmost managed child window 0x%lx\n",
-                      xwindow, children[i]);
-
-          changes.sibling = children[i];
-          changes.stack_mode = Above;
-
-          meta_error_trap_push (screen->display);
-          meta_stack_tracker_record_raise_above (screen->stack_tracker,
-                                                 xwindow,
-                                                 children[i],
-                                                 XNextRequest (screen->display->xdisplay));
-          XConfigureWindow (screen->display->xdisplay,
-                            xwindow,
-                            CWSibling | CWStackMode,
-                            &changes);
-          meta_error_trap_pop (screen->display, FALSE);
-
-          break;
+          MetaWindow *other = meta_display_lookup_x_window (screen->display,
+                                                            children[i]);
+          if (other != NULL && !other->override_redirect)
+            {
+              XWindowChanges changes;
+
+              /* children[i] is the topmost managed child */
+              meta_topic (META_DEBUG_STACK,
+                          "Moving 0x%lx above topmost managed child window 0x%lx\n",
+                          xwindow, children[i]);
+
+              changes.sibling = children[i];
+              changes.stack_mode = Above;
+
+              meta_error_trap_push (screen->display);
+              meta_stack_tracker_record_raise_above (screen->stack_tracker,
+                                                     xwindow,
+                                                     children[i],
+                                                     XNextRequest (screen->display->xdisplay));
+              XConfigureWindow (screen->display->xdisplay,
+                                xwindow,
+                                CWSibling | CWStackMode,
+                                &changes);
+              meta_error_trap_pop (screen->display, FALSE);
+
+              break;
+            }
         }
 
       --i;
diff --git a/src/core/window-props.c b/src/core/window-props.c
index 8be22f8..ff2eb30 100644
--- a/src/core/window-props.c
+++ b/src/core/window-props.c
@@ -1435,7 +1435,8 @@ reload_transient_for (MetaWindow    *window,
   meta_window_recalc_window_type (window);
 
   /* update stacking constraints */
-  meta_stack_update_transient (window->screen->stack, window);
+  if (!window->override_redirect)
+    meta_stack_update_transient (window->screen->stack, window);
 
   /* possibly change its group. We treat being a window's transient as
    * equivalent to making it your group leader, to work around shortcomings
diff --git a/src/core/window.c b/src/core/window.c
index 77d000a..5558e0c 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -955,8 +955,11 @@ meta_window_new_with_attrs (MetaDisplay       *display,
    * and thus constraints may try to auto-fullscreen it which also
    * means restacking it.
    */
-  meta_stack_add (window->screen->stack,
-                  window);
+  if (!window->override_redirect)
+    meta_stack_add (window->screen->stack,
+                    window);
+  else
+    window->layer = META_LAYER_OVERRIDE_REDIRECT; /* otherwise set by MetaStack */
 
   /* Put our state back where it should be,
    * passing TRUE for is_configure_request, ICCCM says
@@ -1311,7 +1314,8 @@ meta_window_unmanage (MetaWindow  *window,
     }
 #endif
 
-  meta_stack_remove (window->screen->stack, window);
+  if (!window->override_redirect)
+    meta_stack_remove (window->screen->stack, window);
 
   if (window->frame)
     meta_window_destroy_frame (window);



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