Merge branch 'csd' into 'master'

tinywl: stabilize resize from top-left edges

See merge request wlroots/wlroots!5393
This commit is contained in:
YaoBing Xiao 2026-06-14 00:01:41 +08:00
commit 20ad914c4a

View file

@ -399,6 +399,30 @@ static void process_cursor_move(struct tinywl_server *server) {
server->cursor->y - server->grab_y);
}
static void update_resize_position(struct tinywl_toplevel *toplevel) {
struct tinywl_server *server = toplevel->server;
if (server->cursor_mode != TINYWL_CURSOR_RESIZE ||
server->grabbed_toplevel != toplevel) {
return;
}
struct wlr_box *geo_box = &toplevel->xdg_toplevel->base->geometry;
int lx = server->grab_geobox.x;
int ly = server->grab_geobox.y;
if (server->resize_edges & WLR_EDGE_LEFT) {
lx = server->grab_geobox.x + server->grab_geobox.width -
geo_box->width;
}
if (server->resize_edges & WLR_EDGE_TOP) {
ly = server->grab_geobox.y + server->grab_geobox.height -
geo_box->height;
}
wlr_scene_node_set_position(&toplevel->scene_tree->node,
lx - geo_box->x, ly - geo_box->y);
}
static void process_cursor_resize(struct tinywl_server *server) {
/*
* Resizing the grabbed toplevel can be a little bit complicated, because we
@ -406,9 +430,8 @@ static void process_cursor_resize(struct tinywl_server *server) {
* toplevel on one or two axes, but can also move the toplevel if you resize
* from the top or left edges (or top-left corner).
*
* Note that some shortcuts are taken here. In a more fleshed-out
* compositor, you'd wait for the client to prepare a buffer at the new
* size, then commit any movement that was prepared.
* Movement is applied on commit so that surfaces which quantize their size
* can keep the unmoved edge stable.
*/
struct tinywl_toplevel *toplevel = server->grabbed_toplevel;
double border_x = server->cursor->x - server->grab_x;
@ -441,10 +464,6 @@ static void process_cursor_resize(struct tinywl_server *server) {
}
}
struct wlr_box *geo_box = &toplevel->xdg_toplevel->base->geometry;
wlr_scene_node_set_position(&toplevel->scene_tree->node,
new_left - geo_box->x, new_top - geo_box->y);
int new_width = new_right - new_left;
int new_height = new_bottom - new_top;
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, new_width, new_height);
@ -701,7 +720,10 @@ static void xdg_toplevel_commit(struct wl_listener *listener, void *data) {
* configures the xdg_toplevel with 0,0 size to let the client pick the
* dimensions itself. */
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, 0, 0);
return;
}
update_resize_position(toplevel);
}
static void xdg_toplevel_destroy(struct wl_listener *listener, void *data) {