aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/tree/view.h2
-rw-r--r--sway/desktop/output.c13
-rw-r--r--sway/desktop/xwayland.c22
-rw-r--r--sway/input/cursor.c14
4 files changed, 31 insertions, 20 deletions
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h
index faf38bdf..03d27ceb 100644
--- a/include/sway/tree/view.h
+++ b/include/sway/tree/view.h
@@ -87,6 +87,8 @@ struct sway_xwayland_unmanaged {
struct wlr_xwayland_surface *wlr_xwayland_surface;
struct wl_list link;
+ int lx, ly;
+
struct wl_listener request_configure;
struct wl_listener commit;
struct wl_listener map;
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,
};