Skip to content

Commit

Permalink
constraints: Allow resize of windows moved above screen
Browse files Browse the repository at this point in the history
If the titlebar of a window has been moved above the screen by a user
via an unconstrained move, then any constrained user resize following
this move will cause the window to jump below the top of the screen or
cause other glitchy behavior.

This commit removes the constraint that the titlebar of a window must be
below the top of the screen for any resize that is both (1) triggered by
a user and (2) is a resize that affects only the left, right, or bottom
edges of the window.  This allows users to move a window partially above
the screen and then resize the window to be wider or resize the bottom
edge of the window to make it taller or shorter.

This is a backport of 5ba364a9476905d9b92e7dc6cdc2f273bcda2498.
  • Loading branch information
jknockel committed Jun 28, 2024
1 parent 9aefdd4 commit 6f6fe76
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions src/core/constraints.c
Original file line number Diff line number Diff line change
Expand Up @@ -1720,6 +1720,7 @@ constrain_titlebar_visible (MetaWindow *window,
gboolean check_only)
{
gboolean unconstrained_user_action;
gboolean user_nonnorthern_resize;
gboolean retval;
int bottom_amount;
int horiz_amount_offscreen, vert_amount_offscreen;
Expand All @@ -1734,6 +1735,18 @@ constrain_titlebar_visible (MetaWindow *window,
unconstrained_user_action =
info->is_user_action && !window->display->grab_frame_action;

/* If the user is resizing anything other than the top, then don't check if
* the titlebar is beyond the top of the screen. This resize might be
* immediately following an unconstrained move or unconstrained resize that
* placed the titlebar above the top of the screen, in which case we don't
* want the titlebar immediately popping back below the screen or other
* glitching (https://gitlab.gnome.org/GNOME/mutter/-/issues/1206).
*/
user_nonnorthern_resize =
info->is_user_action &&
meta_grab_op_is_resizing (window->display->grab_op) &&
info->orig.y == info->current.y;

/* Exit early if we know the constraint won't apply--note that this constraint
* is only meant for normal windows (e.g. we don't want docks to be shoved
* "onscreen" by their own strut).
Expand All @@ -1743,6 +1756,7 @@ constrain_titlebar_visible (MetaWindow *window,
window->fullscreen ||
!window->require_titlebar_visible ||
unconstrained_user_action ||
user_nonnorthern_resize ||
meta_window_get_placement_rule (window))
return TRUE;

Expand Down

0 comments on commit 6f6fe76

Please sign in to comment.