diff --git a/clients/window.c b/clients/window.c index 7eb2cdcc..2026b6d9 100644 --- a/clients/window.c +++ b/clients/window.c @@ -3851,12 +3851,10 @@ handle_surface_ping(void *data, struct xdg_surface *xdg_surface, uint32_t serial static void handle_surface_configure(void *data, struct xdg_surface *xdg_surface, - uint32_t edges, int32_t width, int32_t height) + int32_t width, int32_t height) { struct window *window = data; - window->resize_edges = edges; - window_schedule_resize(window, width, height); } diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index e7e31b0a..b9b49cb5 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -134,6 +134,7 @@ struct shell_surface { bool saved_size_valid; bool saved_rotation_valid; int unresponsive, grabbed; + uint32_t resize_edges; struct { struct weston_transform transform; @@ -347,6 +348,7 @@ shell_grab_end(struct shell_grab *grab) if (grab->shsurf) { wl_list_remove(&grab->shsurf_destroy_listener.link); grab->shsurf->grabbed = 0; + grab->shsurf->resize_edges = 0; } weston_pointer_end_grab(grab->grab.pointer); @@ -1691,6 +1693,7 @@ surface_resize(struct shell_surface *shsurf, surface_subsurfaces_boundingbox(shsurf->surface, NULL, NULL, &resize->width, &resize->height); + shsurf->resize_edges = edges; shell_grab_start(&resize->base, &resize_grab_interface, shsurf, seat->pointer, edges); @@ -3327,7 +3330,7 @@ xdg_send_configure(struct weston_surface *surface, assert(shsurf); - xdg_surface_send_configure(shsurf->resource, edges, width, height); + xdg_surface_send_configure(shsurf->resource, width, height); } static const struct weston_shell_client xdg_client = { @@ -4837,11 +4840,22 @@ shell_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy) } else if (type_changed || sx != 0 || sy != 0 || shsurf->last_width != es->width || shsurf->last_height != es->height) { - shsurf->last_width = es->width; - shsurf->last_height = es->height; float from_x, from_y; float to_x, to_y; + if (shsurf->resize_edges) { + sx = 0; + sy = 0; + } + + if (shsurf->resize_edges & WL_SHELL_SURFACE_RESIZE_LEFT) + sx = shsurf->last_width - es->width; + if (shsurf->resize_edges & WL_SHELL_SURFACE_RESIZE_TOP) + sy = shsurf->last_height - es->height; + + shsurf->last_width = es->width; + shsurf->last_height = es->height; + weston_view_to_global_float(shsurf->view, 0, 0, &from_x, &from_y); weston_view_to_global_float(shsurf->view, sx, sy, &to_x, &to_y); configure(shell, es, diff --git a/protocol/xdg-shell.xml b/protocol/xdg-shell.xml index 4e5cff8d..851b2ceb 100644 --- a/protocol/xdg-shell.xml +++ b/protocol/xdg-shell.xml @@ -230,7 +230,6 @@ in surface local coordinates. -