From 5bdc08099e951e3907b20740bab1d5d941172c31 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 27 Feb 2023 12:57:32 +0100 Subject: [PATCH] compositor: Fix handling of keyboard-driven window resize The introduction of the META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED flag threw off some checks around keyboard-driven resize. This was partly because there were some == checks that did not account for that flag maybe being enabled, but also the handling of META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN into a definite resize direction was maybe unsetting that flag. Fix both things at the same time. Fixes: 2d8fa26c8e ("core: Pass "frame action" grab operations as an "unconstrained" grab op") Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2629 Part-of: --- src/compositor/meta-window-drag.c | 18 ++++++++++++++---- src/core/display.c | 4 +++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/compositor/meta-window-drag.c b/src/compositor/meta-window-drag.c index befb9e2e5..9410aa710 100644 --- a/src/compositor/meta-window-drag.c +++ b/src/compositor/meta-window-drag.c @@ -722,10 +722,14 @@ process_keyboard_resize_grab_op_change (MetaWindowDrag *window_drag, MetaWindow *window, ClutterKeyEvent *event) { + MetaGrabOp op, unconstrained; gboolean handled; + op = (window_drag->grab_op & ~META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED); + unconstrained = (window_drag->grab_op & META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED); + handled = FALSE; - switch (window_drag->grab_op) + switch (op) { case META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN: switch (event->keyval) @@ -828,6 +832,8 @@ process_keyboard_resize_grab_op_change (MetaWindowDrag *window_drag, break; } + window_drag->grab_op |= unconstrained; + if (handled) { update_keyboard_resize (window_drag, TRUE); @@ -1091,7 +1097,8 @@ process_key_event (MetaWindowDrag *window_drag, if (window_drag->grab_op & META_GRAB_OP_WINDOW_FLAG_KEYBOARD) { - if (window_drag->grab_op == META_GRAB_OP_KEYBOARD_MOVING) + if ((window_drag->grab_op & META_GRAB_OP_KEYBOARD_MOVING) == + META_GRAB_OP_KEYBOARD_MOVING) { meta_topic (META_DEBUG_KEYBINDINGS, "Processing event for keyboard move"); @@ -1454,9 +1461,12 @@ update_resize (MetaWindowDrag *window_drag, if (dx == 0 && dy == 0) return; - if (window_drag->grab_op == META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN) + if ((window_drag->grab_op & META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN) == + META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN) { - MetaGrabOp op = META_GRAB_OP_WINDOW_BASE | META_GRAB_OP_WINDOW_FLAG_KEYBOARD; + MetaGrabOp op = META_GRAB_OP_WINDOW_BASE | + META_GRAB_OP_WINDOW_FLAG_KEYBOARD | + (window_drag->grab_op & META_GRAB_OP_WINDOW_FLAG_UNCONSTRAINED); if (dx > 0) op |= META_GRAB_OP_WINDOW_DIR_EAST; diff --git a/src/core/display.c b/src/core/display.c index c82ea47ba..0ee95c0f0 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -1198,7 +1198,9 @@ meta_grab_op_is_keyboard (MetaGrabOp op) gboolean meta_grab_op_is_resizing (MetaGrabOp op) { - return (op & META_GRAB_OP_WINDOW_DIR_MASK) != 0 || op == META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN; + return (op & META_GRAB_OP_WINDOW_DIR_MASK) != 0 || + (op & META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN) == + META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN; } gboolean