aboutsummaryrefslogtreecommitdiff
path: root/xwayland
diff options
context:
space:
mode:
authorJohn Lindgren <john@jlindgren.net>2023-10-24 10:33:50 -0400
committerJohn Lindgren <john@jlindgren.net>2023-10-26 15:05:08 -0400
commitaf165acb427dd166f2768cf806d28f106bc61fd7 (patch)
tree32cb327e5791015ae9e5d5e19e8edce5f59713f7 /xwayland
parent2410710a0f82b3e59b584d9c4f75b5f7758da6e4 (diff)
xwayland: add wlr_xwayland_set_workareas()
This function allows compositors to set the _NET_WORKAREA property on the root window. XWayland clients use _NET_WORKAREA to determine how much of the screen is not covered by panels/docks. The property is used for example by Qt to determine areas of the screen that popup menus should not overlap (see QScreen::availableVirtualGeometry).
Diffstat (limited to 'xwayland')
-rw-r--r--xwayland/xwm.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/xwayland/xwm.c b/xwayland/xwm.c
index 92d68c7b..db4a8c0f 100644
--- a/xwayland/xwm.c
+++ b/xwayland/xwm.c
@@ -90,6 +90,7 @@ static const char *const atom_map[ATOM_LAST] = {
[DND_ACTION_PRIVATE] = "XdndActionPrivate",
[NET_CLIENT_LIST] = "_NET_CLIENT_LIST",
[NET_CLIENT_LIST_STACKING] = "_NET_CLIENT_LIST_STACKING",
+ [NET_WORKAREA] = "_NET_WORKAREA",
};
#define STARTUP_INFO_REMOVE_PREFIX "remove: ID="
@@ -2327,3 +2328,24 @@ enum wlr_xwayland_icccm_input_model wlr_xwayland_icccm_input_model(
}
return WLR_ICCCM_INPUT_MODEL_NONE;
}
+
+void wlr_xwayland_set_workareas(struct wlr_xwayland *wlr_xwayland,
+ const struct wlr_box *workareas, size_t num_workareas) {
+ uint32_t *data = malloc(4 * sizeof(uint32_t) * num_workareas);
+ if (!data) {
+ return;
+ }
+
+ for (size_t i = 0; i < num_workareas; i++) {
+ data[4 * i] = workareas[i].x;
+ data[4 * i + 1] = workareas[i].y;
+ data[4 * i + 2] = workareas[i].width;
+ data[4 * i + 3] = workareas[i].height;
+ }
+
+ struct wlr_xwm *xwm = wlr_xwayland->xwm;
+ xcb_change_property(xwm->xcb_conn, XCB_PROP_MODE_REPLACE,
+ xwm->screen->root, xwm->atoms[NET_WORKAREA],
+ XCB_ATOM_CARDINAL, 32, 4 * num_workareas, data);
+ free(data);
+}