Wayland - ArchWiki

Jump to content

# Wayland

From ArchWiki

Related articles

- Graphics processing unit
- KMS
- Xorg
- Screen capture#Wayland

Wayland is a display server protocol. It has been widely established as the successor of the X Window System [1] [2] [3] [4]. You can find a comparison between Wayland and Xorg on Wikipedia.

Display servers using the Wayland protocol are called compositors because they also act as compositing window managers. Below you can find a list of Wayland compositors.

For compatibility with native X11 applications to run them seamlessly, Xwayland can be used, which provides an X Server in Wayland.

## Requirements

Wayland is just the protocol, unlike Xorg it does not have a common "display server" to install. To use it, you only need a compatible display driver (this section) and a compositor (next section) or desktop environment (e.g. GNOME or Plasma) that implements the Wayland protocol. Most Wayland compositors only work on systems using Kernel mode setting.

For the GPU driver and Wayland compositor to be compatible they must support the same buffer API. There are two main APIs: GBM and EGLStreams.

Buffer API | GPU driver support | Wayland compositor support
--- | --- | ---
GBM | All except NVIDIA < 495* | All
EGLStreams | NVIDIA | GNOME

  * NVIDIA ≥ 495 supports both EGLStreams and GBM.[5]

Since NVIDIA introduced GBM support, many compositors (including Mutter and KWin) started using it by default for NVIDIA ≥ 495. GBM is generally considered better with wider support, and EGLStreams only had support because NVIDIA did not provide any alternative way to use their GPUs under Wayland with their proprietary drivers. Furthermore, KWin dropped support for EGLStreams after GBM was introduced into NVIDIA.

If you use a popular desktop environment/compositor and a GPU still supported by NVIDIA, you are most likely already using GBM backend. To check, run `journalctl -b 0 --grep "renderer for"`. To force GBM as a backend, set the following environment variables:

    GBM_BACKEND=nvidia-drm
    __GLX_VENDOR_LIBRARY_NAME=nvidia

## Compositors

See Window manager#Types for the difference between Stacking, Tiling and Dynamic.

### Stacking

- COSMIC Compositor — Compositor for the COSMIC desktop environment.

  https://github.com/pop-os/cosmic-comp || cosmic-comp

- hikari — wlroots-based compositor inspired by cwm which is actively developed on FreeBSD but also supports Linux.

  http://hikari.acmelabs.space/ || hikariAUR

- KDE KWin — See KDE#Starting Plasma.

  https://userbase.kde.org/KWin || kwin

- labwc — wlroots-based compositor inspired by Openbox.

  https://github.com/labwc/labwc || labwc

- Mutter — See GNOME#Starting.

  https://gitlab.gnome.org/GNOME/mutter || mutter

- waybox — a *box-style (minimalist) Wayland compositor modeled largely on Openbox

  https://github.com/wizbright/waybox || wayboxAUR

- wayfire — 3D compositor inspired by Compiz and based on wlroots.

  https://wayfire.org/ || wayfireAUR

- Weston — Wayland compositor designed for correctness, reliability, predictability, and performance.

  https://gitlab.freedesktop.org/wayland/weston || weston

- wio — wlroots-based compositor that aims to replicate the look and feel of Plan 9's Rio desktop.

  https://gitlab.com/Rubo/wio || wio-wlAUR

- wlmaker — wlroots-based compositor that's inspired by Window Maker.

  https://phkaeser.github.io/wlmaker/ || wlmakerAUR

- woodland — a minimal lightweight wlroots-based window-stacking compositor for Wayland, inspired by Wayfire and TinyWl.

  https://github.com/DiogenesN/woodland || woodlandAUR

### Tiling

- Cagebreak — Based on cage, inspired by ratpoison.

  https://github.com/project-repo/cagebreak || cagebreakAUR

- jay — A Wayland compositor, written in Rust. Appearance is based on the default i3 look and feel. Jay can be configured via a declarative TOML file or a shared library that gets injected into the compositor.

  https://github.com/mahkoh/jay || jayAUR

- IonWL — Manual tiling compositor. Follows Ion3's design with a comprehensive Python API.

  https://codeberg.org/ideasman42/IonWL || ionwl-gitAUR

- miracle-wm — A Wayland compositor based on Mir in the style of i3 and sway with the intention to be flashier and more feature-rich than either, like swayfx.

  https://github.com/miracle-wm-org/miracle-wm || miracle-wmAUR

- niri — A scrollable-tiling Wayland compositor.

  https://github.com/niri-wm/niri || niri

- Qtile — A full-featured, hackable tiling window manager and Wayland compositor written and configured in Python.

  https://github.com/qtile/qtile || qtile

