aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/xwayland.h1
-rw-r--r--xwayland/xwm.c19
2 files changed, 16 insertions, 4 deletions
diff --git a/include/wlr/xwayland.h b/include/wlr/xwayland.h
index 26a14aea..b801b5dd 100644
--- a/include/wlr/xwayland.h
+++ b/include/wlr/xwayland.h
@@ -198,6 +198,7 @@ struct wlr_xwayland_surface {
struct wl_signal set_hints;
struct wl_signal set_decorations;
struct wl_signal set_override_redirect;
+ struct wl_signal set_geometry;
struct wl_signal ping_timeout;
} events;
diff --git a/xwayland/xwm.c b/xwayland/xwm.c
index b3e6c885..b53759da 100644
--- a/xwayland/xwm.c
+++ b/xwayland/xwm.c
@@ -164,6 +164,7 @@ static struct wlr_xwayland_surface *xwayland_surface_create(
wl_signal_init(&surface->events.set_decorations);
wl_signal_init(&surface->events.set_override_redirect);
wl_signal_init(&surface->events.ping_timeout);
+ wl_signal_init(&surface->events.set_geometry);
xcb_get_geometry_reply_t *geometry_reply =
xcb_get_geometry_reply(xwm->xcb_conn, geometry_cookie, NULL);
@@ -935,15 +936,25 @@ static void xwm_handle_configure_notify(struct wlr_xwm *xwm,
return;
}
- xsurface->x = ev->x;
- xsurface->y = ev->y;
- xsurface->width = ev->width;
- xsurface->height = ev->height;
+ bool geometry_changed =
+ (xsurface->x != ev->x || xsurface->y != ev->y ||
+ xsurface->width != ev->width || xsurface->height != ev->height);
+
+ if (geometry_changed) {
+ xsurface->x = ev->x;
+ xsurface->y = ev->y;
+ xsurface->width = ev->width;
+ xsurface->height = ev->height;
+ }
if (xsurface->override_redirect != ev->override_redirect) {
xsurface->override_redirect = ev->override_redirect;
wlr_signal_emit_safe(&xsurface->events.set_override_redirect, xsurface);
}
+
+ if (geometry_changed) {
+ wlr_signal_emit_safe(&xsurface->events.set_geometry, NULL);
+ }
}
#define ICCCM_WITHDRAWN_STATE 0