Using Wayland: Difference between revisions

From DcSharedWiki
(42 intermediate revisions by the same user not shown)
Line 3: Line 3:
The goal of this page is to relate experiences using Wayland working implementations, software replacement from the X11 world and so on.
The goal of this page is to relate experiences using Wayland working implementations, software replacement from the X11 world and so on.


Duck: also please note I'm an AwesomeWM user so I'm not looking into major desktop implementations like GNOME or KDE but more on mixing interesting pieces to fit your needs better. You can have a look at my configuration [https://vcs-git-viewer.duckcorp.org/?p=people/duck/duckland-infra.git;a=tree in my repository] (Ansible rules).
Duck: please note I'm a former AwesomeWM user thus I'm not looking into major desktop implementations like GNOME or KDE but I'm trying to mix interesting pieces to fit my needs better. You can have a look at my configuration [https://vcs-git-viewer.duckcorp.org/?p=people/duck/duckland-infra.git;a=tree in my repository] (Ansible rules).


== Compositors ==
== Compositors ==
Line 12: Line 12:


=== [https://swaywm.org/ Sway] ===
=== [https://swaywm.org/ Sway] ===
(updated for 1.2)
(updated for 1.6)


Status: very active project, created a wlroots framework to share with other compositors, version 1.1+ is usable with some glitches, seamless xwayland integration
Status: very active project, created a wlroots framework to share with other compositors, version 1.1+ is usable with some glitches, seamless xwayland integration
Line 19: Line 19:


Notable problems:
Notable problems:
* <del>copy-paste problems between Wayland and XWayland ([https://github.com/swaywm/sway/issues/5852 segfaults], [https://github.com/swaywm/wlroots/issues/2425 freezes], or [https://github.com/swaywm/sway/issues/4007 simply stops working])</del> mostly fixed in 1.6, experiencing hangs while pasting into certain apps (FF, Thunderbird, maybe Signal-desktop)
* [https://github.com/swaywm/sway/issues/3395 damage tracking issues with xwayland] (ugly but not not annoying with most applications)
* games under Wine may hang if run fullscreen and switching workspace (but windowed using the full screen size often works; using a virtual desktop is also a working option)
* contextual windows in need of relative positioning are not displayed or not at the right location (tray contextual menu, IM selections)
* games under Wine may not draw or grab input correctly if run fullscreen (but windowed using the full screen size is fine and anyway often better especially with older games when you switch back and forth between workspaces)
* [https://github.com/swaywm/sway/issues/4078 rendering issues] (most glitches do not have any real impact)
* [https://github.com/swaywm/sway/issues/2425 dialogs hidden under their parent] (annoying with specific applications relying on child windows but most don't and there is a workaround)
* [https://github.com/swaywm/sway/issues/2425 dialogs hidden under their parent] (annoying with specific applications relying on child windows but most don't and there is a workaround)
* contextual popup or menu not working yet (affects tray and IME completion selection, see below for IME solutions)

Tools:
* swaybar (display workspaces, current window title, tray, time, CPU infos…)
** integrated with sway, can use various commands to display stuff (i3status works fine and is packaged in Debian)
** Status: works fine but [https://github.com/swaywm/sway/issues/3799 tray support is limited] (icon may be missing, contextual menu not working, WIP)
* [https://github.com/Alexays/Waybar.git Waybar] (more fancy bar)
** not packaged in Debian
** Status: tested only a short time, tray working better than swaybar but contextual menu currently displayed in the middle of the screen, [https://github.com/Alexays/Waybar/issues/223 passing TZ to clock widget is not yet implemented]
* swaylock (lock screen)
** packaged in Debian
** Status: works fine
* swayidle (run custom actions on idle and back from idle)
** packaged in Debian
** Status: works fine and handle various events but [https://github.com/swaywm/swayidle/pull/26 does not implement the inhibit mode] (like while watching a movie)
* remote control (RDP headless backend, not network transparency)
** integrated in sway
** Status: finished, untested


=== [http://way-cooler.org/ Way Cooler] (spiritual successor of AwesomeWM) ===
=== [http://way-cooler.org/ Way Cooler] (spiritual successor of AwesomeWM) ===


Status: being rewritten on top of wlroots, far from being usable yet (as of early 2019)
Status: was being rewritten on top of wlroots but was [http://way-cooler.org/blog/2020/01/09/way-cooler-post-mortem.html unfortunately abandoned] at the beginning of 2020. I need some time to cope with the sadness and remove this entry.


== Tools ==
== Tools ==
Line 50: Line 32:
=== Display Manager ===
=== Display Manager ===


* lightdm:
* lightdm: {{x11}}
** packaged in Debian
** packaged in Debian
** Status: works fine to run Wayland sessions but runs on X11 itself
** Status: works fine to run Wayland sessions but runs on X11 itself. [https://github.com/canonical/lightdm/issues/63 Input devices might be missing in the Wayland session] but switching VT back and forth fixes the situation.
* [https://sr.ht/~kennylevinsen/greetd/ greetd]: {{wayland}}
** not packaged in Debian
**: Status: unknown, in the TODOLIST

=== Bars ===

* swaybar: {{wayland}} (display workspaces, current window title, tray, time, CPU infos…)
** integrated with sway, can use various commands to display stuff (i3status works fine and is packaged in Debian)
** Status: works fine but [https://github.com/swaywm/sway/issues/3799 tray support is limited] (icon may be missing, contextual menu not working, WIP)
* [https://github.com/Alexays/Waybar.git Waybar]: {{wayland}} (more fancy bar)
** packaged in Debian
** Status: tested only a short time, tray working better than swaybar, [https://github.com/Alexays/Waybar/issues/668 the date module is not compiled])

=== Session ===

* swaylock: {{wayland}} (lock screen)
** packaged in Debian
** Status: works fine
* swayidle: {{wayland}} (run custom actions on idle and back from idle)
** packaged in Debian
** Status: works fine and handle various events


=== Application Menu Runner ===
=== Application Menu Runner ===


* wofi: {{wayland}}
* j4-dmenu-desktop + [https://github.com/Cloudef/bemenu.git bemenu]:
** packaged in Debian
** Status: works fine
** Usage: wofi --term=x-terminal-emulator
* j4-dmenu-desktop + [https://github.com/Cloudef/bemenu.git bemenu]: {{x11}} {{wayland}}
** j4-dmenu-desktop only is packaged in Debian
** j4-dmenu-desktop only is packaged in Debian
** Status: works fine
** Status: works fine
** Usage: j4-dmenu-desktop --dmenu='bemenu --list 10 --wrap --ignorecase --no-overlap --prompt "Run:" --fn "pango:DejaVu Sans Mono 12"' --term=x-terminal-emulator
** Usage: j4-dmenu-desktop --dmenu='bemenu --list 10 --wrap --ignorecase --no-overlap --prompt "Run:" --fn "pango:DejaVu Sans Mono 12"' --term=x-terminal-emulator
* dmenu:
* dmenu: {{x11}}
** packaged in Debian (suckless-tools)
** packaged in Debian (suckless-tools)
** Status: works fine but impossible to switch back to it if you loose focus (need to kill it in a term)
** Status: works fine but impossible to switch back to it if you loose focus (need to kill it in a term)
** Usage: dmenu_path | dmenu -p "Run:" -l 10 | xargs swaymsg exec
** Usage: dmenu_path | dmenu -p "Run:" -l 10 | xargs swaymsg exec


=== Notifications ===
=== Notifications / Screen Overlay ===


* [https://github.com/emersion/mako.git mako]:
* [https://github.com/emersion/mako.git mako]: {{wayland}} (notifications):
** not packaged in Debian
** packaged in Debian (mako-notifier)
** works fine
** works fine
* wob: {{wayland}} (progressbar)
* xfce4-notifyd:
** packaged in Debian
** Status: works fine
* xfce4-notifyd: {{x11}} (notifications):
** packaged in Debian
** packaged in Debian
** Status: works fine but display in the middle of the screen thus not very practical
** Status: works fine but display in the middle of the screen thus not very practical
Line 76: Line 86:
=== Input Method ===
=== Input Method ===


* fcitx5: {{x11}} {{wayland}}
* fcitx4:
** packaged in Debian
** Status: untouched config from X11 works but completion menu may not be displayed (it works on one machine and not another but I could not figure out why yet); running ''fcitx-autostart'' fixed it (you may need to ``killall fcitx`` first)
* fcitx5:
** has Wayland support
** has Wayland support
** packaged in Debian (now includes the [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=974894 mozc binding] patch)
** only the core is packaged in Debian
** Status: works fine with both Wayland and X11 applications but selection popup does not show up ([https://github.com/swaywm/wlroots/pull/2550 input_method_v2 popups is implemented in wlroots] but [https://github.com/swaywm/sway/pull/5890 support in sway is WIP])
** Status: i was not able to make it work and quit
* fcitx4: {{x11}}
* ibus:
** packaged in Debian
** packaged in Debian
** Status: untouched config from X11 works but completion menu may not be displayed; running ''fcitx-autostart'' fixed it (you may need to ''killall fcitx'' first)
** Status: ibus-wayland is available and was switched to using a newer version of the wayland input protocol (see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=905001 Debian#905001] and linked upstream BR) but Sway use an even newer version (and this one only); anyway these changes are mostly untested so I would not have too much hopes; without this plugin I was not able to make completion work at all, even when forcing the engine on the command-line
* ibus: {{x11}} {{wayland}}
** packaged in Debian
** Status: ibus-wayland is available and was switched to using a newer version of the wayland input protocol (see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=905001 Debian#905001] and linked upstream BR) but Sway use an even newer version (and this one only); I was not able to make completion work at the time but the bug is closed and I guess it's working now but I have not tested it.


So here are the various protocols:
So here are the various protocols:
Line 94: Line 104:
=== Terminal ===
=== Terminal ===


* alacritty: {{x11}} {{wayland}}
* termite: (native Wayland support)
** [https://salsa.debian.org/rust-team/debcargo-conf/-/tree/master/src/alacritty-terminal packaging in Debian is WIP]
** Status: works fine but [https://github.com/alacritty/alacritty/issues/1101 lacks IME support]
* foot: {{wayland}}
** packaged in Debian
** Status: works fine but lacked IME support; it was [https://codeberg.org/dnkl/foot/issues/134 recently fixed upstream], now waiting for a release and new package
* termite: {{warning}} [https://github.com/thestinger/termite/#termite-is-obsoleted-by-alacritty abandoned in favor of alacritty]
** not packaged in Debian and requires a patched libvte
** not packaged in Debian and requires a patched libvte
** works fine
** Status: works fine
* xfce4-terminal:
* xfce4-terminal: {{x11}} {{wayland}}
** packaged in Debian
** packaged in Debian
** Status: works fine
** Status: works fine
* terminator:
* terminator: {{x11}} {{wayland}}
** packaged in Debian
** packaged in Debian
** Status: works fine (with Sway >=1.1)
** Status: works fine (with Sway >=1.1)
Line 106: Line 122:
=== Screen Capture ===
=== Screen Capture ===


* grim: (screenshot)
* grim: {{wayland}} (screenshot)
** packaged in Debian
** packaged in Debian
** Status: works fine
** Status: works fine
* wf-recorder: {{wayland}} (screen recorder)
** packaged in Debian
** Status: works fine
* xdg-desktop-portal-wlr: {{wayland}} (screenshot, screencast, and possibly remote-desktop)
** packaged in Debian
** Status: [https://github.com/emersion/xdg-desktop-portal-wlr/wiki/Screencast-Compatibility experimental], requires pipewire >=0.3 and FF >=84; tested screencast with FF and GMeet, it worked but takes a few seconds to initialize and sometimes hang and it may not be possible to get it to work again withotu restarting Sway; currently [https://github.com/emersion/xdg-desktop-portal-wlr/issues/107 sharing a specific window or output] is not yet possible.


=== Screen Brightness ===
=== Screen Brightness ===


* light:
** packaged in Debian
** Status: works fine
* brightnessctl:
* brightnessctl:
** packaged in Debian (brightness-udev is needed to be usable as non-root)
** packaged in Debian (brightness-udev is needed to be usable as non-root)
Line 118: Line 143:
=== Browser ===
=== Browser ===


* firefox:
* firefox: {{x11}} {{wayland}}
** packaged in Debian
** packaged in Debian
** Status: works fine on XWayland, seems to be ok so far on Wayland but [https://bugzilla.mozilla.org/show_bug.cgi?id=635134 officially it is still WIP]
** Status: works fine on XWayland, works fine on Wayland too but [https://bugzilla.mozilla.org/show_bug.cgi?id=635134 officially it is still WIP]
* chromium:
* chromium: {{x11}} {{wayland}}
** packaged in Debian
** packaged in Debian
** Status: works fine on XWayland, [https://bugs.chromium.org/p/chromium/issues/detail?id=578890 native Wayland support is WIP]
** Status: works fine on XWayland, [https://bugs.chromium.org/p/chromium/issues/detail?id=578890 native Wayland support is WIP]

=== Electron Apps ===

The [https://www.electronjs.org/ Electron]framework is based on Chromium/Ozone which now has a Wayland backend. [https://github.com/electron/electron/issues/10915 Support in Electron] came in version 12 which enables Ozone. Detection of Wayland environment is not automatic yet. Currently [https://github.com/electron/electron/issues/27522 Electron does not support client-side decorations] at the moment, but on tiling compositors like Sway that's not a problem though. Moreover IME are not working yet.

To enable Wayland on the following applications you need to add the following options on the command line (or edit you .desktop file): --enable-features=UseOzonePlatform --ozone-platform=wayland

* signal-desktop: {{x11}}
** not packaged in Debian but upstream provides a package for Ubuntu that works on Debian
** Status: works fine on XWayland, [https://github.com/signalapp/Signal-Desktop/issues/3411 native Wayland support is WIP] and working fine so far
* [https://vscodium.com/ VSCodium]: {{x11}} (OpenSource distribution of Visual Studio Code without telemetry and tracking)
** not packaged in Debian but upstream provides a working package
** Status: works fine on XWayland, [https://github.com/microsoft/vscode/issues/109176 native Wayland support is WIP] and working fine so far

=== Misc Apps ===

* Emacs: {{x11}}
** packaged in Debian
** Status: works fine on XWayland, since [https://emacshorrors.com/posts/psa-emacs-is-not-a-proper-gtk-application.html it is not a real GTK application] Wayland support is a tricky problem but there's [https://lwn.net/Articles/843896/ hope of a real GTK port] which would bring Wayland support
* libreoffice: {{x11}} {{wayland}}
** packaged in Debian
** Status: works fine on XWayland, native Wayland support if using the GTK3 backend (with the extra ''libreoffice-gtk3'' package) and working well too
* [https://github.com/Blub/netevent netevent]: (Input-Event device cloning utility)
** use case: if you wish to control several machines with the same keyboard and mouse, like with a KVM switch, then you can use devices from one to control others and switch machine using a special key
** not packaged in Debian but materials provided upstream (needs [https://github.com/Blub/netevent/pull/15 this update though])
** Status: works fine
* thunderbird: {{x11}} {{wayland}}
** packaged in Debian
** Status: works fine on XWayland, works ok now on Wayland but [https://bugzilla.mozilla.org/show_bug.cgi?id=635134 officially it is still WIP]
* wl-gammactl: {{wayland}}
** not packaged in Debian
** Status: works fine
* wl-clipboard: {{wayland}}
** packaged in Debian
** Status: works fine


== Workarounds ==
== Workarounds ==
Line 133: Line 193:
Currently this works fine (in ''~/.xsessionrc''):
Currently this works fine (in ''~/.xsessionrc''):
# ensure GUI frameworks use Wayland
# ensure GUI frameworks use Wayland
#export GDK_BACKEND=wayland # breaks a few apps or behaviors (Firefox, Signal…)
# breaks a few apps or behaviors (Chromium, Emacs…)
export GDK_BACKEND=wayland
export CLUTTER_BACKEND=wayland
export CLUTTER_BACKEND=wayland
export QT_QPA_PLATFORM=wayland-egl
export QT_QPA_PLATFORM=wayland-egl
# breaks a few apps or behaviors (Unity…)
export SDL_VIDEODRIVER=wayland
#export SDL_VIDEODRIVER=wayland
export ELM_DISPLAY=wl
# enable Wayland on Mozilla apps
export MOZ_ENABLE_WAYLAND=1
export MOZ_WEBRENDER=1


=== Java Applications ===
=== Java Applications ===

Revision as of 11:31, 23 November 2021

Introduction

The goal of this page is to relate experiences using Wayland working implementations, software replacement from the X11 world and so on.

Duck: please note I'm a former AwesomeWM user thus I'm not looking into major desktop implementations like GNOME or KDE but I'm trying to mix interesting pieces to fit my needs better. You can have a look at my configuration in my repository (Ansible rules).

Compositors

There's many Wayland compositor projects around but a lot are very experimental and many even already abandoned.

Working or prospective compositors follows.

Sway

(updated for 1.6)

Status: very active project, created a wlroots framework to share with other compositors, version 1.1+ is usable with some glitches, seamless xwayland integration

Packaging: in Debian with wlroots and swaybg

Notable problems:

  • copy-paste problems between Wayland and XWayland (segfaults, freezes, or simply stops working) mostly fixed in 1.6, experiencing hangs while pasting into certain apps (FF, Thunderbird, maybe Signal-desktop)
  • games under Wine may hang if run fullscreen and switching workspace (but windowed using the full screen size often works; using a virtual desktop is also a working option)
  • dialogs hidden under their parent (annoying with specific applications relying on child windows but most don't and there is a workaround)
  • contextual popup or menu not working yet (affects tray and IME completion selection, see below for IME solutions)

Way Cooler (spiritual successor of AwesomeWM)

Status: was being rewritten on top of wlroots but was unfortunately abandoned at the beginning of 2020. I need some time to cope with the sadness and remove this entry.

Tools

Display Manager

Bars

  • swaybar: Wayland (display workspaces, current window title, tray, time, CPU infos…)
    • integrated with sway, can use various commands to display stuff (i3status works fine and is packaged in Debian)
    • Status: works fine but tray support is limited (icon may be missing, contextual menu not working, WIP)
  • Waybar: Wayland (more fancy bar)

Session

  • swaylock: Wayland (lock screen)
    • packaged in Debian
    • Status: works fine
  • swayidle: Wayland (run custom actions on idle and back from idle)
    • packaged in Debian
    • Status: works fine and handle various events

Application Menu Runner

  • wofi: Wayland
    • packaged in Debian
    • Status: works fine
    • Usage: wofi --term=x-terminal-emulator
  • j4-dmenu-desktop + bemenu: X11 Wayland
    • j4-dmenu-desktop only is packaged in Debian
    • Status: works fine
    • Usage: j4-dmenu-desktop --dmenu='bemenu --list 10 --wrap --ignorecase --no-overlap --prompt "Run:" --fn "pango:DejaVu Sans Mono 12"' --term=x-terminal-emulator
  • dmenu: X11
    • packaged in Debian (suckless-tools)
    • Status: works fine but impossible to switch back to it if you loose focus (need to kill it in a term)
    • Usage: dmenu_path | dmenu -p "Run:" -l 10 | xargs swaymsg exec

Notifications / Screen Overlay

  • mako: Wayland (notifications):
    • packaged in Debian (mako-notifier)
    • works fine
  • wob: Wayland (progressbar)
    • packaged in Debian
    • Status: works fine
  • xfce4-notifyd: X11 (notifications):
    • packaged in Debian
    • Status: works fine but display in the middle of the screen thus not very practical

Input Method

  • fcitx5: X11 Wayland
  • fcitx4: X11
    • packaged in Debian
    • Status: untouched config from X11 works but completion menu may not be displayed; running fcitx-autostart fixed it (you may need to killall fcitx first)
  • ibus: X11 Wayland
    • packaged in Debian
    • Status: ibus-wayland is available and was switched to using a newer version of the wayland input protocol (see Debian#905001 and linked upstream BR) but Sway use an even newer version (and this one only); I was not able to make completion work at the time but the bug is closed and I guess it's working now but I have not tested it.

So here are the various protocols:

Terminal

Screen Capture

  • grim: Wayland (screenshot)
    • packaged in Debian
    • Status: works fine
  • wf-recorder: Wayland (screen recorder)
    • packaged in Debian
    • Status: works fine
  • xdg-desktop-portal-wlr: Wayland (screenshot, screencast, and possibly remote-desktop)
    • packaged in Debian
    • Status: experimental, requires pipewire >=0.3 and FF >=84; tested screencast with FF and GMeet, it worked but takes a few seconds to initialize and sometimes hang and it may not be possible to get it to work again withotu restarting Sway; currently sharing a specific window or output is not yet possible.

Screen Brightness

  • light:
    • packaged in Debian
    • Status: works fine
  • brightnessctl:
    • packaged in Debian (brightness-udev is needed to be usable as non-root)
    • Status: works fine

Browser

Electron Apps

The Electronframework is based on Chromium/Ozone which now has a Wayland backend. Support in Electron came in version 12 which enables Ozone. Detection of Wayland environment is not automatic yet. Currently Electron does not support client-side decorations at the moment, but on tiling compositors like Sway that's not a problem though. Moreover IME are not working yet.

To enable Wayland on the following applications you need to add the following options on the command line (or edit you .desktop file): --enable-features=UseOzonePlatform --ozone-platform=wayland

  • signal-desktop: X11
    • not packaged in Debian but upstream provides a package for Ubuntu that works on Debian
    • Status: works fine on XWayland, native Wayland support is WIP and working fine so far
  • VSCodium: X11 (OpenSource distribution of Visual Studio Code without telemetry and tracking)
    • not packaged in Debian but upstream provides a working package
    • Status: works fine on XWayland, native Wayland support is WIP and working fine so far

Misc Apps

  • Emacs: X11
  • libreoffice: X11 Wayland
    • packaged in Debian
    • Status: works fine on XWayland, native Wayland support if using the GTK3 backend (with the extra libreoffice-gtk3 package) and working well too
  • netevent: (Input-Event device cloning utility)
    • use case: if you wish to control several machines with the same keyboard and mouse, like with a KVM switch, then you can use devices from one to control others and switch machine using a special key
    • not packaged in Debian but materials provided upstream (needs this update though)
    • Status: works fine
  • thunderbird: X11 Wayland
  • wl-gammactl: Wayland
    • not packaged in Debian
    • Status: works fine
  • wl-clipboard: Wayland
    • packaged in Debian
    • Status: works fine

Workarounds

GUI Frameworks

GTK uses GDK to draw and support for Wayland exists but a few things are missing thus it is not enabled by default. Other frameworks do not always enable Wayland by default depending on distro and version.

Currently this works fine (in ~/.xsessionrc):

# ensure GUI frameworks use Wayland
# breaks a few apps or behaviors (Chromium, Emacs…)
export GDK_BACKEND=wayland
export CLUTTER_BACKEND=wayland
export QT_QPA_PLATFORM=wayland-egl
# breaks a few apps or behaviors (Unity…)
#export SDL_VIDEODRIVER=wayland
export ELM_DISPLAY=wl
# enable Wayland on Mozilla apps
export MOZ_ENABLE_WAYLAND=1
export MOZ_WEBRENDER=1

Java Applications

Set _JAVA_AWT_WM_NONREPARENTING=1 in your environment (in ~/.xsessionrc) to fix behavior with menus and always on top issues (and maybe others).

Readings