xwayland: add wlr_xwayland_surface_has_window_type()

The infrastructure to read _NET_WM_WINDOW_TYPE already exists in wlroots
(it's used for example in wlr_xwayland_or_surface_wants_focus()). But
the window type isn't easily accessible to the compositor because the
atoms to compare against are private to xwm.c.

labwc has recently gone to a fair amount of effort (including opening a
whole new xcb connection) just to get the needed window type atoms:
a04b394e59

It seems much cleaner to add the remaining few (3) atoms to wlroots and
implement a shared function which can be used by any wlroots compositor.

v2: naming updates
This commit is contained in:
John Lindgren 2024-02-14 22:54:33 -05:00 committed by Kirill Primak
parent 71cc47b859
commit 6214144735
3 changed files with 63 additions and 0 deletions

View file

@ -92,6 +92,27 @@ enum wlr_xwayland_icccm_input_model {
WLR_ICCCM_INPUT_MODEL_GLOBAL = 3,
};
/**
* The type of window (_NET_WM_WINDOW_TYPE). See:
* https://specifications.freedesktop.org/wm-spec/latest/
*/
enum wlr_xwayland_net_wm_window_type {
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_DESKTOP = 0,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_DOCK,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_TOOLBAR,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_MENU,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_UTILITY,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_SPLASH,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_DIALOG,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_DROPDOWN_MENU,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_POPUP_MENU,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_TOOLTIP,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_NOTIFICATION,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_COMBO,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_DND,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_NORMAL,
};
/**
* An Xwayland user interface component. It has an absolute position in
* layout-local coordinates.
@ -293,6 +314,14 @@ void wlr_xwayland_surface_offer_focus(struct wlr_xwayland_surface *xsurface);
void wlr_xwayland_surface_ping(struct wlr_xwayland_surface *surface);
/**
* Returns true if the surface has the given window type.
* Note: a surface may have multiple window types set.
*/
bool wlr_xwayland_surface_has_window_type(
const struct wlr_xwayland_surface *xsurface,
enum wlr_xwayland_net_wm_window_type window_type);
/** Metric to guess if an OR window should "receive" focus
*
* In the pure X setups, window managers usually straight up ignore override

View file

@ -74,6 +74,9 @@ enum atom_name {
NET_WM_WINDOW_TYPE_NOTIFICATION,
NET_WM_WINDOW_TYPE_SPLASH,
NET_WM_WINDOW_TYPE_DESKTOP,
NET_WM_WINDOW_TYPE_DOCK,
NET_WM_WINDOW_TYPE_TOOLBAR,
NET_WM_WINDOW_TYPE_DIALOG,
DND_SELECTION,
DND_AWARE,
DND_STATUS,