Introduction

It's been 7 years since I have installed and used everyday the i3 tile window manager. I have never used something else and it proved to be a good choice. I can now focus on keyboard commands and I don't have to handle windows positions on the screen anymore.

Whenever I am forced to use another old fashioned hand positionning window manager, I fulminate against it. I am just waisting my time trying to focus on the program I need to use.

So far I have been very satisfied about my i3 usage. I just wrote a configuration file years ago and I never had to look at it. I just copy it to any new desktop computer that I own. It is a very stable window manager.

But last month, I found an alternative to i3 and I want to tell you how I use it as a replacement of i3. It is called sway and it aims to become an i3 replacement on the wayland graphical stack.

It's been years since everybody is using the Xorg graphical stack under GNU/Linux systems. It is very old as it predates the micro-computers era of the 80's. While being improved one small feet at a time, Xorg architecture has some drawbacks, inheritated from its beginnings.

Wayland has emerged a couple of years ago in order to completely get rid of the old Xorg stack principles. As an abstract, I can say that Wayland is the future of GNU/Linux desktop systems! For more information about the differences between Wayland and X, read this page.

Sway is a tiling window manager that works under Wayland. It aims to mimic i3, in its usage and even in it's configuration file. You just have to stick it into the right directory (~/.config/sway/config) and voila. Sway is coded in C and it is very efficient, compact and fast. Even if it hasn't reach version 1.0, my tests have shown that it is perfectly usable everyday.

I have use it for a month at home, on my laptop and even on my office job workstation and it just does work.

How to install Sway under Debian?

First things first, you need to be under Debian Buster because compiling sway from sources requires some packages that do not exist in Debian Stretch (like meson).

Debian Packages Dependencies

# apt install libgles2-mesa-dev libdrm2 libdrm-dev libegl1-mesa-dev xwayland\
  libgbm-dev libinput-dev libsystemd-dev libcap-dev libxcb-composite0-dev \
  libxcb-image0-dev libxcb-icccm4-dev libxcb-xkb-dev libpam0g-dev

Manual Dependencies

json-c

Unfortunately, json-c isn't in the required version, even on Debian Buster. We need to compile it by hand:

$ git clone https://github.com/json-c/json-c.git
$ cd json-c
$ sh autogen.sh
$ ./configure --prefix=/usr/local
$ make
# make install

wlroots

wlroot is a generic library for Wayland compositors. It has been developed focusing primarily Sway but it can also be used with other projects.

$ git clone https://github.com/swaywm/wlroots.git
$ cd wlroots
$ meson build
$ ninja -C build
# ninja -C build install

Sway building

Now it is time to build Sway.

$ git clone https://github.com/swaywm/sway.git
$ cd sway
$ meson build
$ ninja -C build
# ninja -C build install

Configuring Sway

You just need to copy your i3 configuration file into ~/.config/sway/config. Here is mine as an example with some adjustments for multiscreen and input configuration:

# Sway config file

# Keyboard configuration
input "5426:267:Razer_Razer_Arctosa" {
  xkb_layout fr
  xkb_variant latin9
  xkb_model pC105
  xkb_numlock enabled
}

# Dual screen configuration
output DP-1 pos 0 0 mode 1920x1080 background /usr/local/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png center
output DVI-I-2 pos 1920 0 mode 1680x1050 background /usr/local/share/backgrounds/sway/Sway_Wallpaper_Blue_1366x768.png center

set $mod Mod4

# Set font for lower bar
font pango:DejaVu Sans Mono 10

# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod

# Start a terminal. I use terminology, the enlightenment terminal.
# It does work natively under Wayland.
# See https://www.enlightenment.org/about-terminology
bindsym $mod+Return exec terminology -B

# Lock the screen
bindsym $mod+m exec swaylock

# kill focused window
bindsym $mod+Shift+Q kill

# start dmenu (a program launcher)
bindsym $mod+d exec dmenu_run

# change focus
bindsym $mod+j focus left
bindsym $mod+k focus down
bindsym $mod+i focus up
bindsym $mod+l focus right

# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

# move focused window
#bindsym $mod+Shift+J move left
#bindsym $mod+Shift+K move down
#bindsym $mod+Shift+L move up
#bindsym $mod+Shift+M move right

# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right

# split in horizontal orientation
bindsym $mod+h split h

# split in vertical orientation
bindsym $mod+v split v

# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen

# change container layout (stacked, tabbed, default)
bindsym $mod+s layout stacking
bindsym $mod+z layout tabbed
bindsym $mod+e layout default

# change screen
bindsym $mod+x move container to output DVI-I-2
bindsym $mod+w move container to output DP-1

# toggle tiling / floating
bindsym $mod+Shift+space floating toggle

# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle

# focus the parent container
bindsym $mod+q focus parent

# focus the child container
#bindcode $mod+d focus child

# workspaces definition
workspace 1: Mail output DVI-I-2
workspace 2: Web output DP-1
workspace 3: Terminal output DP-1
workspace 4: Emacs output DP-1
workspace 5: Music output DVI-I-2

# switch to workspace
bindsym $mod+ampersand workspace 1: Mail
bindsym $mod+eacute workspace 2: Web
bindsym $mod+quotedbl workspace 3: Terminal
bindsym $mod+apostrophe workspace 4: Emacs
bindsym $mod+parenleft workspace 5: Music
bindsym $mod+minus workspace 6
bindsym $mod+egrave workspace 7
bindsym $mod+underscore workspace 8
bindsym $mod+ccedilla workspace 9
bindsym $mod+agrave workspace 10

