[weston,v3,1/3] xwm: do not draw decor twice on map

Louis-Francis Ratté-Boulianne lfrb at collabora.com
Tue Apr 11 16:56:27 UTC 2017


On Wed, 2017-01-18 at 15:37 +0200, Pekka Paalanen wrote:
> From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> 
> 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 at collabora.co.uk>

Reviewed-by: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>

> ---
>  xwayland/window-manager.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
> index d40d56e..ac875a3 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 = {


More information about the wayland-devel mailing list