[metacity/gnome-3-20] window: send synthetic ConfigureNotify events



commit 59763feaea1f220c27ebf8716cf2c839c9dc1c07
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sun Mar 19 14:21:45 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-private.h |    8 ---
 src/core/window.c         |  141 +++++++++++++++++++++++++++------------------
 2 files changed, 85 insertions(+), 64 deletions(-)
---
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 0d917b0..5886535 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -551,14 +551,6 @@ void meta_window_send_icccm_message (MetaWindow *window,
                                      Atom        atom,
                                      guint32     timestamp);
 
-
-void     meta_window_move_resize_request(MetaWindow *window,
-                                         guint       value_mask,
-                                         int         gravity,
-                                         int         x,
-                                         int         y,
-                                         int         width,
-                                         int         height);
 gboolean meta_window_configure_request (MetaWindow *window,
                                         XEvent     *event);
 gboolean meta_window_property_notify   (MetaWindow *window,
diff --git a/src/core/window.c b/src/core/window.c
index 8f13364..cc26651 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);
@@ -746,13 +749,13 @@ 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,
+  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 */
   {
@@ -939,10 +942,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);
     }
 }
 
@@ -3327,7 +3330,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
@@ -3660,6 +3666,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
    */
@@ -3740,7 +3752,7 @@ meta_window_move_resize_internal (MetaWindow          *window,
   if (use_static_gravity)
     meta_window_set_gravity (window, NorthWestGravity);
 
-  if (need_configure_notify)
+  if (need_configure_notify && configure_notify)
     send_configure_notify (window);
 
   if (!window->placed && window->force_save_user_rect && !window->fullscreen)
@@ -3797,10 +3809,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
@@ -3811,12 +3821,11 @@ meta_window_move (MetaWindow  *window,
 {
   MetaMoveResizeFlags 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
@@ -3830,11 +3839,9 @@ meta_window_move_resize (MetaWindow  *window,
   MetaMoveResizeFlags 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
@@ -3850,10 +3857,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
@@ -4716,14 +4721,17 @@ meta_window_send_icccm_message (MetaWindow *window,
     meta_error_trap_pop (window->display);
 }
 
-void
+static void
 meta_window_move_resize_request (MetaWindow *window,
                                  guint       value_mask,
                                  int         gravity,
                                  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;
@@ -4891,13 +4899,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
@@ -4916,6 +4921,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
@@ -4925,14 +4940,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
@@ -4980,9 +4995,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;
 }
 
@@ -5471,13 +5501,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]