diff options
author | emersion <contact@emersion.fr> | 2018-04-05 18:48:35 -0400 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2018-04-05 18:48:35 -0400 |
commit | 641807d920854fdecc1307bd809c198db1a7dff1 (patch) | |
tree | a275dc0046e90f7b2eb4ee3195e9f44976757165 /sway | |
parent | d65d001aa55c71f67a35c8ce78d3cb3f7f5fd65e (diff) |
Handle unmanaged surfaces motion
Diffstat (limited to 'sway')
-rw-r--r-- | sway/desktop/output.c | 13 | ||||
-rw-r--r-- | sway/desktop/xwayland.c | 22 | ||||
-rw-r--r-- | sway/input/cursor.c | 14 |
3 files changed, 29 insertions, 20 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c index a7f40ef8..aa18f1b8 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -267,17 +267,14 @@ static void render_output(struct sway_output *output, struct timespec *when, // render unmanaged views on top struct wl_list *unmanaged = &root_container.sway_root->xwayland_unmanaged; - struct sway_xwayland_unmanaged *sway_surface; - wl_list_for_each(sway_surface, unmanaged, link) { + struct sway_xwayland_unmanaged *unmanaged_surface; + wl_list_for_each(unmanaged_surface, unmanaged, link) { struct wlr_xwayland_surface *xsurface = - sway_surface->wlr_xwayland_surface; - if (xsurface->surface == NULL) { - continue; - } + unmanaged_surface->wlr_xwayland_surface; const struct wlr_box view_box = { - .x = xsurface->x, - .y = xsurface->y, + .x = unmanaged_surface->lx, + .y = unmanaged_surface->ly, .width = xsurface->width, .height = xsurface->height, }; diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 4797b801..e3da1da7 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -29,19 +29,35 @@ static void unmanaged_handle_commit(struct wl_listener *listener, void *data) { struct sway_xwayland_unmanaged *surface = wl_container_of(listener, surface, commit); struct wlr_xwayland_surface *xsurface = surface->wlr_xwayland_surface; - desktop_damage_from_surface(xsurface->surface, xsurface->x, xsurface->y); - // TODO: handle window motion + + if (xsurface->x != surface->lx || xsurface->y != surface->ly) { + // Surface has moved + desktop_damage_whole_surface(xsurface->surface, + surface->lx, surface->ly); + surface->lx = xsurface->x; + surface->ly = xsurface->y; + desktop_damage_whole_surface(xsurface->surface, + surface->lx, surface->ly); + } else { + desktop_damage_from_surface(xsurface->surface, + xsurface->x, xsurface->y); + } } static void unmanaged_handle_map(struct wl_listener *listener, void *data) { struct sway_xwayland_unmanaged *surface = wl_container_of(listener, surface, map); struct wlr_xwayland_surface *xsurface = surface->wlr_xwayland_surface; + wl_list_insert(&root_container.sway_root->xwayland_unmanaged, &surface->link); + wl_signal_add(&xsurface->surface->events.commit, &surface->commit); surface->commit.notify = unmanaged_handle_commit; - desktop_damage_whole_surface(xsurface->surface, xsurface->x, xsurface->y); + + surface->lx = xsurface->x; + surface->ly = xsurface->y; + desktop_damage_whole_surface(xsurface->surface, surface->lx, surface->ly); } static void unmanaged_handle_unmap(struct wl_listener *listener, void *data) { diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 195ddce9..b83bc9fe 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -48,17 +48,13 @@ static struct sway_container *container_at_cursor(struct sway_cursor *cursor, struct wlr_surface **surface, double *sx, double *sy) { // check for unmanaged views first struct wl_list *unmanaged = &root_container.sway_root->xwayland_unmanaged; - struct sway_xwayland_unmanaged *sway_surface; - wl_list_for_each_reverse(sway_surface, unmanaged, link) { + struct sway_xwayland_unmanaged *unmanaged_surface; + wl_list_for_each_reverse(unmanaged_surface, unmanaged, link) { struct wlr_xwayland_surface *xsurface = - sway_surface->wlr_xwayland_surface; - if (xsurface->surface == NULL) { - continue; - } - + unmanaged_surface->wlr_xwayland_surface; struct wlr_box box = { - .x = xsurface->x, - .y = xsurface->y, + .x = unmanaged_surface->lx, + .y = unmanaged_surface->ly, .width = xsurface->width, .height = xsurface->height, }; |