aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-07-28 12:19:06 +0200
committerSimon Ser <contact@emersion.fr>2023-10-06 08:35:33 +0000
commitf5797be8a8d410e22fa6397b2217a6a81858d05c (patch)
treef61e036415bfe1877e5e4ec7704c6c66f2b92948
parentca19014af011f5a6433fb6763fa1350c03a77f65 (diff)
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.
-rw-r--r--xwayland/xwm.c43
1 files 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,