# move focused container to workspace
bindsym $mod+Shift+ampersand move workspace 1: Mail
bindsym $mod+Shift+eacute move workspace 2: Web
bindsym $mod+Shift+quotedbl move workspace 3: Terminal
bindsym $mod+Shift+apostrophe move workspace 4: Emacs
bindsym $mod+Shift+parenleft move workspace 5: Music
bindsym $mod+Shift+minus move workspace 6
bindsym $mod+Shift+egrave move workspace 7
bindsym $mod+Shift+underscore move workspace 8
bindsym $mod+Shift+ccedilla move workspace 9
bindsym $mod+Shift+agrave move workspace 10

# reload the configuration file
bindsym $mod+Shift+C reload
# restart sway inplace (preserves your layout/session, can be used to upgrade sway)
bindsym $mod+Shift+R restart
# exit sway (logs you out of your X session)
bindsym $mod+Shift+E exit

# resize window (you can also use the mouse for that)
mode "resize" {
  # These bindings trigger as soon as you enter the resize mode
  # They resize the border in the direction you pressed, e.g.
  # when pressing left, the window is resized so that it has
  # more space on its left

  bindsym j resize shrink left 10 px or 10 ppt
  bindsym Shift+J resize grow   left 10 px or 10 ppt

  bindsym k resize shrink down 10 px or 10 ppt
  bindsym Shift+K resize grow   down 10 px or 10 ppt

  bindsym l resize shrink up 10 px or 10 ppt
  bindsym Shift+L resize grow   up 10 px or 10 ppt

  bindsym m resize shrink right 10 px or 10 ppt
  bindsym Shift+M resize grow   right 10 px or 10 ppt

  # same bindings, but for the arrow keys
  bindsym Left resize shrink left 10 px or 10 ppt
  bindsym Shift+Left resize grow   left 10 px or 10 ppt

  bindsym Down resize shrink down 10 px or 10 ppt
  bindsym Shift+Down resize grow   down 10 px or 10 ppt

  bindsym Up resize shrink up 10 px or 10 ppt
  bindsym Shift+Up resize grow   up 10 px or 10 ppt

  bindsym Right resize shrink right 10 px or 10 ppt
  bindsym Shift+Right resize grow   right 10 px or 10 ppt

  # back to normal: Enter or Escape
  bindsym Return mode "default"
  bindsym Escape mode "default"
  bindsym $mod+r mode "resize"
}

# lower bar configuration
bar {
    status_command i3status
    output DP-1
}

bar {
    output DVI-I-2
    status_command i3status
}

# assign workspaces
assign [title="mutt"] 1: Mail
assign [class="Firefox"] 2: Web
assign [title="Terminal" title="Terminal" app_id="terminology"] 3: Terminal
assign [title="Emacs"] 4: Emacs
assign [title="Cantata"] 5: Music

# Start my main tools when the session opens
exec terminology -B -T=mutt -n=Mutt -r=Mutt -e mutt
exec terminology -B -T=Terminal -n=Terminal -r=Terminal
exec terminology -B -T=Emacs -n=Emacs -r=Emacs -e emacs
exec cantata
exec firefox

Launch a sway session

Sway doesn't have a session manager. As Sway is a Wayland compositor it requires to be started whenever you start a session. For the moment, I have just modified my .bashrc configuration to start sway whenever I am login under tty1 and then configure the different graphical libraries (GTK/QT/EFL/etc.) to use Wayland instead of Xorg:

...
# Sway configuration
export LD_LIBRARY_PATH="/usr/local/lib"
# you can also configure your keyboard this way
#export XKB_DEFAULT_LAYOUT=fr
#export XKB_DEFAULT_VARIANT=latin9
#export XKB_DEFAULT_MODEL=pc105
export QT_QPA_PLATFORM=wayland
export QT_WAYLAND_DISABLE_WINDOWDECORATION="1"
export ELM_DISPLAY=wl
export ECORE_EVAS_ENGINE=wayland_shm

# Launch Sway when logging under tty1
if [ $(tty) = "/dev/tty1" ]; then
    sway
    exit 0
fi

I have gotten rid of all the session managers on my system (no more slim nor gnome-session). I am prompted ot log under the text mode console. OldSchoolCool!

What doesn't work very well?

Even if Sway is working very well on three of my computers there are still some problems around.

On some computers I have lots of glitches with firefox. This is my main problem for the moment. Firefox can only be compiled under Xorg, there is nothing official for Wayland. So it relies on XWayland and for some graphical cards, it seems to have some problems.

The second problem I have faced is a keyboard problem. On my laptop I could not use the traditionnal keys for moving a window towards a screen (mod+shift+number of the screen). I had to.modify the comfiguration file to reflect the base (without shift pressed) character of the key (eg: aecute for 3 on a french keyboard).

I had also some problems with (proprietary) games that required a full Xorg session. But as long as I am able to play to Stardew Valley, it is not really a problem. Furthermore, I can log in tty2 and launch Xorg by hand (startx).

The last problem is probably the fact that I have to compile sway every week because it is not already available in Debian...

As long as you use Gnome softwares, you will enjoy the Wayland experience. Same thing for Qt5 (with the configuration above).

Conclusion

As a conclusion, Sway impressed me. It is a Wayland replacement for i3. There is nearly no new features. I am not lost nor do I need to learn something new. Furthermore it is coded in C, a language I really enjoy and which is able to build a complete tile window manager in a robust, compact and fast way. If you are an i3 enthousiast, you will enjoy Sway whenever you will migrate to Wayland.