- Sway — i3-compatible Wayland compositor based on wlroots.

  https://github.com/swaywm/sway || sway

- SwayFx — Sway, but with eye candy!

  https://github.com/WillPower3309/swayfx || swayfxAUR

- Velox — Simple window manager based on swc, inspired by dwm and xmonad.

  https://github.com/michaelforney/velox || velox-gitAUR

### Dynamic

- cwc — awesome-like Wayland compositor based on wlroots.

  https://cudiph.github.io/cwc/apidoc/ || cwcAUR

- MangoWM — A dwl-based compositor with a standard configuration file, an optional scrolling layout and support for eye candy.

  https://github.com/mangowm/mango || mangowmAUR

- dwl — dwm-like Wayland compositor based on wlroots.

  https://codeberg.org/dwl/dwl || dwlAUR

- Hyprland — A dynamic tiling Wayland compositor that does not sacrifice on its looks.

  https://hypr.land || hyprland

- japokwm — Dynamic Wayland tiling compositor based around creating layouts, based on wlroots.

  https://github.com/werererer/japokwm || japokwm-gitAUR

- River Classic — Dynamic tiling Wayland compositor inspired by dwm and bspwm.

  https://codeberg.org/river/river-classic || river-classic

- pinnacle-comp — A Smithay-based Wayland compositor, inspired by AwesomeWM and configured in Lua or Rust

  https://github.com/pinnacle-comp/pinnacle || pinnacle-compAUR

### Other

- Cage — Displays a single fullscreen application like a kiosk.

  https://www.hjdskes.nl/projects/cage/ || cage

- GNOME Kiosk — Mutter based compositor that provides an environment suitable for fixed purpose, or single application deployments like wall displays and point-of-sale systems.

  https://gitlab.gnome.org/GNOME/gnome-kiosk || gnome-kioskAUR

- phoc — A tiny wlroots-based compositor for mobile devices.

  https://gitlab.gnome.org/World/Phosh/phoc || phoc

- Wayback — X11 compatibility layer which allows for running full X11 desktop environments using Wayland components. It is experimental, in the early stage of development.

  https://wayback.freedesktop.org/ || wayback-x11AUR

- River — A non-monolithic Wayland compositor. Unlike other Wayland compositors, it does not combine the compositor and window manager into one program. Instead, users can choose any window manager implementing the river-window-management-v1 protocol.

  https://isaacfreund.com/software/river/ || river

Some of the above may support display managers. Check `/usr/share/wayland-sessions/compositor.desktop` to see how they are started.

## Display managers

Display managers listed below support launching Wayland compositors.

Name | Runs on | Description
--- | --- | ---
emptty | tty | Simple CLI Display Manager on TTY.
GDM | Wayland | GNOME display manager.
greetd | Wayland/Xorg/tty See Greetd#Greeters. | Minimal and flexible login daemon.
lemurs | tty | TUI display manager written in Rust.
lidmAUR | tty | A fully colorful customizable TUI display manager made in C.
LightDM | Xorg[6] | Cross-desktop display manager.
ly | tty | TUI display manager written in Zig
SDDM | Wayland/Xorg | QML-based display manager.
tbsmAUR | tty | Simple CLI session launcher written in pure bash.
uwsm | tty | Session and XDG autostart manager for standalone compositors. Provides a TUI menu, but can also be used with other display managers.

## Xwayland

Xwayland(1) is an X server that runs under Wayland and provides compatibility for native X11 applications that are yet to provide Wayland support. To use it, install the xorg-xwayland package.

Xwayland is started via a compositor, so you should check the documentation for your chosen compositor for Xwayland compatibility and instructions on how to start Xwayland.

Note

- Security: Xwayland is an X server, so it does not have the security features of Wayland.
- Performance: Xwayland has a nearly identical performance to that of X11, in most cases.
- Compatibility: Xwayland is not fully backward compatible with X11. Some applications may not work properly under Xwayland.

### Wayback

Wayback (wayback-x11AUR, wayback-x11-gitAUR), is an X11 compatibility layer which allows for running full X11 desktop environments using Wayland components. It is intended to eventually replace the classic X.Org server, thus reducing maintenance burden of X11 applications.

### NVIDIA driver

Note NVIDIA drivers prior to version 470 (e.g. nvidia-390xx-dkmsAUR) do not support hardware accelerated Xwayland, causing non-Wayland-native applications to suffer from poor performance in Wayland sessions.

Enabling DRM KMS is required. There may be additional information in the official documentation regarding your display manager (e.g. GDM).

### Detect Xwayland applications

