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 <nickdiego@igalia.com> Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4107>
This commit is contained in:
@ -114,3 +114,8 @@ void meta_window_actor_add_surface_actor (MetaWindowActor *window_actor,
|
|||||||
|
|
||||||
void meta_window_actor_remove_surface_actor (MetaWindowActor *window_actor,
|
void meta_window_actor_remove_surface_actor (MetaWindowActor *window_actor,
|
||||||
MetaSurfaceActor *surface_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);
|
||||||
|
@ -82,6 +82,9 @@ typedef struct _MetaWindowActorPrivate
|
|||||||
|
|
||||||
guint updates_frozen : 1;
|
guint updates_frozen : 1;
|
||||||
guint first_frame_state : 2; /* FirstFrameState */
|
guint first_frame_state : 2; /* FirstFrameState */
|
||||||
|
|
||||||
|
/* whether the associated window was created during a window drag */
|
||||||
|
unsigned int tied_to_drag : 1;
|
||||||
} MetaWindowActorPrivate;
|
} MetaWindowActorPrivate;
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@ -1808,3 +1811,20 @@ out:
|
|||||||
clutter_actor_uninhibit_culling (actor);
|
clutter_actor_uninhibit_culling (actor);
|
||||||
return content;
|
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;
|
||||||
|
}
|
||||||
|
@ -2298,6 +2298,13 @@ meta_window_update_visibility (MetaWindow *window)
|
|||||||
implement_showing (window, meta_window_should_be_showing (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
|
static void
|
||||||
meta_window_show (MetaWindow *window)
|
meta_window_show (MetaWindow *window)
|
||||||
{
|
{
|
||||||
@ -4025,7 +4032,10 @@ meta_window_move_resize_internal (MetaWindow *window,
|
|||||||
|
|
||||||
constrained_rect = unconstrained_rect;
|
constrained_rect = unconstrained_rect;
|
||||||
temporary_rect = 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;
|
MtkRectangle old_rect;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user