[metacity] window: send synthetic ConfigureNotify events



commit 055be3669c52653fcb9f009972af4b975e20d587
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sat Mar 18 18:21:39 2017 +0200

    window: send synthetic ConfigureNotify events
    
    We might receive ConfigureRequest to change only window stacking
    order. According to ICCCM section 4.1.5 we should send synthetic
    ConfigureNotify event.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=582580

 src/core/window.c |  139 ++++++++++++++++++++++++++++++++---------------------
 1 files changed, 84 insertions(+), 55 deletions(-)
---
diff --git a/src/core/window.c b/src/core/window.c
index 6cdb892..398e14d 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -78,13 +78,16 @@ 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);
 
-static void meta_window_move_resize_internal (MetaWindow         *window,
-                                              MetaMoveResizeFlags flags,
-                                              int                 resize_gravity,
-                                              int                 root_x_nw,
-                                              int                 root_y_nw,
-                                              int                 w,
-                                              int                 h);
+static void meta_window_move_resize_internal (MetaWindow          *window,
+                                              MetaMoveResizeFlags  flags,
+                                              int                  resize_gravity,
+                                              int                  root_x_nw,
+                                              int                  root_y_nw,
+                                              int                  w,
+                                              int                  h,
+                                              gboolean             configure_notify,
+                                              gboolean            *moved,
+                                              gboolean            *resized);
 
 static void     ensure_mru_position_after (MetaWindow *window,
                                            MetaWindow *after_this_one);
@@ -785,13 +788,13 @@ meta_window_new (MetaDisplay    *display,
   flags =
     META_IS_CONFIGURE_REQUEST | META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION;
   if (!window->override_redirect)
-    meta_window_move_resize_internal (window,
-                                      flags,
+    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);
+                                      window->size_hints.height,
+                                      TRUE, NULL, NULL);
 
   /* Now try applying saved stuff from the session */
   {
@@ -991,10 +994,10 @@ meta_window_apply_session_info (MetaWindow *window,
                   x, y, w, h, window->desc);
 
       flags = META_DO_GRAVITY_ADJUST | META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION;
-      meta_window_move_resize_internal (window,
-                                        flags,
+      meta_window_move_resize_internal (window, flags,
                                         window->size_hints.win_gravity,
-                                        x, y, w, h);
+                                        x, y, w, h,
+                                        TRUE, NULL, NULL);
     }
 }
 
