[mutter] Avoid moving and resizing override-redirect windows



commit 729fb2e0b42bc1f351b193d2fdfbecb1641b1094
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Mon Jun 15 18:25:07 2009 -0400

    Avoid moving and resizing override-redirect windows
    
    Override-redirect windows should not be moved or resized by the
    window manager.
    
    - Mark override-redirect windows as already placed to avoid
      placing them when first shown.
    - Don't move-resize newly created override-redirect MetaWindow
    - Don't queue a resize on override-redirect windows when reading
      their WM_TRANSIENT_FOR hint.
    - Add g_return_if_fail (!window->override_redirect) to catch
      unexpected code paths that might result in override-redirect
      windows being moved or resized.
    
    http://bugzilla.gnome.org/show_bug.cgi?id=582639

 src/core/window-props.c |    2 +-
 src/core/window.c       |   44 +++++++++++++++++++++++++++++++-------------
 2 files changed, 32 insertions(+), 14 deletions(-)
---
diff --git a/src/core/window-props.c b/src/core/window-props.c
index 773eaeb..8be22f8 100644
--- a/src/core/window-props.c
+++ b/src/core/window-props.c
@@ -1446,7 +1446,7 @@ reload_transient_for (MetaWindow    *window,
       window->xtransient_for != window->xgroup_leader)
     meta_window_group_leader_changed (window);
 
-  if (!window->constructing)
+  if (!window->constructing && !window->override_redirect)
     meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
 }
 
diff --git a/src/core/window.c b/src/core/window.c
index bf4f7ed..c76a4dd 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -678,8 +678,9 @@ meta_window_new_with_attrs (MetaDisplay       *display,
   window->hidden = 0;
   /* if already mapped, no need to worry about focus-on-first-time-showing */
   window->showing_for_first_time = !window->mapped;
-  /* if already mapped we don't want to do the placement thing */
-  window->placed = (window->mapped && !window->hidden);
+  /* if already mapped we don't want to do the placement thing;
+   * override-redirect windows are placed by the app */
+  window->placed = ((window->mapped && !window->hidden) || window->override_redirect);
   if (window->placed)
     meta_topic (META_DEBUG_PLACEMENT,
                 "Not placing window 0x%lx since it's already mapped\n",
@@ -963,13 +964,14 @@ meta_window_new_with_attrs (MetaDisplay       *display,
    */
   flags =
     META_IS_CONFIGURE_REQUEST | META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION;
-  meta_window_move_resize_internal (window,
-                                    flags,
-                                    window->size_hints.win_gravity,
-                                    window->size_hints.x,
-                                    window->size_hints.y,
-                                    window->size_hints.width,
-                                    window->size_hints.height);
+  if (!window->override_redirect)
+    meta_window_move_resize_internal (window,
+                                      flags,
+                                      window->size_hints.win_gravity,
+                                      window->size_hints.x,
+                                      window->size_hints.y,
+                                      window->size_hints.width,
+                                      window->size_hints.height);
 
   /* Now try applying saved stuff from the session */
   {
@@ -1958,6 +1960,9 @@ meta_window_queue (MetaWindow *window, guint queuebits)
 {
   guint queuenum;
 
+  /* Easier to debug by checking here rather than in the idle */
+  g_return_if_fail (!window->override_redirect || (queuebits & META_QUEUE_MOVE_RESIZE) == 0);
+
   for (queuenum=0; queuenum<NUMBER_OF_QUEUES; queuenum++)
     {
       if (queuebits & 1<<queuenum)
@@ -3628,6 +3633,8 @@ meta_window_move_resize_internal (MetaWindow          *window,
   MetaRectangle new_rect;
   MetaRectangle old_rect;
 
+  g_return_if_fail (!window->override_redirect);
+
   is_configure_request = (flags & META_IS_CONFIGURE_REQUEST) != 0;
   do_gravity_adjust = (flags & META_DO_GRAVITY_ADJUST) != 0;
   is_user_action = (flags & META_IS_USER_ACTION) != 0;
@@ -4028,6 +4035,8 @@ meta_window_resize (MetaWindow  *window,
   int x, y;
   MetaMoveResizeFlags flags;
 
+  g_return_if_fail (!window->override_redirect);
+
   meta_window_get_position (window, &x, &y);
 
   flags = (user_op ? META_IS_USER_ACTION : 0) | META_IS_RESIZE_ACTION;
@@ -4043,8 +4052,12 @@ meta_window_move (MetaWindow  *window,
                   int          root_x_nw,
                   int          root_y_nw)
 {
-  MetaMoveResizeFlags flags =
-    (user_op ? META_IS_USER_ACTION : 0) | META_IS_MOVE_ACTION;
+  MetaMoveResizeFlags flags;
+
+  g_return_if_fail (!window->override_redirect);
+
+  flags = (user_op ? META_IS_USER_ACTION : 0) | META_IS_MOVE_ACTION;
+
   meta_window_move_resize_internal (window,
                                     flags,
                                     NorthWestGravity,
@@ -4061,8 +4074,11 @@ meta_window_move_resize (MetaWindow  *window,
                          int          w,
                          int          h)
 {
-  MetaMoveResizeFlags flags =
-    (user_op ? META_IS_USER_ACTION : 0) |
+  MetaMoveResizeFlags flags;
+
+  g_return_if_fail (!window->override_redirect);
+
+  flags = (user_op ? META_IS_USER_ACTION : 0) |
     META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION;
   meta_window_move_resize_internal (window,
                                     flags,
@@ -7176,6 +7192,8 @@ meta_window_shove_titlebar_onscreen (MetaWindow *window)
   int            horiz_amount, vert_amount;
   int            newx, newy;
 
+  g_return_if_fail (!window->override_redirect);
+
   /* If there's no titlebar, don't bother */
   if (!window->frame)
     return;



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