Sway on Laptop

From Alpine Linux

Install and configure Sway

Install Graphics Drivers

Graphics drivers:

Add a normal user

Use setup-user to add a non-system normal user for running Sway.

Install seatd

Install seatd, a minimal seat management daemon. This grants the required permissions to the user running sway:

apk add seatd
# add seatd to boot run-level, because it must be running before greetd
rc-update add seatd boot
rc-service seatd start
adduser $USER seat

Install elogind (optional)

elogind is used to enable suspend-to-RAM with swayidle:

apk add elogind
rc-update add elogind
rc-service elogind start

Set up eudev

eudev is recommended and required for the greeter. Or else it will not be able to find any input device (libinput failure).

setup-devd udev

Install greetd (optional)

greetd is used to set XDG_RUNTIME_DIR and properly configure seat:

apk add greetd greetd-gtkgreet cage greetd-openrc
rc-update add greetd
adduser greetd seat

In /etc/greetd/config.toml, set

[default_session]

command = "cage -s -- gtkgreet"

In /etc/greetd/environments, set

# Launch Sway with a D-Bus server available, use:
dbus-run-session -- sway

We need to run sway with dbus-run-session, this is needed for PipeWire and screensharing in Firefox and Chromium.

Install doas

Doas is used to grant permissions for suspend-to-RAM and brightness control with brightnessctl:

apk add doas brightnessctl
# optionally, allow $USER root access with password
adduser $USER wheel

In /etc/doas.conf, set

permit :wheel
permit nopass $USER as root cmd /bin/loginctl
permit nopass $USER as root cmd /usr/bin/brightnessctl

After setting the above, suspend-to-RAM can be triggered by running /bin/loginctl suspend (use full path to executable) and brightness can be adjusted by running /usr/bin/brightnessctl set 100.

Install fonts

Install DejaVu fonts, which has good Unicode coverage:

apk add font-dejavu

Install PipeWire, WirePlumber and XDG portals

For a reasonable desktop experience with support for audio and screensharing, install pipewire, wireplumber and xdg portals:

apk add pipewire pipewire-pulse pipewire-tools
apk add wireplumber
apk add xdg-desktop-portal xdg-desktop-portal-wlr

Later, we need to launch PipeWire with Sway and configure several environment variables.

Install Sway

apk add sway \
   xwayland             \ # if you need xserver
   foot                 \ # default terminal emulator. Modify $term in config for a different one.
   bemenu               \ # wayland native menu for choosing program and screensharing monitor
   swaylock swaylockd   \ # lockscreen tool
   grim                 \ # screenshot tool
   wl-clipboard         \ # clipboard management
   i3status             \ # simple status bar
   swayidle               # idle management (DPMS) daemon

For complimentary software alternatives, see for example this list at Gentoo Wiki.

Sway configuration

Copy default sway configuration to ~/.config:

# as normal user
mkdir -p ~/.config/sway
cp /etc/sway/config ~/.config/sway/

Read through it to learn the default keybindings. Sway configuration is mostly backwards-compatible with that of i3 and if you are looking for a solution for a specific issue, you may also try checking if it hasn't been provided for i3WM.

For additional information, start at man 5 sway and read the upstream wiki.

Launch PipeWire with Sway, add the following to sway config:

exec /usr/libexec/pipewire-launcher

You also need to set DBus variables for the portal and screensharing features to work:

exec dbus-update-activation-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway

Replace dmenu (depends on X server) with bemenu (Wayland native):

set $menu dmenu_path | bemenu | xargs swaymsg exec --

Set a mouse cursor, using GNOME Adwaita theme:

seat "*" xcursor_theme Adwaita 16

Set screen lock and suspend-to-RAM:

exec swayidle -w \
         timeout 300 'swaylock --daemonize' \
         timeout 330 'doas /bin/loginctl suspend' \
         before-sleep 'swaylock --daemonize'

Do not lock the screen if program is running in full screen:

for_window [app_id="^.*"] inhibit_idle fullscreen