From 3047b2ce26162f14349a3e0f64668bbadd4bc2ab Mon Sep 17 00:00:00 2001 From: Nick Diego Yamane Date: Thu, 21 Nov 2024 11:26:58 -0300 Subject: [PATCH] wayland/xdg-toplevel-drag: Add MetaWindowActor tied_to_drag state - Skip placement constraints when it is set. - Required to properly support about-to-be-mapped windows, which get "detached" when dragged out of its original owning window. Signed-off-by: Nick Diego Yamane Part-of: --- src/compositor/meta-window-actor-private.h | 5 +++++ src/compositor/meta-window-actor.c | 20 ++++++++++++++++++++ src/core/window.c | 12 +++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/compositor/meta-window-actor-private.h b/src/compositor/meta-window-actor-private.h index 9e86b20f4..0d545f8ac 100644 --- a/src/compositor/meta-window-actor-private.h +++ b/src/compositor/meta-window-actor-private.h @@ -114,3 +114,8 @@ void meta_window_actor_add_surface_actor (MetaWindowActor *window_actor, void meta_window_actor_remove_surface_actor (MetaWindowActor *window_actor, MetaSurfaceActor *surface_actor); + +void meta_window_actor_set_tied_to_drag (MetaWindowActor *window_actor, + gboolean tied_to_drag); + +gboolean meta_window_actor_is_tied_to_drag (MetaWindowActor *window_actor); diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c index f4b051cfd..10c50c0e6 100644 --- a/src/compositor/meta-window-actor.c +++ b/src/compositor/meta-window-actor.c @@ -82,6 +82,9 @@ typedef struct _MetaWindowActorPrivate guint updates_frozen : 1; guint first_frame_state : 2; /* FirstFrameState */ + + /* whether the associated window was created during a window drag */ + unsigned int tied_to_drag : 1; } MetaWindowActorPrivate; enum @@ -1808,3 +1811,20 @@ out: clutter_actor_uninhibit_culling (actor); return content; } + +void +meta_window_actor_set_tied_to_drag (MetaWindowActor *window_actor, + gboolean tied_to_drag) +{ + MetaWindowActorPrivate *priv = + meta_window_actor_get_instance_private (window_actor); + priv->tied_to_drag = tied_to_drag; +} + +gboolean +meta_window_actor_is_tied_to_drag (MetaWindowActor *window_actor) +{ + MetaWindowActorPrivate *priv = + meta_window_actor_get_instance_private (window_actor); + return priv->tied_to_drag; +} diff --git a/src/core/window.c b/src/core/window.c index e23651c3d..50f4d6aba 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -2298,6 +2298,13 @@ meta_window_update_visibility (MetaWindow *window) implement_showing (window, meta_window_should_be_showing (window)); } +static gboolean +meta_window_is_tied_to_drag (MetaWindow *window) +{ + MetaWindowActor *window_actor = meta_window_actor_from_window (window); + return window_actor && meta_window_actor_is_tied_to_drag (window_actor); +} + static void meta_window_show (MetaWindow *window) { @@ -4025,7 +4032,10 @@ meta_window_move_resize_internal (MetaWindow *window, constrained_rect = unconstrained_rect; temporary_rect = rect; - if (flags & META_MOVE_RESIZE_CONSTRAIN && window->monitor) + /* Do not constrain if it is tied to an ongoing window drag. */ + if ((flags & META_MOVE_RESIZE_CONSTRAIN) && + window->monitor && + !meta_window_is_tied_to_drag (window)) { MtkRectangle old_rect;