From e2a8f86899fc75777b971d9ee4db5a467df895c1 Mon Sep 17 00:00:00 2001
From: Oliver Davies <oliver@oliverdavies.dev>
Date: Mon, 12 Jun 2023 23:32:34 +0100
Subject: [PATCH] refactor(sway): manage with Home Manager

---
 config/sway/config                       | 271 -----------------------
 config/{sway => wallpaper}/wallpaper.jpg | Bin
 home-manager/modules/common.nix          |   4 +-
 home-manager/modules/home-manager.nix    | 134 ++++++++++-
 system/nixos/nixedo/configuration.nix    |   9 +-
 5 files changed, 141 insertions(+), 277 deletions(-)
 delete mode 100644 config/sway/config
 rename config/{sway => wallpaper}/wallpaper.jpg (100%)

diff --git a/config/sway/config b/config/sway/config
deleted file mode 100644
index 7205e4f1..00000000
--- a/config/sway/config
+++ /dev/null
@@ -1,271 +0,0 @@
-# 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
-#
-# Logo key. Use Mod1 for Alt.
-set $mod Mod4
-
-# Home row direction keys, like vim
-set $left h
-set $down j
-set $up k
-set $right l
-
-# Your preferred terminal emulator
-set $term alacritty
-# Your preferred application launcher
-# Note: pass the final command to swaymsg so that the resulting window can be opened
-# on the original workspace that the command was run on.
-set $menu wofi --show run
-
-set $browser firefox
-
-set $wallpaper ~/.config/sway/wallpaper.jpg
-
-### Output configuration
-#
-# Default wallpaper (more resolutions are available in /run/current-system/sw/share/backgrounds/sway/)
-output * bg $wallpaper fill #000000
-
-#
-# Example configuration:
-#
-#   output HDMI-A-1 resolution 1920x1080 position 1920,0
-#
-# You can get the names of your outputs by running: swaymsg -t get_outputs
-output DP-7 resolution 2560x1440 scale 1.0
-output eDP-1 scale 1.0
-
-set $laptop eDP-1
-bindswitch --reload --locked lid:on output $laptop disable
-bindswitch --reload --locked lid:off output $laptop enable
-
-# bindsym $mod+1 [workspace="1"] move workspace to output current; workspace number 1
-# bindsym $mod+2 [workspace="2"] move workspace to output current; workspace number 2
-# bindsym $mod+3 [workspace="3"] move workspace to output current; workspace number 3
-# bindsym $mod+4 [workspace="4"] move workspace to output current; workspace number 4
-# bindsym $mod+5 [workspace="5"] move workspace to output current; workspace number 5
-# bindsym $mod+6 [workspace="6"] move workspace to output current; workspace number 6
-# bindsym $mod+7 [workspace="7"] move workspace to output current; workspace number 7
-# bindsym $mod+8 [workspace="8"] move workspace to output current; workspace number 8
-# bindsym $mod+9 [workspace="9"] move workspace to output current; workspace number 9
-# bindsym $mod+0 [workspace="10"] move workspace to output current; workspace number 10
-
-bindsym $mod+tab workspace back_and_forth
-
-bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%-
-bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+
-
-### Idle configuration
-exec swayidle -w \
-    timeout 300 'swaylock -f -i $wallpaper \
-    timeout 600 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"' \
-    before-sleep "swaylock -f -i $wallpaper"
-
-bindsym $mod+Escape exec swaylock -f -i $wallpaper #000000
-
-### Input configuration
-#
-# Example configuration:
-#
-#   input "2:14:SynPS/2_Synaptics_TouchPad" {
-#       dwt enabled
-#       tap enabled
-#       natural_scroll enabled
-#       middle_emulation enabled
-#   }
-#
-# You can get the names of your inputs by running: swaymsg -t get_inputs
-# Read `man 5 sway-input` for more information about this section.
-
-### Key bindings
-#
-# Basics:
-#
-    # Start a terminal
-    bindsym $mod+Return exec $term
-
-    # Kill focused window
-    bindsym $mod+Shift+q kill
-
-    # Start your launcher
-    bindsym $mod+d exec $menu
-
-    bindsym $mod+Shift+b exec $browser
-
-    # 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
-
-    # Exit sway (logs you out of your Wayland session)
-    bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit'
-
-exec nm-applet --indicator
-
-#
-# Moving around:
-#
-    # Move your focus around
-    bindsym $mod+$left focus left
-    bindsym $mod+$down focus down
-    bindsym $mod+$up focus up
-    bindsym $mod+$right focus right
-    # Or use $mod+[up|down|left|right]
-    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:
-#
-    # Switch to workspace
-    bindsym $mod+1 workspace number 1
-    bindsym $mod+2 workspace number 2
-    bindsym $mod+3 workspace number 3
-    bindsym $mod+4 workspace number 4
-    bindsym $mod+5 workspace number 5
-    bindsym $mod+6 workspace number 6
-    bindsym $mod+7 workspace number 7
-    bindsym $mod+8 workspace number 8
-    bindsym $mod+9 workspace number 9
-    bindsym $mod+0 workspace number 10
-    # Move focused container to workspace
-    bindsym $mod+Shift+1 move container to workspace number 1
-    bindsym $mod+Shift+2 move container to workspace number 2
-    bindsym $mod+Shift+3 move container to workspace number 3
-    bindsym $mod+Shift+4 move container to workspace number 4
-    bindsym $mod+Shift+5 move container to workspace number 5
-    bindsym $mod+Shift+6 move container to workspace number 6
-    bindsym $mod+Shift+7 move container to workspace number 7
-    bindsym $mod+Shift+8 move container to workspace number 8
-    bindsym $mod+Shift+9 move container to workspace number 9
-    bindsym $mod+Shift+0 move container to workspace number 10
-    # Note: workspaces can have any name you want, not just numbers.
-    # We just use 1-10 as the default.
-#
-# Layout stuff:
-#
-    # You can "split" the current object of your focus with
-    # $mod+b or $mod+v, for horizontal and vertical splits
-    # respectively.
-    bindsym $mod+b 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 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+a focus parent
-#
-# Scratchpad:
-#
-    # Sway has a "scratchpad", which is a bag of holding for windows.
-    # You can send windows there and get them back later.
-
-    # Move the currently focused window to the scratchpad
-    bindsym $mod+Shift+minus move scratchpad
-
-    # Show the next scratchpad window or hide the focused scratchpad window.
-    # If there are multiple scratchpad windows, this command cycles through them.
-    bindsym $mod+minus scratchpad show
-#
-# Resizing containers:
-#
-mode "resize" {
-    # left will shrink the containers width
-    # right will grow the containers width
-    # up will shrink the containers height
-    # down will grow the containers height
-    bindsym $left resize shrink width 10px
-    bindsym $down resize grow height 10px
-    bindsym $up resize shrink height 10px
-    bindsym $right resize grow width 10px
-
-    # Ditto, with arrow keys
-    bindsym Left resize shrink width 10px
-    bindsym Down resize grow height 10px
-    bindsym Up resize shrink height 10px
-    bindsym Right resize grow width 10px
-
-    # Return to default mode
-    bindsym Return mode "default"
-    bindsym Escape mode "default"
-}
-bindsym $mod+r mode "resize"
-
-#
-# Status Bar:
-#
-# Read `man 5 sway-bar` for more information about this section.
-bar {
-    position bottom
-    tray_padding 10px
-    font pango:DejaVu Sans Mono 16
-
-    # When the status_command prints a new line to stdout, swaybar updates.
-    # The default just shows the current date and time.
-    # status_command while date +'%Y-%m-%d %I:%M:%S %p'; do sleep 1; done
-    status_command i3status-rs ~/.config/i3status-rust/config-default.toml
-
-    colors {
-        statusline #ffffff
-        background #323232
-        focused_workspace #ffffff #ffffff #333333
-    }
-}
-
-default_border pixel 3
-
-input * {
-    xkb_layout "gb"
-}
-
-input type:touchpad {
-  tap enabled
-  dwt enabled
-  natural_scroll disabled
-}
-
-smart_borders on
-smart_gaps on
-gaps inner 10
-
-exec configure-gtk
-
-bindsym --locked XF86AudioLowerVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- -l 1.2
-bindsym --locked XF86AudioRaiseVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ -l 1.2
-
-assign [app_id="Alacritty"] workspace 1
-assign [app_id="firefox"] workspace 2
-assign [class="Slack"] workspace 10
-assign [class="discord"] workspace 10
-# Get app_id with swaymsg -t get_tree
-
-include /etc/sway/config.d/*
diff --git a/config/sway/wallpaper.jpg b/config/wallpaper/wallpaper.jpg
similarity index 100%
rename from config/sway/wallpaper.jpg
rename to config/wallpaper/wallpaper.jpg
diff --git a/home-manager/modules/common.nix b/home-manager/modules/common.nix
index f3d11d34..2ae15458 100644
--- a/home-manager/modules/common.nix
+++ b/home-manager/modules/common.nix
@@ -257,8 +257,8 @@ in
     recursive = true;
   };
 
-  xdg.configFile.sway = {
-    source = ../../config/sway;
+  xdg.configFile.wallpaper = {
+    source = ../../config/wallpaper;
     recursive = true;
   };
 }
diff --git a/home-manager/modules/home-manager.nix b/home-manager/modules/home-manager.nix
index ef13b046..da0c4cb2 100644
--- a/home-manager/modules/home-manager.nix
+++ b/home-manager/modules/home-manager.nix
@@ -1,4 +1,4 @@
-{ config, pkgs, ... }: {
+{ config, lib, pkgs, ... }: {
   home.username = "opdavies";
   home.homeDirectory = "/home/opdavies";
 
@@ -6,6 +6,121 @@
 
   programs.home-manager.enable = true;
 
+  services.swayidle.enable = true;
+
+  services.swayidle.events = [
+    {
+      event = "before-sleep";
+      command = "${pkgs.swaylock}/bin/swaylock --daemonize --image ~/.config/wallpaper/wallpaper.jpg";
+    }
+  ];
+
+  services.swayidle.timeouts = [
+    {
+      timeout = 60;
+      command = "${pkgs.swaylock}/bin/swaylock --daemonize --image ~/.config/wallpaper/wallpaper.jpg";
+    }
+    {
+      timeout = 300;
+      command = "swaymsg 'output * dpms off'";
+      resumeCommand = "swaymsg 'output * dpms on'";
+    }
+  ];
+
+  programs.swaylock.enable = true;
+  programs.swaylock.settings = {
+    daemonize = true;
+    image = "~/.config/wallpaper/wallpaper.jpg";
+  };
+
+  wayland.windowManager.sway.enable = true;
+
+  wayland.windowManager.sway.config = {
+    assigns = {
+      "1" = [{ app_id = "firefox"; }];
+      "2" = [{ app_id = "Alacritty"; }];
+      "3" = [{ class = "vlc"; }];
+      "10" = [
+        { class = "Slack"; }
+        { class = "discord"; }
+      ];
+      # Get app_id with swaymsg -t get_tree
+    };
+
+    bars = [
+      {
+        colors = {
+          background = "#323232";
+          focusedWorkspace = {
+            background = "#ffffff";
+            border = "#ffffff";
+            text = "#333333";
+          };
+          statusline = "#ffffff";
+        };
+
+        fonts = {
+          names = [ "DejaVu Sans Mono" ];
+          size = 16.0;
+        };
+
+        statusCommand = "i3status-rs ~/.config/i3status-rust/config-default.toml";
+        trayPadding = 10;
+      }
+    ];
+
+    gaps.inner = 10;
+    gaps.smartBorders = "on";
+    gaps.smartGaps = true;
+
+    input = {
+      "*" = {
+        xkb_layout = "gb";
+      };
+
+      "type:touchpad" = {
+        dwt = "enabled";
+        tap = "enabled";
+      };
+    };
+
+    keybindings =
+      let modifier = config.wayland.windowManager.sway.config.modifier;
+      in lib.mkOptionDefault {
+        "${modifier}+Escape" = "exec swaylock --daemonize";
+        "${modifier}+Shift+b" = "exec firefox";
+        "${modifier}+tab" = "workspace back_and_forth";
+    };
+
+    menu = "wofi --show run";
+    modifier = "Mod4";
+
+    output = {
+      "*" = {
+        bg = "~/.config/wallpaper/wallpaper.jpg fill";
+      };
+
+      eDP-1 = {
+        scale = "1.0";
+      };
+    };
+
+    terminal = "alacritty";
+
+    window.border = 3;
+  };
+
+  wayland.windowManager.sway.extraConfig = ''
+    set $laptop eDP-1
+    bindswitch --reload --locked lid:on output $laptop disable
+    bindswitch --reload --locked lid:off output $laptop enable
+
+    bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%-
+    bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+
+
+    for_window [class="vlc"] inhibit_idle fullscreen
+  '';
+
   programs.i3status-rust = {
     enable = true;
 
@@ -44,6 +159,23 @@
             format = " $timestamp.datetime(f:'%F %T') ";
           }
         ];
+
+        settings = {
+          theme = {
+            theme = "plain";
+            overrides = {
+              good_bg = "#333333";
+              good_fg = "#ffffff";
+              idle_bg = "#333333";
+              idle_fg = "#ffffff";
+              info_bg = "#333333";
+              info_fg = "#ffffff";
+              separator_bg = "#333333";
+              warning_bg = "#333333";
+              warning_fg = "#ffffff";
+            };
+          };
+        };
       };
     };
   };
diff --git a/system/nixos/nixedo/configuration.nix b/system/nixos/nixedo/configuration.nix
index ca702a2c..8fb58c00 100644
--- a/system/nixos/nixedo/configuration.nix
+++ b/system/nixos/nixedo/configuration.nix
@@ -118,9 +118,12 @@ in {
     [
       brightnessctl
       configure-gtk
-      i3status-rust
-      swayidle
-      swaylock
+      ffmpegthumbnailer
+      google-chrome
+      swaybg
+      xfce.thunar
+      xfce.thunar-volman
+      xfce.tumbler
     ];
 
   xdg.portal = {