Commit 77a6d95a authored by Pekka Paalanen's avatar Pekka Paalanen

shell: implement set_xwayland_position

Store the initial xwayland position explicitly in struct shell_surface.
New variables are needed, because e.g. saved_x, saved_y are the view
position, and to compute that we need the window geometry, which is not
available before the first commit, so it's not available at
set_xwayland_position() time.

Regression: kcachegrind (Qt 4, X11), the first menu invocation will
slightly misplace the menu if the window has not been manually moved.

Problem: geometry is not taken into account due to a race between XWM
drawing decorations and Xwayland committing the first buffer.

Use the same debugging guard as XWM.

v3: merged with "desktop-shell: debug set_position_from_xwayland"
Signed-off-by: Pekka Paalanen's avatarPekka Paalanen <>
Reviewed-by: Quentin Glidic's avatarQuentin Glidic <>
Reviewed-by: Daniel Stone's avatarDaniel Stone <>
parent 882aff09
......@@ -134,6 +134,12 @@ struct shell_surface {
bool lowered;
} state;
struct {
bool is_set;
int32_t x;
int32_t y;
} xwayland;
int focus_count;
bool destroying;
......@@ -2385,6 +2391,28 @@ set_maximized_position(struct desktop_shell *shell,
area.y - geometry.y);
static void
set_position_from_xwayland(struct shell_surface *shsurf)
struct weston_geometry geometry;
float x;
float y;
geometry = weston_desktop_surface_get_geometry(shsurf->desktop_surface);
x = shsurf->xwayland.x - geometry.x;
y = shsurf->xwayland.y - geometry.y;
weston_view_set_position(shsurf->view, x, y);
#ifdef WM_DEBUG
weston_log("%s: XWM %d, %d; geometry %d, %d; view %f, %f\n",
__func__, shsurf->xwayland.x, shsurf->xwayland.y,
geometry.x, geometry.y, x, y);
static void
map(struct desktop_shell *shell, struct shell_surface *shsurf,
int32_t sx, int32_t sy)
......@@ -2400,6 +2428,8 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf,
} else if (shsurf->state.maximized) {
set_maximized_position(shell, shsurf);
} else if (shsurf->xwayland.is_set) {
} else {
weston_view_set_initial_position(shsurf->view, shell);
......@@ -2784,6 +2814,18 @@ desktop_surface_pong(struct weston_desktop_client *desktop_client,
end_busy_cursor(shell->compositor, desktop_client);
static void
desktop_surface_set_xwayland_position(struct weston_desktop_surface *surface,
int32_t x, int32_t y, void *shell_)
struct shell_surface *shsurf =
shsurf->xwayland.x = x;
shsurf->xwayland.y = y;
shsurf->xwayland.is_set = true;
static const struct weston_desktop_api shell_desktop_api = {
.struct_size = sizeof(struct weston_desktop_api),
.surface_added = desktop_surface_added,
......@@ -2796,6 +2838,7 @@ static const struct weston_desktop_api shell_desktop_api = {
.minimized_requested = desktop_surface_minimized_requested,
.ping_timeout = desktop_surface_ping_timeout,
.pong = desktop_surface_pong,
.set_xwayland_position = desktop_surface_set_xwayland_position,
/* ************************ *
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment