|
|
|
@ -4596,70 +4596,34 @@ meta_window_move_resize_internal (MetaWindow *window,
|
|
|
|
|
root_x_nw = new_rect.x;
|
|
|
|
|
root_y_nw = new_rect.y;
|
|
|
|
|
|
|
|
|
|
/* First, save where we would like the client to be. This is used by the next
|
|
|
|
|
* attach to determine if the client is really moving/resizing or not.
|
|
|
|
|
*/
|
|
|
|
|
window->expected_rect = new_rect;
|
|
|
|
|
|
|
|
|
|
if (is_wayland_resize)
|
|
|
|
|
{
|
|
|
|
|
/* This is a call to wl_surface_commit(), ignore the new_rect and
|
|
|
|
|
* update the real client size to match the buffer size.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
window->rect.width = w;
|
|
|
|
|
window->rect.height = h;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (new_rect.width != window->rect.width ||
|
|
|
|
|
new_rect.height != window->rect.height)
|
|
|
|
|
{
|
|
|
|
|
/* We need to resize the client. Resizing is in two parts:
|
|
|
|
|
* some of the movement happens immediately, and some happens as part
|
|
|
|
|
* of the resizing (through dx/dy in wl_surface_attach).
|
|
|
|
|
*
|
|
|
|
|
* To do so, we need to compute the resize from the point of the view
|
|
|
|
|
* of the client, and then adjust the immediate resize to match.
|
|
|
|
|
*
|
|
|
|
|
* dx/dy are the values we expect from the new attach(), while deltax/
|
|
|
|
|
* deltay reflect the overall movement.
|
|
|
|
|
*/
|
|
|
|
|
MetaRectangle client_rect;
|
|
|
|
|
int dx, dy;
|
|
|
|
|
int deltax, deltay;
|
|
|
|
|
if (!is_wayland_resize)
|
|
|
|
|
meta_wayland_surface_configure_notify (window->surface,
|
|
|
|
|
new_rect.width,
|
|
|
|
|
new_rect.height);
|
|
|
|
|
|
|
|
|
|
meta_rectangle_resize_with_gravity (&old_rect,
|
|
|
|
|
&client_rect,
|
|
|
|
|
&new_rect,
|
|
|
|
|
gravity,
|
|
|
|
|
new_rect.width,
|
|
|
|
|
new_rect.height);
|
|
|
|
|
|
|
|
|
|
deltax = new_rect.x - old_rect.x;
|
|
|
|
|
deltay = new_rect.y - old_rect.y;
|
|
|
|
|
dx = client_rect.x - old_rect.x;
|
|
|
|
|
dy = client_rect.y - old_rect.y;
|
|
|
|
|
if (window->rect.width != new_rect.width ||
|
|
|
|
|
window->rect.height != new_rect.height)
|
|
|
|
|
need_resize_client = TRUE;
|
|
|
|
|
|
|
|
|
|
if (deltax != dx || deltay != dy)
|
|
|
|
|
need_move_client = TRUE;
|
|
|
|
|
|
|
|
|
|
window->rect.x += (deltax - dx);
|
|
|
|
|
window->rect.y += (deltay - dy);
|
|
|
|
|
|
|
|
|
|
need_resize_client = TRUE;
|
|
|
|
|
meta_wayland_surface_configure_notify (window->surface,
|
|
|
|
|
new_rect.width,
|
|
|
|
|
new_rect.height);
|
|
|
|
|
window->rect.width = new_rect.width;
|
|
|
|
|
window->rect.height = new_rect.height;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* No resize happening, we can just move the window and live with it. */
|
|
|
|
|
if (window->rect.x != new_rect.x ||
|
|
|
|
|
window->rect.y != new_rect.y)
|
|
|
|
|
need_move_client = TRUE;
|
|
|
|
|
|
|
|
|
|
window->rect.x = new_rect.x;
|
|
|
|
|
window->rect.y = new_rect.y;
|
|
|
|
|
}
|
|
|
|
|
if (window->rect.x != new_rect.x ||
|
|
|
|
|
window->rect.y != new_rect.y)
|
|
|
|
|
need_move_client = TRUE;
|
|
|
|
|
|
|
|
|
|
window->rect.x = new_rect.x;
|
|
|
|
|
window->rect.y = new_rect.y;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -5071,13 +5035,12 @@ meta_window_move_resize_wayland (MetaWindow *window,
|
|
|
|
|
|
|
|
|
|
flags = META_IS_WAYLAND_RESIZE;
|
|
|
|
|
|
|
|
|
|
meta_window_get_position (window, &x, &y);
|
|
|
|
|
x += dx; y += dy;
|
|
|
|
|
x = window->rect.x + dx;
|
|
|
|
|
y = window->rect.y + dy;
|
|
|
|
|
|
|
|
|
|
if (x != window->expected_rect.x || y != window->expected_rect.y)
|
|
|
|
|
if (dx != 0 || dy != 0)
|
|
|
|
|
flags |= META_IS_MOVE_ACTION;
|
|
|
|
|
if (width != window->expected_rect.width ||
|
|
|
|
|
height != window->expected_rect.height)
|
|
|
|
|
if (width != window->rect.width || height != window->rect.height)
|
|
|
|
|
flags |= META_IS_RESIZE_ACTION;
|
|
|
|
|
|
|
|
|
|
meta_window_move_resize_internal (window, flags, NorthWestGravity,
|
|
|
|
|