X.Org GNOME / Mutter KWindowSystem
(KWin / LXQt)
wlroots
(Sway / Wayfire / Phoc / etc.)
Mir
(MATE)
Enlightenment Arcan
KWin any Sway (IPC) any
ICCCM
WM_STATE taskbars, docks, wmctrl, xdotool, etc.
xdg-shell / Window.[un]minimize526KWin::Toplevel::minimized28xdg-shell / KDE plasma-window-management15xdg-shell / wlr-foreign-toplevel-management15xdg-shell5xdg-shell / org.enlightenment.wm.Window.Iconify5
EWMH (NetWM)
_NET_SUPPORTED
_NET_CLIENT_LIST wmctrl, rofi, devilspie, xwinmosaic, taskbars, docks, etc.
/org/gnome/shell/Introspect / WorkspaceManager.get_workspace_by_index & Workspace.list_windows1726KDE plasma-window-management1GET_TREEwlr-foreign-toplevel-management1org.enlightenment.wm.Window.List
atspi_get_desktop8
_NET_CLIENT_LIST_STACKING
_NET_NUMBER_OF_DESKTOPSWorkspaceManager.get_n_workspaces26KWin::WorkspaceWrapper::desktops28GET_WORKSPACESorg.enlightenment.wm.Desktop.GetVirtualCount
atspi_get_desktop_count8
_NET_DESKTOP_GEOMETRYKWin::WorkspaceWrapper::desktopGridSize28GET_WORKSPACES22
atspi_component_get_size8
_NET_DESKTOP_VIEWPORTWorkspace.get_display2226GET_WORKSPACES22
_NET_CURRENT_DESKTOPWorkspaceManager.get_active_workspace_index / Workspace.activate26KWin::WorkspaceWrapper::currentDesktop28GET_WORKSPACES / workspaceorg.enlightenment.wm.Desktop.Show
_NET_DESKTOP_NAMESWorkspaceManager.get_workspace_by_index26KWin::WorkspaceWrapper::desktopName28GET_WORKSPACES
atspi_accessible_get_name8
_NET_ACTIVE_WINDOW time trackers, xbrlapi
/org/gnome/shell/Introspect / Window.has_focus / Window.focus1726KWin:WorkspaceWrapper::activeClient28GET_TREE / focusorg.enlightenment.wm.Window.Uniconify23
_NET_WORKAREAWindow.get_work_area_*26GET_WORKSPACES
atspi_component_get_size8
_NET_SUPPORTING_WM_CHECK
_NET_VIRTUAL_ROOTS
_NET_DESKTOP_LAYOUTWorkspaceManager.override_workspace_layout26
_NET_SHOWING_DESKTOPWorkspaceManager.showing-desktop-changed2226
_NET_CLOSE_WINDOWxdg-shell / Window.kill526KWin::Toplevel::closeWindow28xdg-shell / KDE plasma-window-management15kill16xdg-shell / wlr-foreign-toplevel-management15xdg-shell5xdg-shell / org.enlightenment.wm.Window.Close5
_NET_MOVERESIZE_WINDOW panels, fixed-size windows, popups, Win32 apps
xdg-shell / Window.move_resize_frame5626xdg-shell / KDE plasma-shell 5611move / resizexdg-shell / wlr-foreign-toplevel-management / wlr-layer-shell 156xdg-shell56xdg-shell56
_NET_WM_MOVERESIZExdg-shell5xdg-shell5xdg-shell5xdg-shell5xdg-shell5
_NET_RESTACK_WINDOW
_NET_REQUEST_FRAME_EXTENTSGET_TREE
_NET_WM_NAME time trackers, global menus, rofi, xwinmosaic, etc.
xdg-shell / Window.get_title526KWin::Toplevel::caption28xdg-shell / KDE plasma-window-management15xdg-shell / wlr-foreign-toplevel-management15xdg-shell5xdg-shell5
_NET_WM_VISIBLE_NAMExdg-shell / Window.get_title526xdg-shell5xdg-shell / wlr-foreign-toplevel-management15xdg-shell5xdg-shell5
_NET_WM_ICON_NAME
_NET_WM_VISIBLE_ICON_NAME
_NET_WM_DESKTOPWindow.get_workspace / Window.change_workspace26KWin::Toplevel::desktop28org.enlightenment.wm.Window.SendToDesktop23
_NET_WM_WINDOW_TYPEWindow.get_window_type26KWin::Toplevel::windowType28
_NET_WM_STATE taskbars, docks, wmctrl, xdotool, etc.
xdg-shell5xdg-shell5xdg-shell / wlr-foreign-toplevel-management15xdg-shell5xdg-shell5
_NET_WM_ALLOWED_ACTIONSWindow.can_* / Window.allows_*26KWin::Toplevel::*able28
_NET_WM_STRUT panels, docks
wlr-layer-shell5
_NET_WM_STRUT_PARTIAL panels, docks
wlr-layer-shell5
_NET_WM_ICON_GEOMETRYWindow.get_icon_geometry / Window.set_icon_geometry26KWin::Toplevel::iconGeometry28
_NET_WM_ICON global menus, xwinmosaic, etc.
KDE plasma-window-management1
_NET_WM_PIDWindow.get_pid26KWin::Toplevel::pid28KDE plasma-window-management1GET_TREE
_NET_WM_HANDLED_ICONS
_NET_WM_USER_TIMEIdleMonitor / Window.get_user_time2426
_NET_WM_USER_TIME_WINDOW
_NET_FRAME_EXTENTSWindow.get_buffer_rect / Window.get_frame_rect26KWin::Toplevel::bufferGeometry / KWin::Toplevel::frameGeometry28
_NET_WM_PINGxdg-shellxdg-shellxdg-shellxdg-shellxdg-shell
_NET_WM_SYNC_REQUEST
_NET_WM_SYNC_REQUEST_COUNTER
_NET_WM_FULLSCREEN_MONITORS
_NET_WM_FULL_PLACEMENT
_NET_WM_WINDOW_TYPE_DESKTOPKWin::Toplevel::desktopWindow28
_NET_WM_WINDOW_TYPE_DOCKKWin::Toplevel::dock28
_NET_WM_WINDOW_TYPE_TOOLBARKWin::Toplevel::toolbar28
_NET_WM_WINDOW_TYPE_MENUWindow.get_frame_type26KWin::Toplevel::menu28
_NET_WM_WINDOW_TYPE_UTILITYWindow.get_frame_type26KWin::Toplevel::utility28
_NET_WM_WINDOW_TYPE_SPLASHKWin::Toplevel::splash28
_NET_WM_WINDOW_TYPE_DIALOGWindow.get_frame_type26KWin::Toplevel::dialog28
_NET_WM_WINDOW_TYPE_DROPDOWN_MENUKWin::Toplevel::dropdownMenu28
_NET_WM_WINDOW_TYPE_POPUP_MENUKWin::Toplevel::popupMenu28
_NET_WM_WINDOW_TYPE_TOOLTIPKWin::Toplevel::tooltip28
_NET_WM_WINDOW_TYPE_NOTIFICATIONKWin::Toplevel::notification28
_NET_WM_WINDOW_TYPE_COMBOKWin::Toplevel::comboBox28
_NET_WM_WINDOW_TYPE_DNDKWin::Toplevel::dndIcon28
_NET_WM_WINDOW_TYPE_NORMALWindow.get_frame_type26KWin::Toplevel::normalWindow28
_NET_WM_STATE_MODALxdg-shell / Window.get_frame_type52630KWin::Toplevel::modal2822xdg-shell5xdg-shell / wlr-layer-shell 5xdg-shell5xdg-shell5
_NET_WM_STATE_FOCUSEDorg.enlightenment.wm.Window.Focus23
_NET_WM_STATE_STICKYWindow.is_always_on_all_workspaces / Window.stick26KWin::Toplevel::onAllDesktops28KDE plasma-window-management1GET_TREE / sticky
_NET_WM_STATE_MAXIMIZED_VERTxdg-shell / Window.get_maximized / Window.[un]maximize526KWin::Toplevel::clientMaximizedStateChanged / KWin::Toplevel::setMaximize28xdg-shell / KDE plasma-window-management15xdg-shell / wlr-foreign-toplevel-management135xdg-shell5xdg-shell / org.enlightenment.wm.Window.{M|Unm}aximize35
_NET_WM_STATE_MAXIMIZED_HORZxdg-shell / Window.get_maximized / Window.[un]maximize526KWin::Toplevel::clientMaximizedStateChanged / KWin::Toplevel::setMaximize28xdg-shell / KDE plasma-window-management15xdg-shell / wlr-foreign-toplevel-management135xdg-shell5xdg-shell / org.enlightenment.wm.Window.{M|Unm}aximize35
_NET_WM_STATE_SHADEDWindow.is_shaded / Window.shade26KWin::Toplevel::shade28KDE plasma-window-management1
_NET_WM_STATE_SKIP_TASKBAR taskbars themselves, and other shell elements
Window.is_skip_taskbar / WaylandClient.{hide_from|show_in}_window_list2627KWin::Toplevel::skipTaskbar28KDE plasma-shell / KDE plasma-window-management111
_NET_WM_STATE_SKIP_PAGER taskbars, and other shell elements
WaylandClient.{hide_from|show_in}_window_list2627KWin::Toplevel::skipPager28KDE plasma-shell / KDE plasma-window-management111
_NET_WM_STATE_HIDDEN/org/gnome/shell/Introspect / Window.is_hidden172226
_NET_WM_STATE_FULLSCREENxdg-shell / Window.is_fullscreen / Window.[un]make_fullscreen526KWin::Toplevel::fullScreen28xdg-shell / KDE plasma-window-management15GET_TREE / fullscreenxdg-shell / wlr-foreign-toplevel-management135xdg-shell5xdg-shell5
_NET_WM_STATE_ABOVExdg-shell / Window.is_above / Window.[un]make_above526KWin::Toplevel::keepAbove28xdg-shell / KDE plasma-shell / KDE plasma-window-management1511xdg-shell / wlr-layer-shell 5xdg-shell5xdg-shell5
_NET_WM_STATE_BELOWKWin::Toplevel::keepBelow28KDE plasma-shell / KDE plasma-window-management111wlr-layer-shell5
_NET_WM_STATE_DEMANDS_ATTENTION IMs, terminal emulators, etc.
xdg-activation / Window.demands_attention / Window.set_demands_attention926KWin::Toplevel::demandsAttention28xdg-activation / KDE plasma-window-management19xdg-activation9
_NET_WM_ACTION_MOVEWindow.allows_move26KWin::Toplevel::moveable28
_NET_WM_ACTION_RESIZEWindow.allows_resize26KWin::Toplevel::resizeable28
_NET_WM_ACTION_MINIMIZEWindow.can_minimize26KWin::Toplevel::minimizable28
_NET_WM_ACTION_SHADEWindow.can_shade26KWin::Toplevel::shadeable28
_NET_WM_ACTION_STICK
_NET_WM_ACTION_MAXIMIZE_HORZWindow.can_maximize2629KWin::Toplevel::maximizable2829
_NET_WM_ACTION_MAXIMIZE_VERTWindow.can_maximize2629KWin::Toplevel::maximizable2829
_NET_WM_ACTION_FULLSCREENKWin::Toplevel::fullScreenable28
_NET_WM_ACTION_CHANGE_DESKTOP
_NET_WM_ACTION_CLOSEWindow.can_close26KWin::Toplevel::closeable28
_NET_WM_ACTION_ABOVE
_NET_WM_ACTION_BELOW
XAPP extensions
_NET_WM_XAPP_ICON_NAME
_NET_WM_XAPP_PROGRESScom.canonical.Unity.LauncherEntry31
_NET_WM_XAPP_PROGRESS_PULSE
Keyboard
ChangeKeyboardMapping layout switchers
ActivateInputSource3233
XKB
XkbLockGroup?????
Selections
PRIMARY
SECONDARY
CLIPBOARD
ConvertSelection
Managerswlr-data-control
XF86VIDMODE
ModeLine games with strict resolution modes
KDE output-management / KDE outputdevice21
Gamma xbrightness, xgamma, redshift
KDE output-managementwlr-gamma-control
Grabbing
Pointer games
Button
Keyboard games, screen lockers, password prompts
xwayland-keyboard-grabwlr-input-inhibitor, wlr-layer-shell45
Key global hotkeys
GlobalShortcuts portal / registerShortcut28KDE keystate10bindsym-
Queries
Tree
Pointer oneko
Keymap
Font
TextExtents
Colors
BestSize
Extension
Get
Geometry/org/gnome/shell/Introspect / Window.get_frame_rect1718192026KWin::Toplevel::{frameGeometry|size|x|y}281920KDE plasma-window-management11920GET_TREE19
XTEST
GetVersion
CompareCursor
FakeInput xdotool, showkey, remote desktop
KDE fake inputvirtual-keyboard / wlr-virtual-pointer
libinput15
GrabControl
XEMBED
ReparentWindow tray, gtk_socket plugin for Double Commander, xfce4-panel applets, DAW plugins
SNI / wl_subcompositor512
EMBEDDED_NOTIFY
StatusNotifierHostRegistered1213
Window activation
Focus
Modality
Accelerators
System tray
REQUEST_DOCK tray icons embedding
SEGID_ICON
StatusNotifierItemRegistered
MESSAGE balloon tooltips from tray icons
org.freedesktop.Notifications14
Miscellanous
WM crash persistence-wl_display_reconnect2Session Recovery Extension2SHMIF
WM decorations-server-decorationserver-decoration
XShm (screen capture) screen shooters/capturers, color pickers, screen sharing
PipeWire, portalsKDE screencast (a PipeWire wrapper)wlr-export-dmabuf / wlr-screencopy
XineramaKDE outputdevicewlr-output-management
DPMSKDE DPMSwlr-output-power-management7