@@ -3538,7 +3541,10 @@ meta_window_move_resize_internal (MetaWindow          *window,
                                   int                  root_x_nw,
                                   int                  root_y_nw,
                                   int                  w,
-                                  int                  h)
+                                  int                  h,
+                                  gboolean             configure_notify,
+                                  gboolean            *moved,
+                                  gboolean            *resized)
 {
   /* meta_window_move_resize_internal gets called with very different
    * meanings for root_x_nw and root_y_nw.  w & h are always the area
@@ -3831,6 +3837,12 @@ meta_window_move_resize_internal (MetaWindow          *window,
        (window->size_hints.flags & USPosition)))
     need_configure_notify = TRUE;
 
+  if (moved != NULL)
+    *moved = need_move_client || need_move_frame;
+
+  if (resized != NULL)
+    *resized = need_resize_client || need_resize_frame;
+
   /* The rest of this function syncs our new size/pos with X as
    * efficiently as possible
    */
@@ -3903,7 +3915,7 @@ meta_window_move_resize_internal (MetaWindow          *window,
                                                      need_move_frame,
                                                      need_resize_frame);
 
-  if (need_configure_notify)
+  if (need_configure_notify && configure_notify)
     send_configure_notify (window);
 
   if (!window->placed && window->force_save_user_rect && !window->fullscreen)
@@ -3963,10 +3975,8 @@ meta_window_resize (MetaWindow  *window,
   meta_window_get_position (window, &x, &y);
 
   flags = (user_op ? META_IS_USER_ACTION : 0) | META_IS_RESIZE_ACTION;
-  meta_window_move_resize_internal (window,
-                                    flags,
-                                    NorthWestGravity,
-                                    x, y, w, h);
+  meta_window_move_resize_internal (window, flags, NorthWestGravity,
+                                    x, y, w, h, TRUE, NULL, NULL);
 }
 
 void
@@ -3981,12 +3991,11 @@ meta_window_move (MetaWindow  *window,
 
   flags = (user_op ? META_IS_USER_ACTION : 0) | META_IS_MOVE_ACTION;
 
-  meta_window_move_resize_internal (window,
-                                    flags,
-                                    NorthWestGravity,
+  meta_window_move_resize_internal (window, flags, NorthWestGravity,
                                     root_x_nw, root_y_nw,
                                     window->rect.width,
-                                    window->rect.height);
+                                    window->rect.height,
+                                    TRUE, NULL, NULL);
 }
 
 void
@@ -4003,11 +4012,9 @@ meta_window_move_resize (MetaWindow  *window,
 
   flags = (user_op ? META_IS_USER_ACTION : 0) |
     META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION;
-  meta_window_move_resize_internal (window,
-                                    flags,
-                                    NorthWestGravity,
-                                    root_x_nw, root_y_nw,
-                                    w, h);
+  meta_window_move_resize_internal (window, flags, NorthWestGravity,
+                                    root_x_nw, root_y_nw, w, h,
+                                    TRUE, NULL, NULL);
 }
 
 void
@@ -4023,10 +4030,8 @@ meta_window_resize_with_gravity (MetaWindow *window,
   meta_window_get_position (window, &x, &y);
 
   flags = (user_op ? META_IS_USER_ACTION : 0) | META_IS_RESIZE_ACTION;
-  meta_window_move_resize_internal (window,
-                                    flags,
-                                    gravity,
-                                    x, y, w, h);
+  meta_window_move_resize_internal (window, flags, gravity, x, y, w, h,
+                                    TRUE, NULL, NULL);
 }
 
 static void
@@ -4951,7 +4956,10 @@ meta_window_move_resize_request (MetaWindow *window,
                                  int         new_x,
                                  int         new_y,
                                  int         new_width,
-                                 int         new_height)
+                                 int         new_height,
+                                 gboolean    configure_notify,
+                                 gboolean   *moved,
+                                 gboolean   *resized)
 {
   int x, y, width, height;
   gboolean allow_position_change;
@@ -5119,13 +5127,10 @@ meta_window_move_resize_request (MetaWindow *window,
     flags |= META_IS_RESIZE_ACTION;
 
   if (flags & (META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION))
-    meta_window_move_resize_internal (window,
-                                      flags,
-                                      gravity,
-                                      x,
-                                      y,
-                                      width,
-                                      height);
+    meta_window_move_resize_internal (window, flags, gravity,
+                                      x, y, width, height,
+                                      configure_notify,
+                                      moved, resized);
 
   /* window->user_rect exists to allow "snapping-back" the window if a
    * new strut is set (causing the window to move) and then the strut
@@ -5144,6 +5149,16 @@ gboolean
 meta_window_configure_request (MetaWindow *window,
                                XEvent     *event)
 {
+  gboolean moved;
+  gboolean resized;
+  gboolean restacked;
+  gboolean need_configure_notify;
+
+  moved = FALSE;
+  resized = FALSE;
+  restacked = FALSE;
+  need_configure_notify = FALSE;
+
   /* Note that x, y is the corner of the window border,
    * and width, height is the size of the window inside
    * its border, but that we always deny border requests
@@ -5153,14 +5168,14 @@ meta_window_configure_request (MetaWindow *window,
   if (event->xconfigurerequest.value_mask & CWBorderWidth)
     window->border_width = event->xconfigurerequest.border_width;
 
-  meta_window_move_resize_request(window,
-                                  event->xconfigurerequest.value_mask,
-                                  window->size_hints.win_gravity,
-                                  event->xconfigurerequest.x,
-                                  event->xconfigurerequest.y,
-                                  event->xconfigurerequest.width,
-                                  event->xconfigurerequest.height);
-
+  meta_window_move_resize_request (window,
+                                   event->xconfigurerequest.value_mask,
+                                   window->size_hints.win_gravity,
+                                   event->xconfigurerequest.x,
+                                   event->xconfigurerequest.y,
+                                   event->xconfigurerequest.width,
+                                   event->xconfigurerequest.height,
+                                   FALSE, &moved, &resized);
 
   /* Handle stacking. We only handle raises/lowers (both absolute and
    * relative to siblings), mostly because stack.c really can't deal with
@@ -5208,9 +5223,24 @@ meta_window_configure_request (MetaWindow *window,
             }
 
           restack_window(window, sibling, event->xconfigurerequest.detail);
+
+          restacked = TRUE;
         }
     }
 
+  /* If we change nothing, then we must send configure notify. */
+  if (!(moved || resized || window->border_width != 0 || restacked))
+    need_configure_notify = TRUE;
+
+  /* We must send configure notify if we move or restack without
+   * resizing or changing border width.
+   */
+  if ((moved || restacked) && !(resized || window->border_width != 0))
+    need_configure_notify = TRUE;
+
+  if (need_configure_notify)
+    send_configure_notify (window);
+
   return TRUE;
 }
 
@@ -5708,13 +5738,12 @@ meta_window_client_message (MetaWindow *window,
       if (gravity == 0)
         gravity = window->size_hints.win_gravity;
 
-      meta_window_move_resize_request(window,
-                                      value_mask,
-                                      gravity,
-                                      event->xclient.data.l[1],  /* x */
-                                      event->xclient.data.l[2],  /* y */
-                                      event->xclient.data.l[3],  /* width */
-                                      event->xclient.data.l[4]); /* height */
+      meta_window_move_resize_request (window, value_mask, gravity,
+                                       event->xclient.data.l[1], /* x */
+                                       event->xclient.data.l[2], /* y */
+                                       event->xclient.data.l[3], /* width */
+                                       event->xclient.data.l[4], /* height */
+                                       TRUE, NULL, NULL);
     }
   else if (event->xclient.message_type ==
            display->atom__NET_ACTIVE_WINDOW)


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