From bd16449cc86860b763bdf2707786fae33093b2b2 Mon Sep 17 00:00:00 2001 From: Nathan McCarty Date: Tue, 15 Jul 2025 01:33:34 -0400 Subject: [PATCH] Basic sway setup --- home-manager/machines/crash/home.nix | 1 + home-manager/modules/programs/sway.nix | 159 +++++++++++++++++++++++-- nixos/machines/swarm/configuration.nix | 10 +- 3 files changed, 156 insertions(+), 14 deletions(-) diff --git a/home-manager/machines/crash/home.nix b/home-manager/machines/crash/home.nix index 29f8509..ba817ef 100644 --- a/home-manager/machines/crash/home.nix +++ b/home-manager/machines/crash/home.nix @@ -36,6 +36,7 @@ (import ../../modules/programs/emacs.nix {}) ../../modules/programs/fonts.nix ../../modules/programs/desktop.nix + ../../modules/programs/sway.nix ../../modules/programs/media.nix ../../modules/programs/games.nix ]; diff --git a/home-manager/modules/programs/sway.nix b/home-manager/modules/programs/sway.nix index e2a6452..90cdceb 100644 --- a/home-manager/modules/programs/sway.nix +++ b/home-manager/modules/programs/sway.nix @@ -4,21 +4,162 @@ pkgs, inputs', ... -}: { +}: let + fuzzel-command = ''fuzzel -f "Iosevka Sans Quasi:size=16" -b "181818cc" -S "b9b9b9ff" -s "252525cc" -t "777777ff" -B 5 -r 5 -C "70b433cc" --width=80 --lines=25''; +in { home.packages = with pkgs; [ inputs'.nixpkgs-unstable.legacyPackages.xwayland-satellite + # Clipboard + wl-clipboard + cliphist + # Launcher + fuzzel + # Polkit + kdePackages.polkit-kde-agent-1 + # Locking + swaylock-effects + swayidle ]; - wayland.windowManger.sway = { + wayland.windowManager.sway = { enable = true; package = null; - sway = { - xwayland = false; - config = { - modifer = "Mod4"; - startup = [ - {command = "env DISPLAY=:0 xwayland-satellite";} - ]; + swaynag.enable = true; + xwayland = false; + config = let + modifier = "Mod4"; + in { + inherit modifier; + # Disable bars in the sway config, we'll launch ours through systemd + bars = []; + # Cosmetic settings + gaps = let + big = 5; + small = 3; + in { + inner = big; + outer = small; + smartBorders = "on"; + smartGaps = true; }; + # Making trying to go to the current workspace send you back to your previous one + workspaceAutoBackAndForth = true; + # Use foot client as the default terminal + terminal = "footclient"; + # Keybinding configuration + keybindings = { + "${modifier}+d" = "exec ${fuzzel-command} --prompt='❯ '"; + "${modifier}+x" = "exec cliphist list | ${fuzzel-command} --prompt=' ❯ ' --dmenu | cliphist decode | wl-copy"; + }; + # Start programs when sway starts + startup = [ + # Use xwayland-satellite as our xwayland server to disable scaling for x11 apps + {command = "env DISPLAY=:0 xwayland-satellite";} + # Setup wl-paste for clipboard memory + {command = "wl-paste --watch cliphist store --250";} + ]; + # Floating window rules + floating.criteria = [ + # Basic window role/type detection + #{ window_role = "pop-up"; } + #{ window_role = "bubble"; } + #{ window_role = "dialog"; } + #{ window_type = "dialog"; } + #{ window_role = "task_dialog"; } + #{ window_type = "menu"; } + #{ window_role = "About"; } + #{ window_role = "Preferences"; } + # "Common" app id detection + #{ app_id = "floating"; } + #{ app_id = "floating_update"; } + #{ class = "(?i)pinentry"; } + #{ app_id = "Yad"; } + #{ app_id = "yad"; } + {app_id = ".*polkit.*";} + {title = "^Open File$";} + {title = "^Open Files$";} + # { title = "^Open$"; } + {title = "^Choose Files$";} + {title = "^Save As$";} + # { title = "^$"; } + {title = "Save File";} + {title = "File Operation Progress";} + {title = "(?i)(?:copying|deleting|moving)";} + # Firefox stuff + {title = "About Mozilla Firefox";} + {title = "Firefox - Sharing Indicator";} + {title = "Firefox — Sharing Indicator";} + # Specific applications + {app_id = "pavucontrol";} + {app_id = ".*blueman-manager.*";} + ]; + window.commands = [ + { + command = "floating enable, sticky enable"; + criteria = { + app_id = "firefox(-\w*)?"; + title = "Library"; + }; + } + { + command = "floating enable, sticky enable"; + criteria = { + title = "[Pp]icture-in-[Pp]icture"; + }; + } + ]; + }; + systemd = { + enable = true; + variables = ["--all"]; + }; + wrapperFeatures = { + gtk = true; }; }; + # Services to have sway act like a desktop environment + services.blueman-applet.enable = true; + systemd.user.services.polkit-kde = { + Unit = { + Description = "Polkit kde authentication agent"; + After = ["graphical-session.target"]; + }; + Service = { + Type = "simple"; + ExecStart = "${pkgs.libsForQt5.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1"; + Restart = "on-failure"; + }; + Install = { + WantedBy = ["graphical-session.target"]; + }; + }; + services.swayidle = let + swaylock-package = pkgs.swaylock-effects; + swaylock-command = ''--screenshots --grace 30 --indicator --clock --timestr "%-I:%M:%S %p" --datestr "%A %Y-%M-%d" --effect-blur 20x3''; + in { + enable = true; + timeouts = [ + # Lock the screen after 5 minutes of inactivity + { + timeout = 300; + command = "${swaylock-package}/bin/swaylock ${ + builtins.replaceStrings ["%"] ["%%"] swaylock-command + }"; + } + # Turn off the displays after 10 minutes of inactivity + { + timeout = 600; + command = ''swaymsg "output * dpms off"''; + resumeCommand = ''swaymsg "output * dpms on"''; + } + ]; + }; } +# TODOs: +# - [ ] Dropdown terminal +# - [ ] SwayFX and eyecandy configuration +# - [ ] Brightness control +# - [ ] Volume control +# - [ ] Floating, centered, and specific portion of screen for all configuration apps +# - [ ] Bar +# - [ ] Notifications +# - [x] Port over default floating rules diff --git a/nixos/machines/swarm/configuration.nix b/nixos/machines/swarm/configuration.nix index 63dcb68..64b35a6 100644 --- a/nixos/machines/swarm/configuration.nix +++ b/nixos/machines/swarm/configuration.nix @@ -102,11 +102,11 @@ services.desktopManager.plasma6.enable = true; environment.sessionVariables.NIXOS_OZONE_WL = "1"; # Enable swaywm - # programs.sway = { - # enable = true; - # package = inputs'.swayfx.packages.default; - # wrapperFeatures.gtk = true; - # }; + programs.sway = { + enable = true; + # package = inputs'.swayfx.packages.default; + wrapperFeatures.gtk = true; + }; # Setup bluetooth hardware.bluetooth.enable = true;