summarylogtreecommitdiffstats
path: root/xcb-send-message.patch
diff options
context:
space:
mode:
Diffstat (limited to 'xcb-send-message.patch')
-rw-r--r--xcb-send-message.patch58
1 files changed, 58 insertions, 0 deletions
diff --git a/xcb-send-message.patch b/xcb-send-message.patch
new file mode 100644
index 000000000000..c3fb363244e3
--- /dev/null
+++ b/xcb-send-message.patch
@@ -0,0 +1,58 @@
+diff --git a/xwayland/xwm.c b/xwayland/xwm.c
+index 2c437e83..478ea6fa 100644
+--- a/xwayland/xwm.c
++++ b/xwayland/xwm.c
+@@ -217,6 +217,25 @@ static void xwm_set_net_active_window(struct wlr_xwm *xwm,
+ xwm->atoms[WINDOW], 32, 1, &window);
+ }
+
++/*
++ * Wrapper for xcb_send_event, which ensures that the event data is 32 byte big.
++ */
++static xcb_void_cookie_t xwm_send_event(xcb_connection_t *c,
++ uint8_t propagate, xcb_window_t destination,
++ uint32_t event_mask, const char *event, uint32_t length)
++{
++ if (length == 32) {
++ return xcb_send_event(c, propagate, destination, event_mask, event);
++ } else if (length < 32) {
++ char buf[32];
++ memcpy(buf, event, length);
++ memset(buf + length, 0, 32 - length);
++ return xcb_send_event(c, propagate, destination, event_mask, buf);
++ } else {
++ assert(false && "Event too long");
++ }
++}
++
+ static void xwm_send_wm_message(struct wlr_xwayland_surface *surface,
+ xcb_client_message_data_t *data, uint32_t event_mask) {
+ struct wlr_xwm *xwm = surface->xwm;
+@@ -230,11 +249,12 @@ static void xwm_send_wm_message(struct wlr_xwayland_surface *surface,
+ .data = *data,
+ };
+
+- xcb_send_event(xwm->xcb_conn,
++ xwm_send_event(xwm->xcb_conn,
+ 0, // propagate
+ surface->window_id,
+ event_mask,
+- (const char *)&event);
++ (const char *)&event,
++ sizeof(event));
+ xcb_flush(xwm->xcb_conn);
+ }
+
+@@ -1795,9 +1815,10 @@ void wlr_xwayland_surface_configure(struct wlr_xwayland_surface *xsurface,
+ .height = height,
+ };
+
+- xcb_send_event(xwm->xcb_conn, 0, xsurface->window_id,
++ xwm_send_event(xwm->xcb_conn, 0, xsurface->window_id,
+ XCB_EVENT_MASK_STRUCTURE_NOTIFY,
+- (const char *)&configure_notify);
++ (const char *)&configure_notify,
++ sizeof(configure_notify));
+ }
+
+ xcb_flush(xwm->xcb_conn);