xwm: use _XWAYLAND_ALLOW_COMMITS
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>
Wed, 18 Jan 2017 13:37:58 +0000 (15:37 +0200)
committerDaniel Stone <daniels@collabora.com>
Thu, 13 Apr 2017 10:35:02 +0000 (11:35 +0100)
This patch uses the new feature proposed for Xwayland in the patch
series https://patchwork.freedesktop.org/series/16610/ .

When the frame window is created, immediately forbid Xwayland commits on
it. This prevents commits before the decorations have been drawn and the
initial pending state has been set. Commits are enabled right after
drawing and setting.

This ensures that the decorations are fully drawn when a window is
mapped. This also solves the initial commit/pending race, but the race
is on again after mapping.

If Xwayland does not implement the needed support, we are just setting a
window property with no effect.

This patch is the final piece for solving T7622, excluding the
_NET_WM_SYNC_REQUEST handling.

Task: https://phabricator.freedesktop.org/T7622
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>
xwayland/window-manager.c
xwayland/xwayland.h

index ac875a339a92b13b8f0d0f88b781ea66e63231dc..260807593d7b0a37bbe8597c0d91d4bc03b0f5bf 100644 (file)
@@ -873,6 +873,37 @@ weston_wm_window_activate(struct wl_listener *listener, void *data)
 
 }
 
+/** Control Xwayland wl_surface.commit behaviour
+ *
+ * This function sets the "_XWAYLAND_ALLOW_COMMITS" property of the frame window
+ * (not the content window!) to \p allow.
+ *
+ * If the property is set to \c true, Xwayland will commit whenever it likes.
+ * If the property is set to \c false, Xwayland will not commit.
+ * If the property is not set at all, Xwayland assumes it is \c true.
+ *
+ * \param window The XWM window to control.
+ * \param allow Whether Xwayland is allowed to wl_surface.commit for the window.
+ */
+static void
+weston_wm_window_set_allow_commits(struct weston_wm_window *window, bool allow)
+{
+       struct weston_wm *wm = window->wm;
+       uint32_t property[1];
+
+       assert(window->frame_id != XCB_WINDOW_NONE);
+
+       property[0] = allow ? 1 : 0;
+
+       xcb_change_property(wm->conn,
+                           XCB_PROP_MODE_REPLACE,
+                           window->frame_id,
+                           wm->atom.allow_commits,
+                           XCB_ATOM_CARDINAL,
+                           32, /* format */
+                           1, property);
+}
+
 #define ICCCM_WITHDRAWN_STATE  0
 #define ICCCM_NORMAL_STATE     1
 #define ICCCM_ICONIC_STATE     3
@@ -1048,6 +1079,7 @@ weston_wm_handle_map_request(struct weston_wm *wm, xcb_generic_event_t *event)
               window->width, window->height,
               window->map_request_x, window->map_request_y);
 
+       weston_wm_window_set_allow_commits(window, false);
        weston_wm_window_set_wm_state(window, ICCCM_NORMAL_STATE);
        weston_wm_window_set_net_wm_state(window);
        weston_wm_window_set_virtual_desktop(window, 0);
@@ -2220,6 +2252,7 @@ weston_wm_get_resources(struct weston_wm *wm)
                { "XdndFinished",       F(atom.xdnd_finished) },
                { "XdndTypeList",       F(atom.xdnd_type_list) },
                { "XdndActionCopy",     F(atom.xdnd_action_copy) },
+               { "_XWAYLAND_ALLOW_COMMITS",    F(atom.allow_commits) },
                { "WL_SURFACE_ID",      F(atom.wl_surface_id) }
        };
 #undef F
@@ -2741,10 +2774,13 @@ xserver_map_shell_surface(struct weston_wm_window *window,
                }
        }
 
-       if (window->frame_id == XCB_WINDOW_NONE)
+       if (window->frame_id == XCB_WINDOW_NONE) {
                weston_wm_window_set_pending_state_OR(window);
-       else
+       } else {
                weston_wm_window_set_pending_state(window);
+               weston_wm_window_set_allow_commits(window, true);
+               xcb_flush(wm->conn);
+       }
 }
 
 const struct weston_xwayland_surface_api surface_api = {
index b1225f5a7edff76f9b92ed5776706dffd58b759b..ca75f5b7c787822ba318ba655985c62e8fb6d7e9 100644 (file)
@@ -154,6 +154,7 @@ struct weston_wm {
                xcb_atom_t               xdnd_type_list;
                xcb_atom_t               xdnd_action_copy;
                xcb_atom_t               wl_surface_id;
+               xcb_atom_t               allow_commits;
        } atom;
 };