To determine whether an application is running via Xwayland, you can use xorg-xeyes and see if the eyes are moving, when moving the mouse pointer over an application window.

Another option is to run xwininfo (from xorg-xwininfo) in a terminal window: when hovering over an Xwayland window the mouse pointer will turn into a + sign. If you click the window it will display some information and end, but it will not do anything with native Wayland windows.You can use `Ctrl+C` to end it.

You can also use xlsclients (from the xorg-xlsclients package). To list all applications running via Xwayland, run `xlsclients -l`.

Alternatively, you can start extramausAUR and move your mouse pointer over the window of an application. If the red mouse moves, the application is running via Xwayland.

Tip For KDE Plasma, you can also inspect windows with KDE#KWin debug console.

## GUI libraries

### GTK

The gtk3 and gtk4 packages have the Wayland backend enabled. GTK will default to the Wayland backend, but it is possible to override it to Xwayland by modifying an environment variable: `GDK_BACKEND=x11`.

For theming issues, see GTK#Wayland backend.

### Qt

To enable Wayland support in Qt 5, install the qt5-wayland package. Qt 5 applications will then run under Wayland on a Wayland session.

While it should not be necessary, to explicitly run a Qt application with the Wayland plugin [7], use `-platform wayland` or `QT_QPA_PLATFORM=wayland` environment variable.

To force the usage of X11 on a Wayland session, use `QT_QPA_PLATFORM=xcb`.

This might be necessary for some proprietary applications that do not use the system's implementation of Qt. `QT_QPA_PLATFORM="wayland;xcb"` allows Qt to use the xcb (X11) plugin instead if Wayland is not available.[8]

Due to the Incorrect sizing and bad text rendering with WebEngine using fractional scaling on Wayland Qt WebEngine bug, applications using Qt WebEngine, for example Calibre, may display jagged fonts. A workaround is launching the application with `QT_SCALE_FACTOR_ROUNDING_POLICY=RoundPreferFloor`. This prevents the application window being fractional scaled.

### Clutter

The Clutter toolkit has a Wayland backend that allows it to run as a Wayland client. The backend is enabled in the clutterAUR package.

To run a Clutter application on Wayland, set `CLUTTER_BACKEND=wayland`.

### SDL

In SDL3, Wayland is used by default if the compositor supports the fifo-v1 protocol. [9] Otherwise, X11 and Wayland are tried in order. Either can be forced either using the `SDL_VIDEO_DRIVER=x11` or `SDL_VIDEO_DRIVER=wayland` environment variables respectively (or, with a lower precedence, the SDL2 environment variable below)[10].

sdl2-compat follows the SDL3 rules above, barring application-specific exceptions. As for SDL2 proper (e.g. sdl2AUR), set `SDL_VIDEODRIVER=wayland`. `SDL_VIDEODRIVER="wayland,x11"` allows SDL2 to use the x11 video driver instead if Wayland is not available.[11]. You may also want to install libdecor to enable window decorations (for example, on GNOME).

Refer to the official documentation for more details.

### GLFW

The glfw package has support for Wayland, and uses the Wayland backend if the environment variable `XDG_SESSION_TYPE` is set to `wayland` and the application developer has not set a specific desired backend.

See the source code for more information.

### GLEW

If the glew-wayland-gitAUR package does not work with the needed GLEW-based applications, the option is to use glew with Xwayland. See FS#62713.

### EFL

Enlightenment has complete Wayland support.

To run an EFL-based application on Wayland, set `ELM_DISPLAY=wl`.

### winit

Winit is a window handling library in Rust. It will default to the Wayland backend, but it is possible to override it to Xwayland by modifying environment variables:

- Prior to version 0.29.2, set `WINIT_UNIX_BACKEND=x11`
- For version 0.29.2 and higher, unset `WAYLAND_DISPLAY`, which forces a fallback to X using the `DISPLAY` variable. [12]

### Electron

Note In Plasma, some Electron applications can use the wrong icon (default Wayland one) for the window, while using the correct icon for the taskbar. To fix that, you can create a special application/window rule, forcing the desktop file name on such applications.

Wayland support can be activated using command line flags, or an environment variable.

#### Command line flags

Note Some packages do not forward flags to Electron, and thus will need the application developer to implement a solution.

See Chromium#Native Wayland support to command-line flags needed to work on Wayland. Note that the command-line flag `--ozone-platform-hint=auto` does not work since Electron 38.

You can pass these flags manually, persist them in an Electron configuration file, or override the .desktop file at ~/.local/share/applications of an application by adding the flags to the end of the `Exec=` line.

