diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2017-03-19 14:21:45 +0200 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2017-03-21 17:59:30 +0200 |
commit | 59763feaea1f220c27ebf8716cf2c839c9dc1c07 (patch) | |
tree | 7b6e31872a1e01ba8e1967c34b72f094b8703902 | |
parent | b30c1ce7becf908d3370c156a1227b030e861b8a (diff) | |
download | metacity-59763feaea1f220c27ebf8716cf2c839c9dc1c07.tar.gz |
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
-rw-r--r-- | src/core/window-private.h | 8 | ||||
-rw-r--r-- | 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 0d917b02..5886535b 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 8f133641..cc266516 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) |