Commit f568968f authored by Olivier Fourdan's avatar Olivier Fourdan Committed by Daniel Stone

xwm: Use Xwayland allow commits for repaint

Initially, `_XWAYLAND_ALLOW_COMMITS` was introduced in commit 7ace831c
to avoid drawing the window content before it's ready to be shown.

But a repaint might also be triggered by the client damages before the
XWM has finished drawing its window decorations and drop shadows, which
previously was not too much of an issue since the XWM could still
finish updating the X11 window after the buffer was submitted.

However, with the addition of multiple window buffers in Xwayland [1]
which are aimed at preventing the X11 clients from updating the buffer
after it's been committed, this is no longer possible.

As a result, the use of multiple window buffers in Xwayland can cause
ugly repainting effects of the decorations if the buffer is submitted
before the XWM has finished painting its decorations.

Use the X11 property `_XWAYLAND_ALLOW_COMMITS` can be used to avoid
this, by controlling when Xwayland should commit changes to the Wayland

[1] xorg/xserver!316Signed-off-by: default avatarOlivier Fourdan <>
parent 3025353e
......@@ -175,6 +175,9 @@ struct weston_wm_window {
struct wl_list link;
static void
weston_wm_window_set_allow_commits(struct weston_wm_window *window, bool allow);
static struct weston_wm_window *
get_wm_window(struct weston_surface *surface);
......@@ -739,8 +742,10 @@ weston_wm_handle_configure_request(struct weston_wm *wm, xcb_generic_event_t *ev
if (configure_request->value_mask & XCB_CONFIG_WINDOW_HEIGHT)
window->height = configure_request->height;
if (window->frame)
if (window->frame) {
weston_wm_window_set_allow_commits(window, false);
frame_resize_inside(window->frame, window->width, window->height);
weston_wm_window_get_child_position(window, &x, &y);
values[i++] = x;
......@@ -958,6 +963,7 @@ weston_wm_window_set_allow_commits(struct weston_wm_window *window, bool allow)
32, /* format */
1, property);
......@@ -1306,10 +1312,12 @@ weston_wm_window_do_repaint(void *data)
window->repaint_source = NULL;
weston_wm_window_set_allow_commits(window, false);
weston_wm_window_set_allow_commits(window, true);
static void
......@@ -2630,6 +2638,8 @@ weston_wm_window_configure(void *data)
uint32_t values[4];
int x, y, width, height;
weston_wm_window_set_allow_commits(window, false);
weston_wm_window_get_child_position(window, &x, &y);
values[0] = x;
values[1] = y;
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