diff --git a/pkg/tdpeuter/tdpeuter-desktop.install b/pkg/tdpeuter/tdpeuter-desktop.install
index f9b6248..f0df002 100644
--- a/pkg/tdpeuter/tdpeuter-desktop.install
+++ b/pkg/tdpeuter/tdpeuter-desktop.install
@@ -30,8 +30,11 @@ pre_remove() {
}
install_software() {
+
+ # Sway
git clone https://aur.archlinux.org/sway-git.git
cd sway-git
makepkg
pacman -U sway-git
+
}
diff --git a/stow/sway/.config/sway/autostart.sh b/stow/sway/.config/sway/autostart.sh
new file mode 100755
index 0000000..f3dcf69
--- /dev/null
+++ b/stow/sway/.config/sway/autostart.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+#
+# ~/.config/sway/autostart.sh
+# List of applications to autostart
+#
+
+function execute () {
+ setsid --fork $SHELL -c "${1}" &> /dev/null
+}
+
+# Idle script
+execute "~/.scripts/idle.sh"
+
+# Gamma and brightness
+execute "clight"
+
+# Notification manager
+execute "dunst -verbosity crit"
+
+# Fix [Slow launch for some GTK apps](https://github.com/swaywm/sway/issues/5732)
+dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK
+
+# Fix JetBrain IDE's showing properly
+wmname LG3
+
+
+sleep 3
+# --- Everything that requires tray to be active ---
+
+# Nextcloud client
+execute "nextcloud --background"
+
+# Activity watch server & client
+execute "aw-qt"
+
diff --git a/stow/sway/.config/sway/commands b/stow/sway/.config/sway/commands
new file mode 100644
index 0000000..623b2d6
--- /dev/null
+++ b/stow/sway/.config/sway/commands
@@ -0,0 +1,174 @@
+#
+# ~/.config/sway/commands
+# Keybinds for sway
+#
+
+# Variables
+set {
+ $alt Mod1
+ $flag Mod4
+ $term alacritty
+ $notify ~/.scripts/notify.sh
+}
+
+# Focus
+bindsym {
+ $flag+h focus left
+ $flag+j focus down
+ $flag+k focus up
+ $flag+l focus right
+
+ $flag+Left focus left
+ $flag+Down focus down
+ $flag+Up focus up
+ $flag+Right focus right
+
+ $flag+m focus mode_toggle
+ $flag+p focus parent
+}
+
+# Move windows
+bindsym {
+ $flag+Shift+h move left
+ $flag+Shift+j move down
+ $flag+Shift+k move up
+ $flag+Shift+l move right
+
+ $flag+Shift+Left move left
+ $flag+Shift+Down move down
+ $flag+Shift+Up move up
+ $flag+Shift+Right move right
+
+ $flag+Next move scratchpad
+ $flag+Prior scratchpad show
+}
+
+# Layouts
+bindsym {
+ $flag+w layout toggle split
+ $flag+x layout tabbed
+ $flag+c split h
+ $flag+v split v
+
+ $flag+f floating enable, border normal 1
+ $flag+Shift+f floating disable, border pixel 1
+
+ $alt+Next border pixel 1 # Show window title
+ $alt+Prior border normal 1 # Hide window title
+
+ $flag+s sticky toggle
+}
+
+# Workspaces
+set {
+ $ws1 "1:1"
+ $ws2 "2:2"
+ $ws3 "3:3"
+ $ws4 "4:4"
+ $ws5 "5:5"
+ $ws6 "6:6"
+ $ws7 "7:7"
+ $ws8 "8:8"
+ $ws9 "9:9"
+ $ws10 "10:10"
+ $ws11 "11:Soc"
+ $ws12 "12:Ent"
+}
+
+bindsym {
+ $flag+ampersand workspace $ws1
+ $flag+eacute workspace $ws2
+ $flag+quotedbl workspace $ws3
+ $flag+apostrophe workspace $ws4
+ $flag+parenleft workspace $ws5
+ $flag+section workspace $ws6
+ $flag+egrave workspace $ws7
+ $flag+exclam workspace $ws8
+ $flag+ccedilla workspace $ws9
+ $flag+agrave workspace $ws10
+ $flag+parenright workspace $ws11
+ $flag+minus workspace $ws12
+
+ $flag+Shift+ampersand move container to workspace $ws1, workspace $ws1
+ $flag+Shift+eacute move container to workspace $ws2, workspace $ws2
+ $flag+Shift+quotedbl move container to workspace $ws3, workspace $ws3
+ $flag+Shift+apostrophe move container to workspace $ws4, workspace $ws4
+ $flag+Shift+parenleft move container to workspace $ws5, workspace $ws5
+ $flag+Shift+section move container to workspace $ws6, workspace $ws6
+ $flag+Shift+egrave move container to workspace $ws7, workspace $ws7
+ $flag+Shift+exclam move container to workspace $ws8, workspace $ws8
+ $flag+Shift+ccedilla move container to workspace $ws9, workspace $ws9
+ $flag+Shift+agrave move container to workspace $ws10, workspace $ws10
+ $flag+Shift+parenright move container to workspace $ws11, workspace $ws11
+ $flag+Shift+minus move container to workspace $ws0, workspace $ws12
+
+ $flag+Control+j focus output 'eDP-1'
+ $flag+Control+h workspace prev_on_output
+ $flag+Control+l workspace next_on_output
+ $flag+Control+k focus output 'HDMI-A-1'
+
+ $flag+Control+Down focus output 'eDP-1'
+ $flag+Control+Left workspace prev_on_output
+ $flag+Control+Right workspace next_on_output
+ $flag+Control+Up focus output 'HDMI-A-1'
+
+ $flag+Control+Shift+j \
+ move container to output 'eDP-1', focus output 'eDP-1'
+ $flag+Control+Shift+h \
+ move container to workspace prev_on_output, workspace prev_on_output
+ $flag+Control+Shift+l \
+ move container to workspace next_on_output, workspace next_on_output
+ $flag+Control+Shift+k \
+ move container to output 'HDMI-A-1', focus output 'HDMI-A-1'
+
+ $flag+Control+Shift+Down \
+ move container to output 'eDP-1', focus output 'eDP-1'
+ $flag+Control+Shift+Left \
+ move container to workspace prev_on_output, workspace prev_on_output
+ $flag+Control+Shift+Right \
+ move container to workspace next_on_output, workspace next_on_output
+ $flag+Control+Shift+Up \
+ move container to output 'HDMI-A-1', focus output 'HDMI-A-1'
+}
+
+# System
+bindsym --locked {
+# Brightness
+ XF86MonBrightnessDown exec brightnessctl -e s 5%- && $notify -b
+ XF86MonBrightnessUp exec brightnessctl -e s +5% && $notify -b
+
+# Volume control (Pulsemixer is slow!)
+ XF86AudioRaiseVolume exec pamixer -i 2 --set-limit 100 && $notify -v
+ XF86AudioLowerVolume exec pamixer -d 2 && $notify -v
+ XF86AudioMute exec pamixer -t && $notify -v
+ XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle
+
+# Media control
+ F7 exec playerctl play-pause
+ Shift+XF86AudioLowerVolume exec playerctl previous
+ Shift+XF86AudioRaiseVolume exec playerctl next
+}
+
+# Special commands
+set $fzf ~/.scripts/fzf-jump
+bindsym {
+# Reload sway
+ $alt+Shift+r reload
+# Dialog to exit sway
+ $alt+Shift+e exec swaynag -t warning -m 'Do you really want to exit sway?' \
+ -B 'Yes, exit sway' 'swaymsg exit'
+
+ $flag+q kill # Kill focused window
+ $flag+Return exec $term -e bash -c "zellij attach || zellij" # Start a terminal
+ $flag+Delete exec swaylock # Lockscreen
+
+ # Start application launcher
+ $alt+space exec $term --title 'FZF-Jump' -e $fzf/launcher.sh
+ # Window switcher
+ $alt+Tab exec $term --title 'FZF-Jump' -e $fzf/standalone.sh $fzf/modules/windows.sh $fzf/modules/workspaces.sh
+
+ # File explorer
+ $flag+e exec $term -e vifm
+ # Internet explorer
+ $flag+i exec firefox
+}
diff --git a/stow/sway/.config/sway/config b/stow/sway/.config/sway/config
new file mode 100644
index 0000000..fa7493b
--- /dev/null
+++ b/stow/sway/.config/sway/config
@@ -0,0 +1,58 @@
+#
+# .config/sway/config
+# Personal config for sway
+# Requires noto-fonts-cjk
+#
+
+# Import other config files
+include {
+ commands
+ modes
+ style
+}
+
+# Input
+input type:keyboard {
+ xkb_layout "be"
+}
+
+input 2:7:SynPS/2_Synaptics_TouchPad {
+ natural_scroll enabled
+ scroll_factor 0.6
+ middle_emulation enabled
+ tap enabled
+}
+
+seat seat0 hide_cursor when-typing enable
+
+# Output
+output * {
+ bg "~/Pictures/wallpapers/bg.*" fill
+}
+
+output 'Dell Inc. DELL P2214H 29C2937M4YTL' {
+ # Vertical monitor
+ transform 270
+}
+
+output 'Samsung Electric Company SAMSUNG 0x00000001' {
+ # Zoom in because long distance
+ scale 2
+}
+
+# Focus
+focus_follows_mouse no
+floating_modifier Mod4 normal
+
+# Window rules
+for_window [window_role="pop-up"] floating enable
+for_window [window_role="task_dialog"] floating enable
+
+for_window [class="Qalculate"] floating enable
+for_window [class="Caprine"] floating enable, border normal 2
+for_window [title="^FZF-Jump$"] floating enable, border pixel 0, resize set 600 350
+
+for_window [class="^Betterbird$"] move container to workspace "11:Soc"
+
+exec "~/.config/sway/autostart.sh"
+
diff --git a/stow/sway/.config/sway/modes b/stow/sway/.config/sway/modes
new file mode 100644
index 0000000..237932b
--- /dev/null
+++ b/stow/sway/.config/sway/modes
@@ -0,0 +1,93 @@
+#
+# ~/.config/sway/modes
+# Modes for sway
+#
+
+set {
+ $alt Mod1
+ $flag Mod4
+}
+
+# Resizing
+bindsym $flag+r mode "resize"
+mode "resize" bindsym {
+ l resize grow width 10 px or 10 ppt
+ k resize grow height 10 px or 10 ppt
+ h resize shrink width 10 px or 10 ppt
+ j resize shrink height 10 px or 10 ppt
+
+ Shift+l resize grow width 50 px or 50 ppt
+ Shift+k resize grow height 50 px or 50 ppt
+ Shift+h resize shrink width 50 px or 50 ppt
+ Shift+j resize shrink height 50 px or 50 ppt
+
+ Right resize grow width 10 px or 10 ppt
+ Up resize grow height 10 px or 10 ppt
+ Left resize shrink width 10 px or 10 ppt
+ Down resize shrink height 10 px or 10 ppt
+
+ Shift+Right resize grow width 50 px or 50 ppt
+ Shift+Up resize grow height 50 px or 50 ppt
+ Shift+Left resize shrink width 50 px or 50 ppt
+ Shift+Down resize shrink height 50 px or 50 ppt
+
+ $flag+h move left
+ $flag+j move down
+ $flag+k move up
+ $flag+l move right
+
+ $flag+Left move left
+ $flag+Down move down
+ $flag+Up move up
+ $flag+Right move right
+
+ Return mode "default"
+ Escape mode "default"
+ $flag+r mode "default"
+}
+
+# System actions
+set $mode_system System (l)ock, (s)leep, (h)ibernate, (r)eboot, (Shift+s)hutdown
+bindsym Control+$alt+Delete mode "$mode_system"
+mode "$mode_system" bindsym {
+ l exec swaylock, mode "default"
+ s exec systemctl suspend, mode "default"
+ h exec systemctl hibernate, mode "default"
+ r exec systemctl reboot, mode "default"
+ Shift+s exec systemctl poweroff -i, mode "default"
+
+ Return mode "default"
+ Escape mode "default"
+ Control+$alt+Delete mode "default"
+}
+
+# Screenshots
+set $mode_screenshot Screenshot of (a)rea, current (w)indow, (s)creen - Shift to save
+set $save_format ~/Pictures/Screenshots/$(date +%F-%H-%M-%S).png
+bindsym Print mode "$mode_screenshot"
+mode "$mode_screenshot" bindsym {
+ a exec grimshot copy area, mode "default"
+ w exec grimshot --notify copy active, mode "default"
+ s exec grimshot --notify copy screen, mode "default"
+
+ Print exec grimshot --notify save screen $save_format mode "default" # Super fast screens!
+ Shift+a exec grimshot --notify save area $save_format, mode "default"
+ Shift+w exec grimshot --notify save active $save_format, mode "default"
+ Shift+s exec grimshot --notify save screen $save_format, mode "default"
+
+ Return mode "default"
+ Escape mode "default"
+}
+
+# Some preferences
+set $mode_preferences Toggle (s)unset, (n)otifications, (f)ocus
+bindsym $alt+end mode "$mode_preferences"
+mode "$mode_preferences" bindsym {
+ s exec "~/.scripts/wlsunset.sh", mode "default"
+ n exec "~/.scripts/dnd.sh", mode "default"
+ f exec "~/.scripts/focus.sh", mode "default"
+
+ Return mode "default"
+ Escape mode "default"
+ $alt+end mode "default"
+}
diff --git a/stow/sway/.config/sway/style b/stow/sway/.config/sway/style
new file mode 100644
index 0000000..d1668ac
--- /dev/null
+++ b/stow/sway/.config/sway/style
@@ -0,0 +1,27 @@
+#
+# ~/.config/sway/style
+# Styling for sway
+#
+
+# Decrease the height of the window bar thing.
+font pango:monospace 1
+
+bar {
+ swaybar_command /usr/bin/waybar
+ mode hide
+}
+
+default_border pixel 1
+default_floating_border normal 1
+hide_edge_borders both
+smart_borders on
+
+# Mimic no titles
+# border backgr. text indic. child_border
+client.focused #000000 #00897b #00897b #00897b #000000
+client.focused_inactive #000000 #222222 #222222 #222222 #000000
+client.unfocused #000000 #222222 #222222 #222222 #000000
+client.urgent #ff0000 #ff0000 #ff0000 #ff0000 #ff0000
+
+exec gsettings set org.gnome.desktop.interface icon-theme 'IcoSystem'
+exec gsettings set org.gnome.desktop.interface gtk-theme 'Nordic'
diff --git a/stow/waybar/.config/waybar/config b/stow/waybar/.config/waybar/config
new file mode 100644
index 0000000..a8198f5
--- /dev/null
+++ b/stow/waybar/.config/waybar/config
@@ -0,0 +1,45 @@
+//
+// ~/.config/waybar/config
+//
+
+[{
+
+ "name": "toggle",
+
+ "mode": "hide",
+ "ipc": true,
+
+ "position": "top",
+ "height": 25,
+ "spacing": 4,
+ "margin": "-25px 0 0 0", // Show this bar on top of the other one, seemingly the "same" one.
+
+ "custom/sep": {
+ "format": "\uf142"
+ },
+
+ "include": [
+ // Import modules (!)
+ "~/.config/waybar/modules.json",
+// "~/.config/waybar/default.json"
+ "~/.config/waybar/left.json"
+ ],
+
+},
+
+{
+
+ "name": "keep",
+ "position": "top",
+ "height": 25,
+ "modules-left": ["sway/mode", "custom/browser"],
+ "modules-center": ["sway/window"],
+ "modules-right": ["clock"],
+
+ "include": [
+ // Import modules (!)
+ "~/.config/waybar/modules.json"
+ ],
+
+}]
+
diff --git a/stow/waybar/.config/waybar/default.json b/stow/waybar/.config/waybar/default.json
new file mode 100644
index 0000000..d045a28
--- /dev/null
+++ b/stow/waybar/.config/waybar/default.json
@@ -0,0 +1,24 @@
+
+{
+ "modules-left": [
+ "idle_inhibitor",
+ "custom/media"
+ ],
+ "modules-center": [
+ "sway/workspaces"
+ ],
+ "modules-right": [
+ "disk",
+ "memory",
+ "cpu",
+ "temperature",
+ "custom/sep",
+ "bluetooth",
+ "network",
+ "pulseaudio",
+ "battery",
+ "custom/sep",
+ "tray"
+ ]
+}
+
diff --git a/stow/waybar/.config/waybar/left.json b/stow/waybar/.config/waybar/left.json
new file mode 100644
index 0000000..d8948f0
--- /dev/null
+++ b/stow/waybar/.config/waybar/left.json
@@ -0,0 +1,19 @@
+{
+ "modules-left": [
+ "sway/workspaces",
+ "idle_inhibitor",
+ "custom/media"
+ ],
+ "modules-right": [
+ "memory",
+ "cpu",
+ "temperature",
+ "custom/sep",
+ "bluetooth",
+ "network",
+ "pulseaudio",
+ "battery",
+ "custom/sep",
+ "tray"
+ ]
+}
diff --git a/stow/waybar/.config/waybar/mediaplayer.py b/stow/waybar/.config/waybar/mediaplayer.py
new file mode 100755
index 0000000..d0d8bbb
--- /dev/null
+++ b/stow/waybar/.config/waybar/mediaplayer.py
@@ -0,0 +1,131 @@
+#!/usr/bin/env python3
+# From:
+# https://github.com/Alexays/Waybar/blob/master/resources/custom_modules/mediaplayer.py
+
+import argparse
+import logging
+import sys
+import signal
+import gi
+import json
+gi.require_version('Playerctl', '2.0')
+from gi.repository import Playerctl, GLib
+
+logger = logging.getLogger(__name__)
+
+
+def write_output(text, player):
+ logger.info('Writing output')
+
+ output = {'text': text,
+ 'class': 'custom-' + player.props.player_name,
+ 'alt': player.props.player_name}
+
+ sys.stdout.write(json.dumps(output) + '\n')
+ sys.stdout.flush()
+
+
+def on_play(player, status, manager):
+ logger.info('Received new playback status')
+ on_metadata(player, player.props.metadata, manager)
+
+
+def on_metadata(player, metadata, manager):
+ logger.info('Received new metadata')
+ track_info = ''
+
+ if player.props.player_name == 'spotify' and \
+ 'mpris:trackid' in metadata.keys() and \
+ ':ad:' in player.props.metadata['mpris:trackid']:
+ track_info = 'AD PLAYING'
+ elif player.get_artist() != '' and player.get_title() != '':
+ track_info = '{artist} - {title}'.format(artist=player.get_artist(),
+ title=player.get_title())
+ else:
+ track_info = player.get_title()
+
+ if player.props.status != 'Playing' and track_info:
+ track_info = ' ' + track_info
+ write_output(track_info, player)
+
+
+def on_player_appeared(manager, player, selected_player=None):
+ if player is not None and (selected_player is None or player.name == selected_player):
+ init_player(manager, player)
+ else:
+ logger.debug("New player appeared, but it's not the selected player, skipping")
+
+
+def on_player_vanished(manager, player):
+ logger.info('Player has vanished')
+ sys.stdout.write('\n')
+ sys.stdout.flush()
+
+
+def init_player(manager, name):
+ logger.debug('Initialize player: {player}'.format(player=name.name))
+ player = Playerctl.Player.new_from_name(name)
+ player.connect('playback-status', on_play, manager)
+ player.connect('metadata', on_metadata, manager)
+ manager.manage_player(player)
+ on_metadata(player, player.props.metadata, manager)
+
+
+def signal_handler(sig, frame):
+ logger.debug('Received signal to stop, exiting')
+ sys.stdout.write('\n')
+ sys.stdout.flush()
+ # loop.quit()
+ sys.exit(0)
+
+
+def parse_arguments():
+ parser = argparse.ArgumentParser()
+
+ # Increase verbosity with every occurrence of -v
+ parser.add_argument('-v', '--verbose', action='count', default=0)
+
+ # Define for which player we're listening
+ parser.add_argument('--player')
+
+ return parser.parse_args()
+
+
+def main():
+ arguments = parse_arguments()
+
+ # Initialize logging
+ logging.basicConfig(stream=sys.stderr, level=logging.DEBUG,
+ format='%(name)s %(levelname)s %(message)s')
+
+ # Logging is set by default to WARN and higher.
+ # With every occurrence of -v it's lowered by one
+ logger.setLevel(max((3 - arguments.verbose) * 10, 0))
+
+ # Log the sent command line arguments
+ logger.debug('Arguments received {}'.format(vars(arguments)))
+
+ manager = Playerctl.PlayerManager()
+ loop = GLib.MainLoop()
+
+ manager.connect('name-appeared', lambda *args: on_player_appeared(*args, arguments.player))
+ manager.connect('player-vanished', on_player_vanished)
+
+ signal.signal(signal.SIGINT, signal_handler)
+ signal.signal(signal.SIGTERM, signal_handler)
+ signal.signal(signal.SIGPIPE, signal.SIG_DFL)
+
+ for player in manager.props.player_names:
+ if arguments.player is not None and arguments.player != player.name:
+ logger.debug('{player} is not the filtered player, skipping it'
+ .format(player=player.name)
+ )
+ continue
+
+ init_player(manager, player)
+
+ loop.run()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/stow/waybar/.config/waybar/modules.json b/stow/waybar/.config/waybar/modules.json
new file mode 100644
index 0000000..19ad84d
--- /dev/null
+++ b/stow/waybar/.config/waybar/modules.json
@@ -0,0 +1,156 @@
+{
+
+ "battery": {
+ "format": "{capacity}% {icon}",
+ "format-alt": "{time} {icon}",
+ "format-charging": "{capacity}% \uf0e7 {icon}",
+ "format-icons": ["\uf244", "\uf243", "\uf242", "\uf241", "\uf240"],
+ "format-plugged": "{capacity}% \ue55c",
+ "states": {
+ "warning": 30,
+ "critical": 15
+ }
+ },
+
+
+ "disk": {
+ "interval": 30,
+ "format": "{percentage_used}% \uf0a0",
+ "on-click": "alacritty -e ncdu /",
+ "path": "/",
+ "tooltip-format": "{used} used out of {total} on {path} ({percentage_free}% or {free} free)"
+ },
+
+
+ "bluetooth": {
+ "format-disabled": "\uf294",
+ "format-off": "\uf294",
+ "format-on": "\uf294",
+ "format-connected": "\uf294c",
+ "max-length": 10.3,
+ "on-click": "alacritty --title 'FZF-Jump' -e ~/.scripts/fzf-jump/standalone.sh ~/.scripts/fzf-jump/modules/bluetooth.sh",
+ "tooltip-format": "{status}",
+ "tooltip-format-on": "{status}, no devices connected",
+ "tooltip-format-connected": "{status} ({num_connections}):\n{device_enumerate}",
+ "tooltip-format-enumerate-connected": "{device_alias} ({device_address})",
+ "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}"
+ },
+
+
+ "clock": {
+ "format": "{:%H:%M}",
+ "format-alt": "{:%d/%m/%Y %H:%M}",
+ "timezone": "Europe/Brussels",
+ "tooltip-format": "{:%Y %B}\n{calendar}"
+ },
+
+
+ "custom/browser": {
+ "format": "\uf120",
+ "on-click": "alacritty -t 'FZF-Jump' -e ~/.scripts/fzf-jump/launcher.sh",
+ "tooltip-format": "Launch an application"
+ },
+
+
+ "custom/media": {
+ "escape": true,
+ "exec": "~/.config/waybar/mediaplayer.py 2> /dev/null",
+ "format": "{icon} {}",
+ "format-icons": {
+ "default": "\uf51f",
+ "spotify": "\uf1bc"
+ },
+ "max-length": 40,
+ "on-click": "playerctl play-pause",
+ "return-type": "json"
+ },
+
+
+ "cpu": {
+ "format": "{usage}% \uf2db",
+ "on-click": "alacritty -e htop",
+ "tooltip": true
+ },
+
+
+ "idle_inhibitor": {
+ "format": "{icon}",
+ "format-icons": {
+ "activated": "\uf06e",
+ "deactivated": "\uf070"
+ },
+ "tooltip": false
+ },
+
+
+ "memory": {
+ "format": "{}% \uf1c0",
+ "on-click": "alacritty -e htop"
+ },
+
+
+ "network": {
+ "format-disconnected": "\uf127",
+ "format-ethernet": "\uf6ff {ifname}: {ipadds}/{cidr}",
+ "format-wifi": "\uf1eb",
+ "interval": 5,
+ "on-click-right": "alacritty -e nmtui",
+ "tooltip-format": "{ifname}: {ipaddr}",
+ "tooltip-format-disconnected": "Disconnected",
+ "tooltip-format-wifi": "{essid} ({signalStrength}%)\n{ifname}: {ipaddr}"
+ },
+
+
+ "sway/window": {
+ "max-length": 85
+ },
+
+
+ "sway/workspaces": {
+ "all-outputs": false,
+ "disable-scroll": true,
+ "format": "{icon}{name}",
+ "format-icons": {
+ "default": "", // Prevent showing workspace name literal.
+ "urgent": "\uf071 "
+ },
+ // "persistent_workspaces": {
+ // "0:¯\\_(ツ)_/¯": []
+ // }
+ },
+
+
+ "pulseaudio": {
+ "format": "{volume}% {icon}{format_source}",
+ "format-bluetooth": "{volume}% {icon}\uf294{format_source}",
+ "format-bluetooth-muted": "\uf6a9 {icon}\uf294{format_source}",
+ "format-muted": "\uf6a9{format_source}",
+ "format-source": " {volume}% \uf130",
+ "format-source-muted": "",
+ "format-icons": {
+ "headphone": "\uf58f",
+ "hands-free": "\uf590",
+ "headset": "\uf590",
+ "phone": "\uf3ce",
+ "portable": "\uf3ce",
+ "car": "\uf1b9",
+ "default": ["\uf026", "\uf027", "\uf028 "]
+ },
+ "on-click": "pulsemixer --toggle-mute",
+ "on-click-right": "pavucontrol",
+ "scroll-step": 2
+ },
+
+
+ "temperature": {
+ "critical-threshold": 70,
+ "format": "{temperatureC}°C {icon}",
+ "format-icons": ["\uf2cb", "\uf2c9", "\uf2c7"]
+ },
+
+
+ "tray": {
+ "spacing": 10
+ }
+
+}
diff --git a/stow/waybar/.config/waybar/round.css b/stow/waybar/.config/waybar/round.css
new file mode 100644
index 0000000..61f2bab
--- /dev/null
+++ b/stow/waybar/.config/waybar/round.css
@@ -0,0 +1,50 @@
+/*
+ * ~/.config/waybar/round.css
+ *
+ * This stylesheet has round modules and titles.
+ */
+
+window#waybar {
+ color: @white;
+ background-color: transparent;
+}
+
+.modules-left {
+ background-color: @transparent-black;
+ border-radius: 0 20px 20px 0;
+ /* Coloured modules must hit the border! */
+ padding-right: 0;
+}
+
+.modules-center {
+ background-color: @transparent-black;
+ border-radius: 20px;
+}
+
+.keep .modules-center {
+ background-color: transparent;
+ padding: 0 10px;
+}
+
+.modules-right {
+ background-color: @transparent-black;
+ border-radius: 20px 0 0 20px;
+ padding-left: 10px;
+}
+
+#workspaces button {
+ border-radius: 20px;
+}
+
+#workspaces button:hover,
+#workspaces button.focused {
+ background-color: @accent;
+ border-radius: 20px;
+ color: @white;
+}
+
+#custom-media {
+ border-radius: 0 20px 20px 0;
+ padding-right: 10px;
+}
+
diff --git a/stow/waybar/.config/waybar/sharp.css b/stow/waybar/.config/waybar/sharp.css
new file mode 100644
index 0000000..131c554
--- /dev/null
+++ b/stow/waybar/.config/waybar/sharp.css
@@ -0,0 +1,23 @@
+/*
+ * ~/.config/waybar/sharp.css
+ *
+ * This stylesheet is a take on a minimal layout.
+ */
+
+window#waybar {
+ color: @white;
+ background-color: transparent;
+}
+
+#mode,
+.toggle .modules-left,
+.toggle .modules-right {
+ background-color: @transparent-black;
+}
+
+#mode,
+#workspaces button.focused,
+#workspaces button:hover {
+ box-shadow: inset 0 2px #ffffff;
+}
+
diff --git a/stow/waybar/.config/waybar/style.css b/stow/waybar/.config/waybar/style.css
new file mode 100644
index 0000000..499b543
--- /dev/null
+++ b/stow/waybar/.config/waybar/style.css
@@ -0,0 +1,132 @@
+/*
+ * ~/.config/waybar/style.css
+ *
+ * `otf-font-awesome` is required to be installed for icons.
+ *
+ * Pick your stylesheet:
+ * - sharp.css
+ * - transparent.css
+ * - round.css
+ */
+
+@define-color transparent-black rgba(23, 23, 23, 0.9);
+@define-color white #ecf0f1;
+@define-color warning-red #eb4d4b;
+@define-color accent #00897b;
+
+window#waybar {
+ font-family: Letter; /* This is my personal font. */
+ font-size: 13px;
+ transition-property: background-color;
+ transition-duration: .5s;
+}
+
+#window, #workspaces {
+ margin: 0 5px;
+}
+
+#workspaces button {
+ border: none;
+ border-radius: 0;
+ min-width: 30px;
+ padding: 0 5px;
+}
+
+#workspaces button:hover,
+#workspaces button.focused {
+ background-color: transparent;
+ color: @white;
+}
+
+#workspaces button.urgent {
+ color: @white;
+ background-color: @warning-red;
+}
+
+/* All modules individually. */
+#backlight, #battery, #bluetooth, #clock, #cpu,
+#custom-browser, #custom-media, #disk, #idle_inhibitor,
+#memory, #mode, #mpd, #network, #pulseaudio,
+#temperature, #tray {
+ padding: 0 5px;
+}
+
+/* If workspaces is the leftmost module, omit left margin */
+.modules-left > widget:first-child > #workspaces {
+ margin-left: 0;
+}
+
+/* If workspaces is the rightmost module, omit right margin */
+.modules-right > widget:last-child > #workspaces {
+ margin-right: 0;
+}
+
+@keyframes blink {
+ to {
+ background-color: #ffffff;
+ color: #000000;
+ }
+}
+
+label:focus {
+ background-color: #000000;
+}
+
+/* Module specific colours */
+
+#battery.charging, #battery.plugged {
+ color: #ffffff;
+ background-color: #26A65B;
+}
+
+#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;
+}
+
+#bluetooth.disabled,
+#bluetooth.off,
+#network.disconnected,
+#pulseaudio.muted {
+ opacity: 0.6;
+}
+
+#custom-media {
+ color: #2a5c45;
+ background-color: #66cc99;
+ min-width: 100px;
+}
+
+#custom-media.custom-spotify {
+ background-color: #66cc99;
+}
+
+#custom-media.custom-vlc {
+ background-color: #ffa000;
+}
+
+#temperature.critical {
+ background-color: #eb4d4b;
+}
+
+#idle_inhibitor.activated {
+ background-color: #ecf0f1;
+ color: #2d3436;
+}
+
+#tray > .passive {
+ -gtk-icon-effect: dim;
+}
+
+#tray > .needs-attention {
+ -gtk-icon-effect: highlight;
+ background-color: #eb4d4b;
+}
+
+@import "sharp.css";
+
diff --git a/stow/waybar/.config/waybar/transparent.css b/stow/waybar/.config/waybar/transparent.css
new file mode 100644
index 0000000..e2074ae
--- /dev/null
+++ b/stow/waybar/.config/waybar/transparent.css
@@ -0,0 +1,24 @@
+/*
+ * ~/.config/waybar/transparent.css
+ *
+ * This stylesheet is a minimalistic, transparent style.
+ */
+
+@define-color transparent-black-light rgba(23, 23, 23, 0.7);
+
+window#waybar {
+ color: @white;
+ background-color: transparent;
+}
+
+.toggle .modules-right,
+.toggle .modules-left {
+ background-color: @transparent-black-light;
+}
+
+#workspaces button:hover,
+#workspaces button.focused,
+#mode {
+ box-shadow: inset 0 2px #ffffff;
+}
+