diff --git a/include/labwc.h b/include/labwc.h index 7dd863bd..0af693ea 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -365,6 +365,7 @@ struct view { struct xwayland_unmanaged { struct server *server; struct wlr_xwayland_surface *xwayland_surface; + struct wlr_scene_node *node; struct wl_list link; int lx, ly; diff --git a/src/xwayland-unmanaged.c b/src/xwayland-unmanaged.c index 68fe4a0a..fae8d0ba 100644 --- a/src/xwayland-unmanaged.c +++ b/src/xwayland-unmanaged.c @@ -20,6 +20,8 @@ unmanaged_handle_commit(struct wl_listener *listener, void *data) struct wlr_xwayland_surface *xsurface = unmanaged->xwayland_surface; unmanaged->lx = xsurface->x; unmanaged->ly = xsurface->y; + wlr_scene_node_set_position(unmanaged->node, + unmanaged->lx, unmanaged->ly); } static void @@ -59,10 +61,11 @@ unmanaged_handle_map(struct wl_listener *listener, void *data) } /* node will be destroyed automatically once surface is destroyed */ - struct wlr_scene_node *node = &wlr_scene_surface_create( + unmanaged->node = &wlr_scene_surface_create( unmanaged->server->unmanaged_tree, xsurface->surface)->buffer->node; - wlr_scene_node_set_position(node, unmanaged->lx, unmanaged->ly); + wlr_scene_node_set_position(unmanaged->node, + unmanaged->lx, unmanaged->ly); } static void diff --git a/src/xwayland.c b/src/xwayland.c index 1efd4415..37cf4c0e 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -144,6 +144,13 @@ handle_request_configure(struct wl_listener *listener, void *data) int height = event->height; view_adjust_size(view, &width, &height); + view->pending_move_resize.update_x = event->x != view->x; + view->pending_move_resize.update_y = event->y != view->y; + view->pending_move_resize.x = event->x; + view->pending_move_resize.y = event->y; + view->pending_move_resize.width = width; + view->pending_move_resize.height = height; + wlr_xwayland_surface_configure(view->xwayland_surface, event->x, event->y, width, height); } @@ -216,6 +223,13 @@ move(struct view *view, double x, double y) { view->x = x; view->y = y; + + /* override any previous pending move */ + view->pending_move_resize.update_x = false; + view->pending_move_resize.update_y = false; + view->pending_move_resize.x = x; + view->pending_move_resize.y = y; + struct wlr_xwayland_surface *s = view->xwayland_surface; wlr_xwayland_surface_configure(s, (int16_t)x, (int16_t)y, (uint16_t)s->width, (uint16_t)s->height);