The factual accuracy of this article or section is disputed.

Reason: Old version of Electron needs `--enable-features=WebRTCPipeWireCapturer` But what version is it enable by default? Also default behavior of Electron vendored by non-free software would be wrong. (Discuss in Talk:Wayland)

Electron enable WebRTC screen capture over PipeWire by default. The capture is based on xdg-desktop-portal.

A case of missing top bars can be solved by using: `--enable-features=WaylandWindowDecorations`. This will typically be necessary under GNOME (supported since electron17).

#### Environment variable

Applications using Electron between versions 28 and 37 can use the environment variable `ELECTRON_OZONE_PLATFORM_HINT` set to `auto` or `wayland`.

This takes lower priority than the command line flags.

### Java

The open source implementation of the Java platform OpenJDK, does not yet have native support for Wayland. Until Wakefield, the project that aims to implement Wayland in OpenJDK, is available, Xwayland can be used but, may lead to nothing displaying with certain applications such as netbeans and oracle-datamodelerAUR.

See Debian:Wayland#Java Programs (supported since OpenJDK 16?):

  Starting with OpenJDK 16, the JRE can dynamically load GTK3 (which has Wayland support), it appears this might be supported according to this discussion.
  The `_JAVA_AWT_WM_NONREPARENTING` environment variable can be set to "1" to fix misbehavior where the application starts with a blank screen.

Since XWayland does not have full feature parity with Wayland, WLToolkit can be used to fill the gaps while Wakefield is not ready. It can be activated with `-Dawt.toolkit.name=WLToolkit`. Some programs such as the JetBrains IDEs support it.

## Tips and tricks

### Automation

- ydotool (ydotool) - Generic command-line automation tool (not limited to wayland). Enable/start the `ydotool.service` user unit. See ydotoold(8), ydotool(1).
- wtype (wtype) - xdotool type for wayland. See wtype(1).
- keyboard - Python library that works on Windows and Linux with experimental OS X support. Also see the mouse library.
- wlrctl (wlrctlAUR) - A command line utility for miscellaneous wlroots extensions (supports the foreign-toplevel-management, virtual-keyboard, virtual-pointer)

### Remap keyboard or mouse keys

See Input remap utilities.

### Screencast

See Screen capture#Screencasting and Screen capture#Screencast Wayland windows with X11 applications.

### Persist clipboard after app close

This article or section is a candidate for merging with Clipboard.

Notes: This is a standard behavior even on Xorg. There are many other clipboard managers. (Discuss in Talk:Wayland)

Due to Wayland's design philosophy, clipboard data is stored in the memory of the source client. When the client closes, the clipboard data is lost. You can solve this using wl-clip-persist, which runs in the background to reads the clipboard data and stores it in its own memory, separate from the source client.

### Autostart wayland compositor as systemd service

Note Universal Wayland Session Manager automatically generates systemd units for your compositors, moreover it helps you to integrate graphical applications with systemd.

If you do not want to use a display manager or a shell, you can autostart your Wayland compositor with a systemd service. Adjust the `ExecStart` line with the compositor you want to use. Here is an example for KDE Plasma:

    /etc/systemd/system/wayland-compositor.service

    [Unit]
    After=graphical.target systemd-user-sessions.service modprobe@drm.service
    Conflicts=getty@tty1.service

    [Service]
    User=username
    WorkingDirectory=~

    PAMName=login
    TTYPath=/dev/tty1
    UnsetEnvironment=TERM

    StandardOutput=journal
    ExecStart=/usr/lib/plasma-dbus-run-session-if-needed /usr/bin/startplasma-wayland

    [Install]
    WantedBy=graphical.target

### Use another renderer for wlroots based compositor

You can use another wlroots renderer such as vulkan by specifying the `WLR_RENDERER` environment variable for wlroots based compositor. The list of available ones is on the wlroots documentation.

### Specifying the primary graphics cards on wlroot based compositor

If your device has Hybrid graphics , then you can use `WLR_DRM_DEVICES` environment variable to specifies primary graphics cards according to the wlroots documentation

Example:

    WLR_DRM_DEVICES='/dev/dri/card1:/dev/dri/card2:/dev/dri/card0'

## Troubleshooting

### Color correction

See Backlight#Color correction.

### Slow motion, graphical glitches, and crashes

Gnome-shell users may experience display issues when they switch to Wayland from X. One of the root cause might be the `CLUTTER_PAINT=disable-clipped-redraws:disable-culling` set by yourself for Xorg-based gnome-shell. Just try to remove it from `/etc/environment` or other rc files to see if everything goes back to normal.

### Remote display

