mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 01:20:42 -05:00
wayland: update location prior to maximize
When maximizing a window, the previous location is saved so that un-maximize would restore the same original window location. However, if a Wayland client starts with a window maximized, the previous location will be 0x0, so if we have to force placement in xdg_toplevel_set_maximized(), we should update the location as well so that the window is placed on the right monitor when un-maximizing. For that purpose, add a new flag to force the update of the window location, and use that flag from xdg_toplevel_set_maximized(). https://bugzilla.gnome.org/show_bug.cgi?id=783901
This commit is contained in:
parent
6cf7d2d47f
commit
5f05112b9a
@ -80,6 +80,7 @@ typedef enum
|
||||
META_MOVE_RESIZE_WAYLAND_RESIZE = 1 << 4,
|
||||
META_MOVE_RESIZE_STATE_CHANGED = 1 << 5,
|
||||
META_MOVE_RESIZE_UNMAXIMIZE = 1 << 6,
|
||||
META_MOVE_RESIZE_FORCE_MOVE = 1 << 7,
|
||||
} MetaMoveResizeFlags;
|
||||
|
||||
typedef enum
|
||||
@ -792,7 +793,8 @@ void meta_window_emit_size_changed (MetaWindow *window);
|
||||
|
||||
MetaPlacementRule *meta_window_get_placement_rule (MetaWindow *window);
|
||||
|
||||
void meta_window_force_placement (MetaWindow *window);
|
||||
void meta_window_force_placement (MetaWindow *window,
|
||||
gboolean force_move);
|
||||
|
||||
void meta_window_force_restore_shortcuts (MetaWindow *window,
|
||||
ClutterInputDevice *source);
|
||||
|
@ -1713,7 +1713,7 @@ implement_showing (MetaWindow *window,
|
||||
* see #751887
|
||||
*/
|
||||
if (!window->placed && client_window_should_be_mapped (window))
|
||||
meta_window_force_placement (window);
|
||||
meta_window_force_placement (window, FALSE);
|
||||
|
||||
meta_window_hide (window);
|
||||
}
|
||||
@ -2294,8 +2294,11 @@ window_would_be_covered (const MetaWindow *newbie)
|
||||
}
|
||||
|
||||
void
|
||||
meta_window_force_placement (MetaWindow *window)
|
||||
meta_window_force_placement (MetaWindow *window,
|
||||
gboolean force_move)
|
||||
{
|
||||
MetaMoveResizeFlags flags;
|
||||
|
||||
if (window->placed)
|
||||
return;
|
||||
|
||||
@ -2308,7 +2311,15 @@ meta_window_force_placement (MetaWindow *window)
|
||||
* show the window.
|
||||
*/
|
||||
window->calc_placement = TRUE;
|
||||
meta_window_move_resize_now (window);
|
||||
|
||||
flags = META_MOVE_RESIZE_MOVE_ACTION | META_MOVE_RESIZE_RESIZE_ACTION;
|
||||
if (force_move)
|
||||
flags |= META_MOVE_RESIZE_FORCE_MOVE;
|
||||
|
||||
meta_window_move_resize_internal (window,
|
||||
flags,
|
||||
NorthWestGravity,
|
||||
window->unconstrained_rect);
|
||||
window->calc_placement = FALSE;
|
||||
|
||||
/* don't ever do the initial position constraint thing again.
|
||||
@ -2387,7 +2398,7 @@ meta_window_show (MetaWindow *window)
|
||||
window->maximize_vertically_after_placement = TRUE;
|
||||
}
|
||||
}
|
||||
meta_window_force_placement (window);
|
||||
meta_window_force_placement (window, FALSE);
|
||||
}
|
||||
|
||||
if (needs_stacking_adjustment)
|
||||
|
@ -347,9 +347,10 @@ xdg_toplevel_set_maximized (struct wl_client *client,
|
||||
struct wl_resource *resource)
|
||||
{
|
||||
MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
|
||||
MetaWindow *window = surface->window;
|
||||
|
||||
meta_window_force_placement (surface->window);
|
||||
meta_window_maximize (surface->window, META_MAXIMIZE_BOTH);
|
||||
meta_window_force_placement (window, TRUE);
|
||||
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -232,7 +232,11 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
|
||||
* it can be for maximized or fullscreen.
|
||||
*/
|
||||
|
||||
if (flags & META_MOVE_RESIZE_WAYLAND_RESIZE)
|
||||
if (flags & META_MOVE_RESIZE_FORCE_MOVE)
|
||||
{
|
||||
can_move_now = TRUE;
|
||||
}
|
||||
else if (flags & META_MOVE_RESIZE_WAYLAND_RESIZE)
|
||||
{
|
||||
/* This is a call to wl_surface_commit(), ignore the constrained_rect and
|
||||
* update the real client size to match the buffer size.
|
||||
@ -762,7 +766,7 @@ meta_window_place_with_placement_rule (MetaWindow *window,
|
||||
|
||||
window->unconstrained_rect.width = placement_rule->width;
|
||||
window->unconstrained_rect.height = placement_rule->height;
|
||||
meta_window_force_placement (window);
|
||||
meta_window_force_placement (window, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user