diff options
author | John Lindgren <john@jlindgren.net> | 2023-10-24 10:33:50 -0400 |
---|---|---|
committer | John Lindgren <john@jlindgren.net> | 2023-10-26 15:05:08 -0400 |
commit | af165acb427dd166f2768cf806d28f106bc61fd7 (patch) | |
tree | 32cb327e5791015ae9e5d5e19e8edce5f59713f7 | |
parent | 2410710a0f82b3e59b584d9c4f75b5f7758da6e4 (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).
-rw-r--r-- | include/wlr/xwayland/xwayland.h | 11 | ||||
-rw-r--r-- | include/xwayland/xwm.h | 1 | ||||
-rw-r--r-- | xwayland/xwm.c | 22 |
3 files changed, 34 insertions, 0 deletions
diff --git a/include/wlr/xwayland/xwayland.h b/include/wlr/xwayland/xwayland.h index 75e9cdac..cb9e35f0 100644 --- a/include/wlr/xwayland/xwayland.h +++ b/include/wlr/xwayland/xwayland.h @@ -16,6 +16,7 @@ #include <xcb/xcb_icccm.h> #include <wlr/util/addon.h> +struct wlr_box; struct wlr_xwm; struct wlr_data_source; struct wlr_drag; @@ -285,4 +286,14 @@ bool wlr_xwayland_or_surface_wants_focus( enum wlr_xwayland_icccm_input_model wlr_xwayland_icccm_input_model( const struct wlr_xwayland_surface *xsurface); +/** + * Sets the _NET_WORKAREA root window property. The compositor should set + * one workarea per virtual desktop. This indicates the usable geometry + * (relative to the virtual desktop viewport) that is not covered by + * panels, docks, etc. Unfortunately, it is not possible to specify + * per-output workareas. + */ +void wlr_xwayland_set_workareas(struct wlr_xwayland *wlr_xwayland, + const struct wlr_box *workareas, size_t num_workareas); + #endif diff --git a/include/xwayland/xwm.h b/include/xwayland/xwm.h index 7db5d6cb..da3515da 100644 --- a/include/xwayland/xwm.h +++ b/include/xwayland/xwm.h @@ -88,6 +88,7 @@ enum atom_name { DND_ACTION_PRIVATE, NET_CLIENT_LIST, NET_CLIENT_LIST_STACKING, + NET_WORKAREA, ATOM_LAST // keep last }; 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); +} |