8 KiB
Wayland on OpenBSD
Introduction
These are matthieu@'s' notes from experimenting with building Wayland bits on OpenBSD during g2k23 in Tallinn... Thanks to the OpenBSD foundation for organizing this event.
This is still far from a complete running system as there are many issues on the road, but it's a good start and it shows that it's definatly not impossible to get Wayland running on OpenBSD.
Updated to reflect that all of this in now a work in progress set of ports
Disclaimers
-
Some stuff here may look naive or totally wrong to experimented Wayland developers...
-
The build instructions below may break your system. Use a separate machine for testing Wayland
General ideas
- This work is using the wlroots library and will focus on compositors (sway,
tinywl+...) and applications that use it
- Gnome (GTK+) based or Qt-based application will wait until someone else builds Wayland support for those toolkits on OpenBSD
- The output path is more or less ready with the DRI and Mesa porting efforts (mostly jsg and kettenis)
- "Seat" management is going to be minimal, as OpenBSD doesn't support this:
- seatd and libseat provide support for non-systemd based systems. A basic port to OpenBSD/wscons is needed. For now the "noop" backend is enough to be able to run sway.
- Input is more complex to get working since Wayland applications expect Linux
input model with udev, evdev and libinput.
- udev is used to probe available device and handle hot-plugging on Linux.
OpenBSD doesn't have it and the current state of hotplugd(8) doesn't make it
possible to really emulate udev. There is a
libudev-openbsd
port already that can be used. - evdev is the input event layer of the Linux kernel, similar to wscons_events in OpenBSD. It's mostly hidden by libinput, but event name translation need the libevdev library for some reason.
- libinput is the library that permits reading evdev events from the Linux kernel and handling many of the higher level interpretation of the events (getting the keyboard mapping, mouse gestures or multi-touch).. It also handles device configuration. mpi@ did a simple libinput port back in 2015, and rsadowski improved it a bit in 2022 and matthieu@ also implemented some missing bits. More work is needed, especially to support multiple devices and fancy pointer accelerat. Keyboard mapping also needs some help.
- udev is used to probe available device and handle hot-plugging on Linux.
OpenBSD doesn't have it and the current state of hotplugd(8) doesn't make it
possible to really emulate udev. There is a
Available ports
All needed ports are now committed in the OpenBSD ports tree. They can be used to build and install the packages.
sysutils/seatd
The original project in on Source Hut
The OpenBSD port is very minimal but enough for now. TODO: make it more complete WRT VT switching, using fbtab and some sort of session management.
wayland/libinput-openbsd
This is the port providing libopeninput, the libinput port to OpenBSD maintained by rsadowski@, based on the original work of mpi@ and additions for proper events translation (for mouse buttons and keyboard) so that the input works in a usable way in Wayland.
sysutils/libevdev-openbsd
This is a stripped-down version of libevdev, providing just the few functions to handle name to symbol conversions that are used by most Wayland applications.
sysutils/libdisplay-info and graphics/libliftoff
Those two small helper libraries build of of the box on OpenBSD.
wayland/xwayland
This is a straightforward port of the upstream release.
wayland/wlroots
A version of wlroots that has been patched for OpenBSD. The wscons backend code can dropped for now. I'm not sure if it will ever be possible to have Wayland applications running without libinput (but that's the goal of this backend).
wayland/havoc
Havoc is the simplest terminal emulator application for Wayland that I could find and that builds on OpenBSD with minimal changes.
wayland/foot
Foot is a more complete terminal emulator. Porting it required adding uchar.h to base, and a few ports (devel/tllist, devel/libstdthreads, graphics/fcft) which are also used by other not yet ported Wayland applications.
wayland/sway
Sway is a tiled Wayland compositor, compatible with i3, ported to OpenBSD
wayland/dmenu-wayland
dmenu-wayland is a dynamic menu for sway and other wlroots based compositors, similar to dmenu for X11.
wayland/wev
Wev is a Wayland event viewer, similar to xev(1)
wayland/swayimg
swayimg is an image viewer for Wayland that builds on OpenBSD
wayland/swaybg
swaybg is a small utility to set the background for wlroots based compositors, including sway.
Default cursor theme
Wayland doesn't provide cursors by itself. So one needs to install the
gnome-icon-theme
package or any other package providing a default theme.
Because of the cursor path mentionned above, link /usr/local/share/icons to
~/.icons
for now to get cursors.
Note: swaybar used to segfault if it's missing a cursor, it should be fixed in the current port
Fonts
Wayland is using fontconfig
. So it can use any fonts installed via pkg_add
swaybar expects the terminus font to be available.
Running Wayland
-
The script below (
startwl
) sets all the environment needed:#! /bin/ksh export XDG_RUNTIME_DIR=/tmp/run/$(id -u) if [ ! -d $XDG_RUNTIME_DIR ]; then mkdir -m 700 -p $XDG_RUNTIME_DIR fi export WLR_DRM_DEVICES=/dev/dri/card0 export LIBSEAT_BACKEND=noop export XCURSOR_THEME=redglass exec sway $*
-
Use LWIN-Enter to launch the default terminal emulator (havoc)
X Applications
Sway starts Xwayland automatically if an application needs X
It can also be started manually, but not in rootless mode (this is a Wayland security feature). X applications work in the Xwayland in windowed mode, but OpenGL X applications crash (probably because of mismatched Mesa versions in my builds FIXME
More work to do
More complete libinput implementation
- Multiple devices and hotplugging
- Explicit tablets and touchscreens support
- Pointer acceleration profiles
Gtk applications
Simple patches allows to build gtk+3 and gtk+4 with wayland support enabled. gtk3-demo works, built against the patched version.
Note that both emacs and mozilla-firefox work, but still use Xwayland. The ports need some plist and lib-depends patches once wayland support is enabled in gtk+3/4.
So far gtk-demos (Gtk-4) fails to start, it still tries to connect to an X serer and segfault. FIXME
Qt applications
Qt 5 and 6 are normally built with Wayland support. I tried keepassxc(1) (Qt5) which could'nt connect to the compositor. qt6/qtbase doesn't build on my system from some reason. FIXME
swaylock
To get a screen locker, swaylock needs to be tought about BSD auth to replace PAM.
Pledge and Unveil
None of the above currenty implement pledge() or unveil() support, nor any other from of sandboxing afaict. This could be looked at at some point.
Known issues
- Sway sometimes crashes on startup because of a use after free error happening somewhere in fontconfig.
- Sway will crash the kernel during startup from time to time. I don't know if it's a problem specific to the dri driver for the Intel iris (12th gen) GPU in my test laptop or a general bug. TODO: test on a machine with a serial console to get a backtrace if possible.
Last modified: 2023-09-02T13:25:23