- wlroots0.18 and wlroots0.19 (used by sway) offers a VNC backend via wayvnc since version 0.10. RDP backend has been removed [13].
- mutter has now remote desktop enabled at compile time, see [14] and gnome-remote-desktop for details.
- krfb offers a VNC server for kwin. `krfb-virtualmonitor` can be used to set up another device as an extra monitor.
- There was a merge of FreeRDP into Weston in 2013, enabled via a compile flag. The weston package has it enabled since version 6.0.0.
- waypipe (or waypipe-gitAUR) is a transparent proxy for Wayland applications, with a wrapper command to run over SSH
  - Here is an example for launching a remote KDE kcalc under Plasma:

        $ waypipe ssh example.local env QT_QPA_PLATFORM=wayland QT_QPA_PLATFORMTHEME=KDE dbus-launch kcalc

### Input grabbing in games, remote desktop and VM windows

In contrast to Xorg, Wayland does not allow exclusive input device grabbing, also known as active or explicit grab (e.g. keyboard, mouse), instead, it depends on the Wayland compositor to pass keyboard shortcuts and confine the pointer device to the application window.

This change in input grabbing breaks current applications' behavior, meaning:

- Hotkey combinations and modifiers will be caught by the compositor and will not be sent to remote desktop and virtual machine windows.
- The mouse pointer will not be restricted to the application's window which might cause a parallax effect where the location of the mouse pointer inside the window of the virtual machine or remote desktop is displaced from the host's mouse pointer.

Wayland solves this by adding protocol extensions for Wayland and Xwayland. Support for these extensions is needed to be added to the Wayland compositors. In the case of native Wayland clients, the used widget toolkits (e.g GTK, Qt) needs to support these extensions or the applications themselves if no widget toolkit is being used. In the case of Xorg applications, no changes in the applications or widget toolkits are needed as the Xwayland support is enough.

These extensions are already included in wayland-protocols, and supported by xorg-xwayland.

The related extensions are:

- Xwayland keyboard grabbing protocol
- Compositor shortcuts inhibit protocol
- Relative pointer protocol
- Pointer constraints protocol

Supporting Wayland compositors:

- Mutter, GNOME's compositor since release 3.28
- wlroots supports relative-pointer and pointer-constraints
- Kwin
  - KDE#X11 shortcuts conflict on Wayland
  - Keyboard shortcuts inhibit

Supporting widget toolkits:

- GTK since release 3.22.18.

### GTK themes not working

See https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland.

### Avoid loading NVIDIA modules

Add `__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json` as environment variable before launching a Wayland compositor like sway.

### Magnifying/surface scaling

Screen magnifying is not solved yet, a pull request was merged mid-2022 providing the protocol wp-surface-scale.

### Wayland lag/stuttering since kernel 6.11.2 (AMD)

Until this issue is patched in future kernel releases, a workaround is to add `amdgpu.dcdebugmask=0x400` to the cmdline.

See: https://community.frame.work/t/wayland-lag-stuttering-since-kernel-6-11-2/59422

### Games / applications suspended when changing a virtual desktop

This article or section needs expansion.

Reason: Add more information and reference to upstream documentation here if found: the feature is elusive and seems poorly documented. (Discuss in Talk:Wayland)

When changing workspace or using `Alt+Tab`, games (and possibly other graphical applications) are suspended, put in some weird state, and they (partially) stop. This includes VRR applications and applications with VSync turned on but is not limited to them only. Symptoms include things like audio dropping (partially) out, game not progressing, ping times rising high or network dropping out, but only if the game window is not in focus. This may only affect applications with VSync on.

It is possible some games can work around this issue by changing to a window, but some do not. This is extremely annoying in more complex games which require heavy usage of web browsing, documentation and 3rd party tools or if the gameplay is interrupted for some reason.

Possible workaround include setting environment variables `MESA_VK_WSI_PRESENT_MODE=immediate` and/or `vk_xwayland_wait_ready=false`, but setting these will break any VSync or VRR implementations.

## See also

- Wayland documentation online
- Official repository
- Fedora:How to debug Wayland problems
- We are Wayland now! - An updated version of "Are we Wayland yet?"
- Awesome Wayland projects
- Cursor themes
- Arch Linux forum discussion
- i3 Migration Guide - Common X11 apps used on i3 with Wayland alternatives
- Wayland Explorer - A better way to read Wayland documentation
- How can I tell if an application is using XWayland

Category:

- Wayland

Hidden categories:

- Pages or sections flagged with Template:Accuracy
- Pages or sections flagged with Template:Merge
- Pages or sections flagged with Template:Expansion

Wayland
Add topic