Setting up sway on a new machine
Premise
So I had a Linux laptop for a bit now. On my main desktop workstation I used to have Arch, but to help my wife's recent 3d endevours I installed PopOS instead, which is more user friendly, and most importantly, is somewhat officially supported by Autodesk. Where by "officially supported" I mean: there's a 13 steps guide on their website documenting the commands to run to get it to work, including setting up correctly their beautiful Licensing tools (something that I tried to on Arch without success, mostly due to the horrible error messages spit out by the AdskLicensingHelper CLI).
Due to this loss, the amount of tinkering I feel the need to do on my laptop has grown exponentially. Which eventually lead me into the beautiful đ hole of tiling window managers..
A hole I have been carefully avoiding for a while, since whenever I do 3d stuff I tend to have a lot of floating windows, so tiling window managers don't really solve any problems there. However, the promotion of this laptop to a pure dev machine meant that hell could finally break loose..
Getting started
As always, for a more in-depth guide I recommend to follow the official website (https://swaywm.org/ and https://github.com/swaywm/sway/wiki, https://github.com/swaywm/sway/wiki/Useful-add-ons-for-sway) and the Arch wiki page (even if you're not on Arch). However, if you're a bit in a rush and just want to get things going and learn the basics, you might find this post useful!
To install sway on Arch, I installed these packages:
pacman -Sy sway
pacman -Sy sway-bg # required to set a bg, see https://github.com/swaywm/sway/issues/4164
pacman -Sy wofi # this is my custom app launcher
Now the fun begins.
To run a Sway session, since I don't have a login manager, I just have this in my bashrc:
start-sway(){
exec dbus-run-session sway
}
Final look
I had sway for a few weeks, but I'm sure there's plenty of tinkering left to do. Things currently look like this, with 'wofi' in the center, 'emacs' on the left and 'wezterm' on the right:
Configuration
As per the wiki, you can copy the default config to get up and running with some basics:
mkdir -p ~/.config/sway
cp /etc/sway/config ~/.config/sway/
NOTE: To hot-reload your Sway config after you made some changes to it you can press
Prefix + Shift + C
.
The default prefix (or 'mod' key) is the 'logo button' (the windows keys probably, since I can't' think of Linux laptops that has a đ§ key).
I've set it to be 'Alt' instead via this entry:
set $mod Mod1
Launching apps
To open your favourite terminal emulator, you can just type Prefix + Enter
.
This is because the default config has this entry:
bindsym $mod+Return exec $term
To set your favour terminal, you can add this entry in the config (in my case it's WezTerm) :
set $term wezterm
To open your default application launcher (in my case, wofi) it's Prefix + D
.
You can set the command required by adding this entry:
set $menu wofi --show drun exec
Navigation
To move to the virtual desktop N, you can type Prefix + 1,2,3..N
To move across windows, you can use either Prefix+h,j,k,l
or Prefix+up,down,left,right arrow
.
The vim-mode style is achieved thanks to these entries:
set $left h
set $down j
set $up k
set $right l
To tell sway that the next window should be a horizontal split, you'll type Prefix+v
. For a vertical split, Prefix+b
.
To close a window, press Prefix+q
.
Modes
Prefix + w
-> Enter Tabbed modePrefix + e
-> Enter Tiling modePrefix + f
-> Enter Full Screen mode
Moving windows
To move a window to workspace N, you can use $mod+Shift+{some-number}
, e.g.: Alt+Shift+1
.
This is achieved by these entries in the config:
bindsym $mod+Shift+1 move container to workspace number 1
bindsym $mod+Shift+2 move container to workspace number 2
# ..and so on..
Status bar
This is one of the bits I enjoyed the most. You can basically run any command you want, and display its result in the status bar!
For mine, I have set it up like this :
bar {
position top
# When the status_command prints a new line to stdout, swaybar updates.
status_command while ~/.config/sway/status.sh; do sleep 60; done
colors {
statusline #ffffff
background #323232
inactive_workspace #32323200 #32323200 #5c5c5c
}
}
Where ~/.config/sway/status.sh
is like this:
uptime_formatted=$(uptime | cut -d ',' -f1 | awk '{print $3 " " $4}')
date_str=$(date "+%a %F %H:%M")
battery_info=$(upower --show-info $(upower --enumerate))
battery_is_charging=$(echo "$battery_info" | grep icon-name | grep 'charging' -c)
battery_is_low=$(echo "$battery_info" | grep icon-name | grep 'battery-low-symbolic' -c)
if [ $battery_is_low = 1 ]; then
battery_icon=đĒĢ
elif [ $battery_is_charging = 1 ]; then
battery_icon=đ
fi
battery_percent=$(echo "$battery_info" | grep percentage | awk '{print $2}')
echo "$(hostname), up since $uptime_formatted -- battery: $battery_percent $battery_icon -- $date_str"
This results in a status bar like this:
Update: after a bit of fiddling around, I've moved to waybar!
Things now look like this:
Screengrabs
I found https://github.com/Gustash/sway-screenshot to be a tiny neat utility.
On arch, it can be installed via the AUR helpers:
paru sway-screenshot
The docs on how to use it with Sway are included in their Readme, so I won't duplicate them here.
How about volume ?
I haven't (yet) found a great way to get visual feedback whenever I change volume. But these entries work fine to use the function keys on my keyboard to lower/raise/mute the volume:
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume 0 +5%
bindsym XF86AudioLowerVolume exec pactl set-sink-volume 0 -5%
bindsym XF86AudioMute exec pactl set-sink-mute 0 toggle
bindsym XF86AudioMicMute exec pactl set-source-mute 0 toggle
One workaround is to install pavucontrol
and run its GUI directly whenever I need to have visual feedback:
pacman -Sy pavucontrol
How about more visual pizzazz?
That's a job for swayfx, a fork of sway
that:
[...] ditches the simple wlr_renderer, and replaces it with our fx_renderer, capable of rendering with fancy GLES2 effects.
On arch it's packaged on the AUR:
paru swayfx
For example, I have set my windows to have a blurred blackground and rounded corners:
# Swayfx stuff
smart_corner_radius enable
corner_radius 10
## blur
blur enable
blur_xray enable
blur_passes 4
blur_radius 4