xwm: Fix transform listener
The coordinate transformation was broken (worked for first output where
output->x/y was 0,0, broke on all other outputs). We can just use
surface->geometry.x/y directly. We can't use the full transformation,
the best we can do is to move the X window to the geometry.x/y location.
Get rid of the static old_sx/sy hack as well.
diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
index a18bb0e..3d36f70 100644
--- a/src/xwayland/window-manager.c
+++ b/src/xwayland/window-manager.c
@@ -647,11 +647,7 @@
struct weston_wm_window *window = get_wm_window(surface);
struct weston_wm *wm =
container_of(listener, struct weston_wm, transform_listener);
- struct weston_output *output = surface->output;
uint32_t mask, values[2];
- float sxf, syf;
- int sx, sy;
- static int old_sx = -1, old_sy = -1;
if (!window || !wm)
return;
@@ -659,24 +655,15 @@
if (!weston_surface_is_mapped(surface))
return;
- weston_surface_to_global_float(surface, output->x, output->y,
- &sxf, &syf);
+ if (window->x != surface->geometry.x ||
+ window->y != surface->geometry.y) {
+ values[0] = surface->geometry.x;
+ values[1] = surface->geometry.y;
+ mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y;
- sx = (int) sxf;
- sy = (int) syf;
-
- if (old_sx == sx && old_sy == sy)
- return;
-
- values[0] = sx;
- values[1] = sy;
- mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y;
-
- xcb_configure_window(wm->conn, window->frame_id, mask, values);
- xcb_flush(wm->conn);
-
- old_sx = sx;
- old_sy = sy;
+ xcb_configure_window(wm->conn, window->frame_id, mask, values);
+ xcb_flush(wm->conn);
+ }
}
#define ICCCM_WITHDRAWN_STATE 0