X.Org | GNOME / Mutter | KWindowSystem (KWin / LXQt) |
wlroots (Sway / Wayfire / Phoc / etc.) |
Mir (MATE) |
Enlightenment | Arcan | ||
---|---|---|---|---|---|---|---|---|
KWin | any | Sway (IPC) | any | |||||
ICCCM | ||||||||
WM_STATEtaskbars, docks, wmctrl, xdotool, etc. | xdg-shell / Window.[un]minimize526 | KWin::Toplevel::minimized28 | xdg-shell / KDE plasma-window-management15 | xdg-shell / wlr-foreign-toplevel-management15 | xdg-shell5 | xdg-shell / org.enlightenment.wm.Window.Iconify5 | ||
EWMH (NetWM) | ||||||||
_NET_SUPPORTED | ||||||||
_NET_CLIENT_LISTwmctrl, rofi, devilspie, xwinmosaic, taskbars, docks, etc. | /org/gnome/shell/Introspect / WorkspaceManager.get_workspace_by_index & Workspace.list_windows1726 | KDE plasma-window-management1 | GET_TREE | wlr-foreign-toplevel-management1 | org.enlightenment.wm.Window.List | |||
atspi_get_desktop8 | ||||||||
_NET_CLIENT_LIST_STACKING | ||||||||
_NET_NUMBER_OF_DESKTOPS | WorkspaceManager.get_n_workspaces26 | KWin::WorkspaceWrapper::desktops28 | GET_WORKSPACES | org.enlightenment.wm.Desktop.GetVirtualCount | ||||
atspi_get_desktop_count8 | ||||||||
_NET_DESKTOP_GEOMETRY | KWin::WorkspaceWrapper::desktopGridSize28 | GET_WORKSPACES22 | ||||||
atspi_component_get_size8 | ||||||||
_NET_DESKTOP_VIEWPORT | Workspace.get_display2226 | GET_WORKSPACES22 | ||||||
_NET_CURRENT_DESKTOP | WorkspaceManager.get_active_workspace_index / Workspace.activate26 | KWin::WorkspaceWrapper::currentDesktop28 | GET_WORKSPACES / workspace | org.enlightenment.wm.Desktop.Show | ||||
_NET_DESKTOP_NAMES | WorkspaceManager.get_workspace_by_index26 | KWin::WorkspaceWrapper::desktopName28 | GET_WORKSPACES | |||||
atspi_accessible_get_name8 | ||||||||
_NET_ACTIVE_WINDOWtime trackers, xbrlapi | /org/gnome/shell/Introspect / Window.has_focus / Window.focus1726 | KWin:WorkspaceWrapper::activeClient28 | GET_TREE / focus | org.enlightenment.wm.Window.Uniconify23 | ||||
_NET_WORKAREA | Window.get_work_area_*26 | GET_WORKSPACES | ||||||
atspi_component_get_size8 | ||||||||
_NET_SUPPORTING_WM_CHECK | ||||||||
_NET_VIRTUAL_ROOTS | ||||||||
_NET_DESKTOP_LAYOUT | WorkspaceManager.override_workspace_layout26 | |||||||
_NET_SHOWING_DESKTOP | WorkspaceManager.showing-desktop-changed2226 | |||||||
_NET_CLOSE_WINDOW | xdg-shell / Window.kill526 | KWin::Toplevel::closeWindow28 | xdg-shell / KDE plasma-window-management15 | kill16 | xdg-shell / wlr-foreign-toplevel-management15 | xdg-shell5 | xdg-shell / org.enlightenment.wm.Window.Close5 | |
_NET_MOVERESIZE_WINDOWpanels, fixed-size windows, popups, Win32 apps | xdg-shell / Window.move_resize_frame5626 | xdg-shell / KDE plasma-shell 5611 | move / resize | xdg-shell / wlr-foreign-toplevel-management / wlr-layer-shell 156 | xdg-shell56 | xdg-shell56 | ||
_NET_WM_MOVERESIZE | xdg-shell5 | xdg-shell5 | xdg-shell5 | xdg-shell5 | xdg-shell5 | |||
_NET_RESTACK_WINDOW | ||||||||
_NET_REQUEST_FRAME_EXTENTS | GET_TREE | |||||||
_NET_WM_NAMEtime trackers, global menus, rofi, xwinmosaic, etc. | xdg-shell / Window.get_title526 | KWin::Toplevel::caption28 | xdg-shell / KDE plasma-window-management15 | xdg-shell / wlr-foreign-toplevel-management15 | xdg-shell5 | xdg-shell5 | ||
_NET_WM_VISIBLE_NAME | xdg-shell / Window.get_title526 | xdg-shell5 | xdg-shell / wlr-foreign-toplevel-management15 | xdg-shell5 | xdg-shell5 | |||
_NET_WM_ICON_NAME | ||||||||
_NET_WM_VISIBLE_ICON_NAME | ||||||||
_NET_WM_DESKTOP | Window.get_workspace / Window.change_workspace26 | KWin::Toplevel::desktop28 | org.enlightenment.wm.Window.SendToDesktop23 | |||||
_NET_WM_WINDOW_TYPE | Window.get_window_type26 | KWin::Toplevel::windowType28 | ||||||
_NET_WM_STATEtaskbars, docks, wmctrl, xdotool, etc. | xdg-shell5 | xdg-shell5 | xdg-shell / wlr-foreign-toplevel-management15 | xdg-shell5 | xdg-shell5 | |||
_NET_WM_ALLOWED_ACTIONS | Window.can_* / Window.allows_*26 | KWin::Toplevel::*able28 | ||||||
_NET_WM_STRUTpanels, docks | wlr-layer-shell5 | |||||||
_NET_WM_STRUT_PARTIALpanels, docks | wlr-layer-shell5 | |||||||
_NET_WM_ICON_GEOMETRY | Window.get_icon_geometry / Window.set_icon_geometry26 | KWin::Toplevel::iconGeometry28 | ||||||
_NET_WM_ICONglobal menus, xwinmosaic, etc. | KDE plasma-window-management1 | |||||||
_NET_WM_PID | Window.get_pid26 | KWin::Toplevel::pid28 | KDE plasma-window-management1 | GET_TREE | ||||
_NET_WM_HANDLED_ICONS | ||||||||
_NET_WM_USER_TIME | IdleMonitor / Window.get_user_time2426 | |||||||
_NET_WM_USER_TIME_WINDOW | ||||||||
_NET_FRAME_EXTENTS | Window.get_buffer_rect / Window.get_frame_rect26 | KWin::Toplevel::bufferGeometry / KWin::Toplevel::frameGeometry28 | ||||||
_NET_WM_PING | xdg-shell | xdg-shell | xdg-shell | xdg-shell | xdg-shell | |||
_NET_WM_SYNC_REQUEST | ||||||||
_NET_WM_SYNC_REQUEST_COUNTER | ||||||||
_NET_WM_FULLSCREEN_MONITORS | ||||||||
_NET_WM_FULL_PLACEMENT | ||||||||
_NET_WM_WINDOW_TYPE_DESKTOP | KWin::Toplevel::desktopWindow28 | |||||||
_NET_WM_WINDOW_TYPE_DOCK | KWin::Toplevel::dock28 | |||||||
_NET_WM_WINDOW_TYPE_TOOLBAR | KWin::Toplevel::toolbar28 | |||||||
_NET_WM_WINDOW_TYPE_MENU | Window.get_frame_type26 | KWin::Toplevel::menu28 | ||||||
_NET_WM_WINDOW_TYPE_UTILITY | Window.get_frame_type26 | KWin::Toplevel::utility28 | ||||||
_NET_WM_WINDOW_TYPE_SPLASH | KWin::Toplevel::splash28 | |||||||
_NET_WM_WINDOW_TYPE_DIALOG | Window.get_frame_type26 | KWin::Toplevel::dialog28 | ||||||
_NET_WM_WINDOW_TYPE_DROPDOWN_MENU | KWin::Toplevel::dropdownMenu28 | |||||||
_NET_WM_WINDOW_TYPE_POPUP_MENU | KWin::Toplevel::popupMenu28 | |||||||
_NET_WM_WINDOW_TYPE_TOOLTIP | KWin::Toplevel::tooltip28 | |||||||
_NET_WM_WINDOW_TYPE_NOTIFICATION | KWin::Toplevel::notification28 | |||||||
_NET_WM_WINDOW_TYPE_COMBO | KWin::Toplevel::comboBox28 | |||||||
_NET_WM_WINDOW_TYPE_DND | KWin::Toplevel::dndIcon28 | |||||||
_NET_WM_WINDOW_TYPE_NORMAL | Window.get_frame_type26 | KWin::Toplevel::normalWindow28 | ||||||
_NET_WM_STATE_MODAL | xdg-shell / Window.get_frame_type52630 | KWin::Toplevel::modal2822 | xdg-shell5 | xdg-shell / wlr-layer-shell 5 | xdg-shell5 | xdg-shell5 | ||
_NET_WM_STATE_FOCUSED | org.enlightenment.wm.Window.Focus23 | |||||||
_NET_WM_STATE_STICKY | Window.is_always_on_all_workspaces / Window.stick26 | KWin::Toplevel::onAllDesktops28 | KDE plasma-window-management1 | GET_TREE / sticky | ||||
_NET_WM_STATE_MAXIMIZED_VERT | xdg-shell / Window.get_maximized / Window.[un]maximize526 | KWin::Toplevel::clientMaximizedStateChanged / KWin::Toplevel::setMaximize28 | xdg-shell / KDE plasma-window-management15 | xdg-shell / wlr-foreign-toplevel-management135 | xdg-shell5 | xdg-shell / org.enlightenment.wm.Window.{M|Unm}aximize35 | ||
_NET_WM_STATE_MAXIMIZED_HORZ | xdg-shell / Window.get_maximized / Window.[un]maximize526 | KWin::Toplevel::clientMaximizedStateChanged / KWin::Toplevel::setMaximize28 | xdg-shell / KDE plasma-window-management15 | xdg-shell / wlr-foreign-toplevel-management135 | xdg-shell5 | xdg-shell / org.enlightenment.wm.Window.{M|Unm}aximize35 | ||
_NET_WM_STATE_SHADED | Window.is_shaded / Window.shade26 | KWin::Toplevel::shade28 | KDE plasma-window-management1 | |||||
_NET_WM_STATE_SKIP_TASKBARtaskbars themselves, and other shell elements | Window.is_skip_taskbar / WaylandClient.{hide_from|show_in}_window_list2627 | KWin::Toplevel::skipTaskbar28 | KDE plasma-shell / KDE plasma-window-management111 | |||||
_NET_WM_STATE_SKIP_PAGERtaskbars, and other shell elements | WaylandClient.{hide_from|show_in}_window_list2627 | KWin::Toplevel::skipPager28 | KDE plasma-shell / KDE plasma-window-management111 | |||||
_NET_WM_STATE_HIDDEN | /org/gnome/shell/Introspect / Window.is_hidden172226 | |||||||
_NET_WM_STATE_FULLSCREEN | xdg-shell / Window.is_fullscreen / Window.[un]make_fullscreen526 | KWin::Toplevel::fullScreen28 | xdg-shell / KDE plasma-window-management15 | GET_TREE / fullscreen | xdg-shell / wlr-foreign-toplevel-management135 | xdg-shell5 | xdg-shell5 | |
_NET_WM_STATE_ABOVE | xdg-shell / Window.is_above / Window.[un]make_above526 | KWin::Toplevel::keepAbove28 | xdg-shell / KDE plasma-shell / KDE plasma-window-management1511 | xdg-shell / wlr-layer-shell 5 | xdg-shell5 | xdg-shell5 | ||
_NET_WM_STATE_BELOW | KWin::Toplevel::keepBelow28 | KDE plasma-shell / KDE plasma-window-management111 | wlr-layer-shell5 | |||||
_NET_WM_STATE_DEMANDS_ATTENTIONIMs, terminal emulators, etc. | xdg-activation / Window.demands_attention / Window.set_demands_attention926 | KWin::Toplevel::demandsAttention28 | xdg-activation / KDE plasma-window-management19 | xdg-activation9 | ||||
_NET_WM_ACTION_MOVE | Window.allows_move26 | KWin::Toplevel::moveable28 | ||||||
_NET_WM_ACTION_RESIZE | Window.allows_resize26 | KWin::Toplevel::resizeable28 | ||||||
_NET_WM_ACTION_MINIMIZE | Window.can_minimize26 | KWin::Toplevel::minimizable28 | ||||||
_NET_WM_ACTION_SHADE | Window.can_shade26 | KWin::Toplevel::shadeable28 | ||||||
_NET_WM_ACTION_STICK | ||||||||
_NET_WM_ACTION_MAXIMIZE_HORZ | Window.can_maximize2629 | KWin::Toplevel::maximizable2829 | ||||||
_NET_WM_ACTION_MAXIMIZE_VERT | Window.can_maximize2629 | KWin::Toplevel::maximizable2829 | ||||||
_NET_WM_ACTION_FULLSCREEN | KWin::Toplevel::fullScreenable28 | |||||||
_NET_WM_ACTION_CHANGE_DESKTOP | ||||||||
_NET_WM_ACTION_CLOSE | Window.can_close26 | KWin::Toplevel::closeable28 | ||||||
_NET_WM_ACTION_ABOVE | ||||||||
_NET_WM_ACTION_BELOW | ||||||||
XAPP extensions | ||||||||
_NET_WM_XAPP_ICON_NAME | ||||||||
_NET_WM_XAPP_PROGRESS | com.canonical.Unity.LauncherEntry31 | |||||||
_NET_WM_XAPP_PROGRESS_PULSE | ||||||||
Keyboard | ||||||||
ChangeKeyboardMappinglayout switchers | ActivateInputSource3233 | |||||||
XKB | ||||||||
XkbLockGroup | ? | ? | ? | ? | ? | |||
Selections | ||||||||
PRIMARY | ||||||||
SECONDARY | ||||||||
CLIPBOARD | ||||||||
ConvertSelection | ||||||||
Managers | wlr-data-control | |||||||
XF86VIDMODE | ||||||||
ModeLinegames with strict resolution modes | KDE output-management / KDE outputdevice21 | |||||||
Gammaxbrightness, xgamma, redshift | KDE output-management | wlr-gamma-control | ||||||
Grabbing | ||||||||
Pointergames | ||||||||
Button | ||||||||
Keyboardgames, screen lockers, password prompts | xwayland-keyboard-grab | wlr-input-inhibitor, wlr-layer-shell45 | ||||||
Keyglobal hotkeys | GlobalShortcuts portal / registerShortcut28 | KDE keystate10 | bindsym | - | ||||
Queries | ||||||||
Tree | ||||||||
Pointeroneko | ||||||||
Keymap | ||||||||
Font | ||||||||
TextExtents | ||||||||
Colors | ||||||||
BestSize | ||||||||
Extension | ||||||||
Get | ||||||||
Geometry | /org/gnome/shell/Introspect / Window.get_frame_rect1718192026 | KWin::Toplevel::{frameGeometry|size|x|y}281920 | KDE plasma-window-management11920 | GET_TREE19 | ||||
XTEST | ||||||||
GetVersion | ||||||||
CompareCursor | ||||||||
FakeInputxdotool, showkey, remote desktop | KDE fake input | virtual-keyboard / wlr-virtual-pointer | ||||||
libinput15 | ||||||||
GrabControl | ||||||||
XEMBED | ||||||||
ReparentWindowtray, 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_DOCKtray icons embedding | SEGID_ICON | |||||||
StatusNotifierItemRegistered | ||||||||
MESSAGEballoon tooltips from tray icons | ||||||||
org.freedesktop.Notifications14 | ||||||||
Miscellanous | ||||||||
WM crash persistence | - | wl_display_reconnect2 | Session Recovery Extension2 | SHMIF | ||||
WM decorations | - | server-decoration | server-decoration | |||||
XShm (screen capture)screen shooters/capturers, color pickers, screen sharing | PipeWire, portals | KDE screencast (a PipeWire wrapper) | wlr-export-dmabuf / wlr-screencopy | |||||
Xinerama | KDE outputdevice | wlr-output-management | ||||||
DPMS | KDE DPMS | wlr-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.