1 wlr-foreign-toplevel-management and plasma-window-management support only one client at time. Wanna a compositor-independent taskbar and something like Devilspie simultaneously? fail.
2 Requires client support.
3 xdg-shell, plasma-window-management, wlr-foreign-toplevel-management and org.enlightenment.wm.Window.{M|Unm}aximize can’t separately maximize horizontally or vertically.
4 wlr-input-inhibitor provides screen locker functionality only (grab prevention), no complete grabbing
5 wl_subcompositor, xdg-shell and layer-shell provide access only to own surfaces, or those explicitly obtained via xdg-foreign.
6 gnome-shell Meta Window.move[_resize]_frame, xdg-shell and layer-shell provide an agnostic approach that masks the actual output size with anchors.
7 wlr-output-power-management provides only on/off modes.
8 Only for clients which implement the AT-SPI2 interface.
9 xdg-activation is constrained by explicit client-to-client IPC.
10 KDE keystate is limited to lock keys.
11 KDE plasma-shell is limited to manipulating own surfaces and can be registered only by one client.
12 SNI replaces a very narrow use of XEmbed for tray icons, provided in a declarative way over DBus. Just an icon, a tooltip, a menu of actions and a scroll event, with the appearance implemented completely by a SNI host. No arbitrary actions over a window, like handling a click position, non-square applets (like in Workrave), etc. Doesn’t really depend on Wayland compositors, as they don’t interfere with the possibility of other apps to become SNI hosts, but the compositors may implement a SNI host themselves.
13 StatusNotifierHostRegistered is a rough replacement, as every certain item can’t know if it is drawn by the host, just that the host exists.
14 Freedesktop Notifications roughly replace balloon messages, as they can in no way be associated with a certain tray icon. To be honest, balloons were scarcely supported by X systray implementations too.
15 libinput requires either to add the user to the libinput group or to run the client from root: both are even less secure then the X.Org approach. Also, it works on a low level and doesn’t actually have anything to do with Wayland, so things akin to XTestCompareCursorWithWindow and so wouldn’t work.
16 Sway’s kill command applies only to a currently focused window.
17 /org/gnome/shell/Introspect is disabled by default in gsettings; read-only access.
18 /org/gnome/shell/Introspect provides the width/height only.
19 Window.get_frame_rect, KWin::Toplevel, plasma-window-management and GET_TREE don’t provide the bit depth of a surface.
20 Window.get_frame_rect, KWin::Toplevel and plasma-window-management don’t provide the border width of a surface.
21 KDE output management doesn’t handle HSync/VSync, though does handle VRR.
22 Read-only access.
23 Write-only access.
24 Window-agnostic information.
25 REDACTED
26 Since GNOME 41, WaylandClient, Workspace, WorkspaceManager, IdleMonitor and Window Meta APIs are available only to GNOME Extensions or in the unsafe mode.
27 WaylandClient controls only subprocess surfaces.
28 KWin Scripting API is available only to dedicated registered scripts.
29 Does not inform separately if a window is maximizable only horizontally or only vertically.
30 gnome-shell Meta Window.get_frame_type() is read-only.
31 Plasma only.
32 Requires the Agism extension.
33 Pre-baked input sources only.