summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>2017-01-18 15:37:57 +0200
committerDaniel Stone <daniels@collabora.com>2017-04-13 11:34:36 +0100
commitad0da4596d6315b18e888af75eee0a9bad1ff44d (patch)
tree8fda3c2012a35b0f1f8b46c20b4aab2125a909c8
parent552e4c4309221eb01edadaea1d25b031680a1a33 (diff)
xwm: do not draw decor twice on map
Normal windows enter the MapRequest handler, which schedules drawing the decorations. Then Xwayland realizes the window, which ends with a call to xserver_map_shell_surface(). The decorations are already drawn, no need to draw them a second time. However, MapRequest handler could not set the pending state because the weston_surface did not exist at the time, because it gets created only when Xwayland realizes the window, which happens after XWM has forwarded the MapWindow in MapRequest handler. Therefore set the pending state explicitly at the end. Scheduling had it done much later anyway. Now that the pending state is set much earlier, it seems to be more likely that it gets set before Xwayland's first commit is handled. This means that -geometry command line option of X11 apps already takes the geometry (decorations) into account. I do not think it is reliable yet, though. There is still the race between Xwayland committing and XWM setting the pending state assuming the very next commit latches it in appropriately. The race exists not because of Wayland, but because WL_SURFACE_ID comes via X11, and could be processed after wl_compositor.create_surface and wl_surface.commit. That commit/pending race is solved by a following patch. For override-redirect windows weston_wm_window_schedule_repaint() reduced into a call to weston_wm_window_set_pending_state_OR(), so we can just call that directly. It should not matter that the call is moved to the end of the function. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Reviewed-by: Louis-Francis Ratté-Boulianne <lfrb@collabora.com> Acked-by: Daniel Stone <daniels@collabora.com>
-rw-r--r--xwayland/window-manager.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
index d40d56ea..ac875a33 100644
--- a/xwayland/window-manager.c
+++ b/xwayland/window-manager.c
@@ -2681,8 +2681,6 @@ xserver_map_shell_surface(struct weston_wm_window *window,
wl_signal_add(&window->surface->destroy_signal,
&window->surface_destroy_listener);
- weston_wm_window_schedule_repaint(window);
-
if (!xwayland_interface)
return;
@@ -2742,6 +2740,11 @@ xserver_map_shell_surface(struct weston_wm_window *window,
xwayland_interface->set_toplevel(window->shsurf);
}
}
+
+ if (window->frame_id == XCB_WINDOW_NONE)
+ weston_wm_window_set_pending_state_OR(window);
+ else
+ weston_wm_window_set_pending_state(window);
}
const struct weston_xwayland_surface_api surface_api = {