Linux - Sway

Introduction

Sway is a tiling compositor based on Wayland. It can be identified as a counterpart of i3 in Wayland, and as resource saving and lightweight as i3. Even, sway has a completely compatible configuration to i3.

Sway's core components and necessary applications can be simply installed and configured, e.g.,

  • sway: core components
  • swaylock: a screen locker
  • swayidle: an idle management daemon
  • foot: a native terminal in wayland
  • rofi: an application launcher and window switcher
  • waybar: a bar utility in wayland
  • light: a backlight controller
  • mako: a notification daemon
  • grim: a screenshot utility
  • slurp: a region selection utility in wayland
  • swaybg: a background setting utility

Installation

  pacman -S sway swaylock swayidle foot rofi waybar light mako grim slurp swaybg

Configuration

For centralized management, the configuration files can be gathered in directory ~/.config/sway.

~/.config/sway/config

  # Default config for sway
  #
  # Copy this to ~/.config/sway/config and edit it to your liking.
  #
  # Read `man 5 sway` for a complete reference.

  ### Variables
  set $mod Mod4
  set $term /usr/bin/foot --font=monospace:size=12
  set $menu /usr/bin/wofi -c ~/.config/sway/wofi.conf
  set $wallpaper /usr/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png
  set $locker swaylock -f -i $wallpaper

  ### Appearance and behavior
  font pango: Source Code Pro 18
  workspace_layout default
  default_border none
  default_floating_border pixel
  popup_during_fullscreen smart
  focus_follows_mouse no

  ### Output
  output eDP-1 bg $wallpaper fill
  output DP-1 bg $wallpaper fill scale 2

  ### Idle configuration
  exec swayidle -w \
           timeout 300 $locker \
           timeout 600 'swaymsg "output * dpms off"' \
           resume 'swaymsg "output * dpms on"' \
           before-sleep $locker

  ### Key bindings
  #
  # Basics:
  #
      # start a terminal
      bindsym $mod+Return exec $term

      # kill focused window
      bindsym $mod+q kill

      # start your launcher
      bindsym $mod+d exec $menu

      # Drag floating windows by holding down $mod and left mouse button.
      # Resize them with right mouse button + $mod.
      # Despite the name, also works for non-floating windows.
      # Change normal to inverse to use left mouse button for resizing and right
      # mouse button for dragging.
      floating_modifier $mod normal

      # reload the configuration file
      bindsym $mod+Shift+c reload

  #
  # Moving around:
  #
      # Move your focus around
      bindsym $mod+o focus next
      bindsym $mod+Left focus left
      bindsym $mod+Down focus down
      bindsym $mod+Up focus up
      bindsym $mod+Right focus right

      # Move the focused window with the same, but add Shift
      bindsym $mod+Shift+Left move left
      bindsym $mod+Shift+Down move down
      bindsym $mod+Shift+Up move up
      bindsym $mod+Shift+Right move right
    
  #
  # Workspaces:
  #
      # define names for workspaces
      set $ws1 "1"
      set $ws2 "2"
      set $ws3 "3"
      set $ws4 "4"
      set $ws5 "5"
      set $ws6 "6"
      set $ws7 "7"
      set $ws8 "8"
      set $ws9 "9"

      # switch to workspace
      bindsym $mod+1 workspace $ws1
      bindsym $mod+2 workspace $ws2
      bindsym $mod+3 workspace $ws3
      bindsym $mod+4 workspace $ws4
      bindsym $mod+5 workspace $ws5
      bindsym $mod+6 workspace $ws6
      bindsym $mod+7 workspace $ws7
      bindsym $mod+8 workspace $ws8
      bindsym $mod+9 workspace $ws9
    
      # move focused container to workspace
      bindsym $mod+Shift+1 move container to workspace $ws1
      bindsym $mod+Shift+2 move container to workspace $ws2
      bindsym $mod+Shift+3 move container to workspace $ws3
      bindsym $mod+Shift+4 move container to workspace $ws4
      bindsym $mod+Shift+5 move container to workspace $ws5
      bindsym $mod+Shift+6 move container to workspace $ws6
      bindsym $mod+Shift+7 move container to workspace $ws7
      bindsym $mod+Shift+8 move container to workspace $ws8
      bindsym $mod+Shift+9 move container to workspace $ws9

  #
  # Layout stuff:
  #
      # Split
      bindsym $mod+h splith
      bindsym $mod+v splitv

      # Switch the current container between different layout styles
      bindsym $mod+s layout stacking
      bindsym $mod+w layout tabbed
      bindsym $mod+e layout toggle split

      # Make the current focus fullscreen
      bindsym $mod+f fullscreen toggle

      # Toggle the current focus between tiling and floating mode
      bindsym $mod+Shift+space floating toggle

      # Swap focus between the tiling area and the floating area
      bindsym $mod+space focus mode_toggle

      # Move focus to the parent container
      bindsym $mod+u focus parent

  ### System mode
  mode "system" {
          bindsym h exec systemctl poweroff, mode "default"
          bindsym l exec $locker, mode "default"
          bindsym r exec systemctl reboot, mode "default"
          bindsym s exec $locker && systemctl suspend, mode "default"
          bindsym Return mode "default"
          bindsym Escape mode "default"
  }
  bindsym $mod+Shift+e mode "system"

  ### Display mode
  set $mode_display (D)ouble, (M)irror, (I)nternal, (E)xternal
  mode "$mode_display" {
          bindsym d exec swaymsg output eDP1 enable DP1 enable, mode "default"
          bindsym i exec swaymsg output eDP1 enable DP1 disable, mode "default"
          bindsym e exec swaymsg output eDP1 disable DP1 enable, mode "default"
          bindsym Return mode "default"
          bindsym Escape mode "default"
  }
  bindsym $mod+Shift+x mode "$mode_display"

  ### Status Bar:
  # Read `man 5 sway-bar` for more information about this section.
  bar {
      swaybar_command "waybar -c ~/.config/sway/waybar/config -s ~/.config/sway/waybar/style.css"
  }

  ### Startup
  exec mako --anchor top-right --default-timeout 6000
  exec wl-paste -t text --watch clipman store --no-persist
  exec fcitx5 -r &

  ### Screenshot
  bindsym --release {
          Print exec grim $(date +'%Y%m%d-%H%M%S.png')
          Shift+Print exec grim -g "$(slurp)" $(date +'%Y%m%d-%H%M%S.png')
  }

  ### Keyboard
  input type:keyboard {
        xkb_options ctrl:nocaps
  }

  ### Touchpad of laptop
  input type:touchpad {
        dwt enable
  }

  ### Lid related event for laptop
  bindswitch {
        lid:on output eDP-1 disable
        lid:off output eDP-1 enable
  }

  ### Special keys for laptop
  bindsym {
          # Volume
          XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
          XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
          XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
          XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle

          # Brightness
          XF86MonBrightnessUp exec sudo light -A 5
          XF86MonBrightnessDown exec sudo light -U 5
  }

  include /etc/sway/config.d/*
  xwayland enable

~/.config/sway/wofi.conf

  mode=drun
  allow_images=true
  allow_markup=true
  location=center
  lines=9
  filter_rate=1
  term=termite
  key_up=Control_L-p
  key_down=Control_L-n
  key_exit=Control_L-g
  no_actions=true
  width=300
  image_size=32

~/.config/sway/waybar.style.css

  ,* {
      border: none;
      border-radius: 0;
      font-family: Roboto, Helvetica, Arial, sans-serif;
      font-size: 18px;
      min-height: 0;
  }

  window#waybar {
      background-color: rgba(43, 48, 59, 0.5);
      border-bottom: 3px solid rgba(100, 114, 125, 0.5);
      color: #ffffff;
      transition-property: background-color;
      transition-duration: .5s;
  }

  window#waybar.hidden {
      opacity: 0.3;
  }

  /*
  window#waybar.empty {
      background-color: transparent;
  }
  window#waybar.solo {
      background-color: #FFFFFF;
  }
  ,*/

  window#waybar.termite {
      background-color: #3F3F3F;
  }

  window#waybar.chromium {
      background-color: #000000;
      border: none;
  }

  #workspaces button {
      padding: 0 5px;
      background-color: transparent;
      color: #ffffff;
      border-bottom: 3px solid transparent;
  }

  /* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
  #workspaces button:hover {
      background: rgba(0, 0, 0, 0.2);
      box-shadow: inherit;
      border-bottom: 3px solid #ffffff;
  }

  #workspaces button.focused {
      background-color: #64727D;
      border-bottom: 3px solid #ffffff;
  }

  #workspaces button.urgent {
      background-color: #eb4d4b;
  }

  #mode {
      background-color: #64727D;
      border-bottom: 3px solid #ffffff;
  }

  #clock,
  #battery,
  #cpu,
  #memory,
  #temperature,
  #backlight,
  #network,
  #pulseaudio,
  #custom-media,
  #tray,
  #mode,
  #idle_inhibitor {
      padding: 0 10px;
      margin: 0 0px;
      color: #ffffff;
  }

  #clock {
      background-color: #64727D;
  }

  #battery {
      background-color: #ffffff;
      color: #000000;
  }

  #battery.charging {
      color: #ffffff;
      background-color: #26A65B;
  }

  @keyframes blink {
      to {
          background-color: #ffffff;
          color: #000000;
      }
  }

  #battery.critical:not(.charging) {
      background-color: #f53c3c;
      color: #ffffff;
      animation-name: blink;
      animation-duration: 0.5s;
      animation-timing-function: linear;
      animation-iteration-count: infinite;
      animation-direction: alternate;
  }

  label:focus {
      background-color: #000000;
  }

  #cpu {
      background-color: #2ecc71;
      color: #000000;
  }

  #memory {
      background-color: #9b59b6;
  }

  #backlight {
      background-color: #90b1b1;
  }

  #network {
      background-color: #2980b9;
  }

  #network.disconnected {
      background-color: #f53c3c;
  }

  #pulseaudio {
      background-color: #f1c40f;
      color: #000000;
  }

  #pulseaudio.muted {
      background-color: #90b1b1;
      color: #2a5c45;
  }

  #custom-media {
      background-color: #66cc99;
      color: #2a5c45;
      min-width: 100px;
  }

  #custom-media.custom-spotify {
      background-color: #66cc99;
  }

  #custom-media.custom-vlc {
      background-color: #ffa000;
  }

  #temperature {
      background-color: #f0932b;
  }

  #temperature.critical {
      background-color: #eb4d4b;
  }

  #tray {
      background-color: #2980b9;
  }

  #idle_inhibitor {
      background-color: #2d3436;
  }

  #idle_inhibitor.activated {
      background-color: #ecf0f1;
      color: #2d3436;
  }

  #mpd {
      background-color: #66cc99;
      color: #2a5c45;
  }

  #mpd.disconnected {
      background-color: #f53c3c;
  }

  #mpd.stopped {
      background-color: #90b1b1;
  }

  #mpd.paused {
      background-color: #51a37a;
  }

Startup

After the installation and configuration, sway can be started by running command sway from a TTY after login.

KDE Applications

There are a rich number of applications dedicated for KDE, e.g., file manager dolphin and PDF reader okular. On sway, they can be installed and configured as follows.

Installation

  pacman -S dolphin okular

Configuration

  • Install icons of breeze theme.

      pacman -S breeze-icons
  • Install configuration tool qt5ct.

      pacman -S qt5ct
  • Append the following entry into ~/.pam_environment.

      QT_QPA_PLATFORMTHEME=qt5ct
  • Run qt5ct to configure the font and icon.
Table of Contents