From f5797be8a8d410e22fa6397b2217a6a81858d05c Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Fri, 28 Jul 2023 12:19:06 +0200 Subject: [PATCH] xwayland: batch property requests when handling new window Instead of sending one request, waiting for the reply, and repeating for all properties we're interested in, we can send all property requests in one go and then wait for the server to reply. --- xwayland/xwm.c | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/xwayland/xwm.c b/xwayland/xwm.c index 17123899..6f1a0a2f 100644 --- a/xwayland/xwm.c +++ b/xwayland/xwm.c @@ -834,15 +834,8 @@ char *xwm_get_atom_name(struct wlr_xwm *xwm, xcb_atom_t atom) { } static void read_surface_property(struct wlr_xwm *xwm, - struct wlr_xwayland_surface *xsurface, xcb_atom_t property) { - xcb_get_property_cookie_t cookie = xcb_get_property(xwm->xcb_conn, 0, - xsurface->window_id, property, XCB_ATOM_ANY, 0, 2048); - xcb_get_property_reply_t *reply = xcb_get_property_reply(xwm->xcb_conn, - cookie, NULL); - if (reply == NULL) { - return; - } - + struct wlr_xwayland_surface *xsurface, xcb_atom_t property, + xcb_get_property_reply_t *reply) { if (property == XCB_ATOM_WM_CLASS) { read_surface_class(xwm, xsurface, reply); } else if (property == XCB_ATOM_WM_NAME || @@ -876,8 +869,6 @@ static void read_surface_property(struct wlr_xwm *xwm, property, prop_name ? prop_name : "(null)", xsurface->window_id); free(prop_name); } - - free(reply); } static void xwayland_surface_handle_commit(struct wl_listener *listener, void *data) { @@ -942,9 +933,24 @@ static void xwayland_surface_associate(struct wlr_xwm *xwm, xwm->atoms[NET_WM_WINDOW_TYPE], xwm->atoms[NET_WM_NAME], }; - for (size_t i = 0; i < sizeof(props)/sizeof(xcb_atom_t); i++) { - read_surface_property(xwm, xsurface, props[i]); + + xcb_get_property_cookie_t cookies[sizeof(props) / sizeof(props[0])] = {0}; + for (size_t i = 0; i < sizeof(props) / sizeof(props[0]); i++) { + cookies[i] = xcb_get_property(xwm->xcb_conn, 0, xsurface->window_id, + props[i], XCB_ATOM_ANY, 0, 2048); + } + + for (size_t i = 0; i < sizeof(props) / sizeof(props[0]); i++) { + xcb_get_property_reply_t *reply = + xcb_get_property_reply(xwm->xcb_conn, cookies[i], NULL); + if (reply == NULL) { + wlr_log(WLR_ERROR, "Failed to get window property"); + return; + } + read_surface_property(xwm, xsurface, props[i], reply); + free(reply); } + if (xwm->xres) { read_surface_client_id(xwm, xsurface); } @@ -1139,7 +1145,16 @@ static void xwm_handle_property_notify(struct wlr_xwm *xwm, return; } - read_surface_property(xwm, xsurface, ev->atom); + xcb_get_property_cookie_t cookie = + xcb_get_property(xwm->xcb_conn, 0, xsurface->window_id, ev->atom, XCB_ATOM_ANY, 0, 2048); + xcb_get_property_reply_t *reply = + xcb_get_property_reply(xwm->xcb_conn, cookie, NULL); + if (reply == NULL) { + wlr_log(WLR_ERROR, "Failed to get window property"); + return; + } + + read_surface_property(xwm, xsurface, ev->atom, reply); } static void xwm_handle_surface_id_message(struct wlr_xwm *xwm,