From f572f67dff6ba9284c7864953ed913892e92d48f Mon Sep 17 00:00:00 2001 From: alejandro-angulo Date: Sat, 3 Aug 2024 09:21:12 -0700 Subject: [PATCH] Converted sway to a home module --- homes/x86_64-linux/alejandro/default.nix | 9 +- modules/home/windowManagers/sway/default.nix | 315 ++++++++++++++++++ .../windowManagers}/sway/wallpaper.jpg | Bin modules/nixos/desktop/sway/default.nix | 305 ----------------- modules/nixos/hardware/logitech/default.nix | 14 +- modules/nixos/suites/desktop/default.nix | 6 - 6 files changed, 324 insertions(+), 325 deletions(-) create mode 100644 modules/home/windowManagers/sway/default.nix rename modules/{nixos/desktop => home/windowManagers}/sway/wallpaper.jpg (100%) delete mode 100644 modules/nixos/desktop/sway/default.nix diff --git a/homes/x86_64-linux/alejandro/default.nix b/homes/x86_64-linux/alejandro/default.nix index e944151..d386264 100644 --- a/homes/x86_64-linux/alejandro/default.nix +++ b/homes/x86_64-linux/alejandro/default.nix @@ -18,8 +18,6 @@ firefox.enable = true; gpg.enable = true; kitty.enable = true; - rofi.enable = true; - swaylock.enable = true; }; tools = { @@ -29,11 +27,6 @@ zsh.enable = true; }; - services = { - gammastep.enable = true; - playerctld.enable = true; - swayidle.enable = true; - swaync.enable = true; - }; + windowManagers.sway.enable = true; }; } diff --git a/modules/home/windowManagers/sway/default.nix b/modules/home/windowManagers/sway/default.nix new file mode 100644 index 0000000..738b22c --- /dev/null +++ b/modules/home/windowManagers/sway/default.nix @@ -0,0 +1,315 @@ +{ + config, + pkgs, + lib, + namespace, + ... +}: let + inherit (lib) mkEnableOption mkOption mkIf types; + + cfg = config.${namespace}.windowManagers.sway; + nag = "swaynag"; + left = "h"; + right = "l"; + up = "k"; + down = "j"; + modifier = "Mod4"; + + # TODO: This assumes I'll be using rofi and kitty. Should make more generic. + menu = "rofi -show run"; + terminal = "kitty"; + + generate_grimshot_command = target: '' + exec mkdir -p ~/screenshots \ + && ${pkgs.sway-contrib.grimshot}/bin/grimshot --notify save ${target} \ + ~/screenshots/"$(date -u --iso-8601=seconds)".png + ''; +in { + options.${namespace}.windowManagers.sway = { + enable = mkEnableOption "sway"; + + wallpaperPath = mkOption { + type = types.str; + default = "sway/wallpaper.jpg"; + description = '' + Path to wallpaper, relative to xdg.dataHome + ''; + }; + }; + + config = mkIf cfg.enable { + ${namespace} = { + programs = { + kitty.enable = true; + rofi.enable = true; + swaylock.enable = true; + waybar.enable = true; + }; + services = { + gammastep.enable = true; + playerctld.enable = true; + swayidle.enable = true; + swaync.enable = true; + }; + }; + + home.packages = with pkgs; [ + feh + grim + slurp + sway-contrib.grimshot + wev + wl-clipboard + xdg-utils + ]; + + # For screen sharing to work + xdg.portal = { + enable = true; + extraPortals = with pkgs; [xdg-desktop-portal-wlr xdg-desktop-portal-gtk]; + config.common.default = "*"; + }; + + xdg.dataFile.${cfg.wallpaperPath}.source = ./wallpaper.jpg; + + wayland.windowManager.sway = { + # WORKAROUND: https://github.com/nix-community/home-manager/issues/5311 + checkConfig = false; + + enable = true; + swaynag.enable = true; + wrapperFeatures.gtk = true; # so that gtk works properly + systemd.enable = true; # needed this for screen sharing to work + + config = { + inherit terminal menu left right up down modifier; + workspaceAutoBackAndForth = true; + + colors = { + focused = { + border = "#2B3C44"; + background = "#4E3D45"; + text = "#FFFFFF"; + indicator = "#333333"; + childBorder = "#000000"; + }; + focusedInactive = { + border = "#484848"; + background = "#333333"; + text = "#FFFFFF"; + indicator = "#000000"; + childBorder = "#000000"; + }; + unfocused = { + border = "#484848"; + background = "#333333"; + text = "#FFFFFF"; + indicator = "#000000"; + childBorder = "#000000"; + }; + }; + + window = { + titlebar = true; + commands = [ + { + command = "inhibit_idle fullscreen"; + criteria = {class = ".*";}; + } + ]; + }; + + focus.followMouse = false; + + fonts = { + names = ["Hack Nerd Font"]; + size = 10.0; + }; + + # TODO: Should this live at the system configuration level? + output = { + "*".bg = "${config.xdg.dataHome}/${cfg.wallpaperPath} fill"; + "eDP-1".scale = "1"; + "Dell Inc. DELL S2721QS 4FR7M43".position = "0 0"; + "Dell Inc. DELL S2721QS 47W7M43".position = "0 2160"; + }; + + modes = { + 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 + "${left}" = "resize shrink width 50px"; + "${down}" = "resize grow height 50px"; + "${up}" = "resize shrink height 50px"; + "${right}" = "resize grow width 50px"; + + # Ditto, with arrow keys + "Left" = "resize shrink width 50px"; + "Down" = "resize grow height 50px"; + "Up" = "resize shrink height 50px"; + "Right" = "resize grow width 50px"; + + # Exit resize mode + "Insert" = "mode default"; + "Escape" = "mode default"; + "Return" = "mode default"; + }; + + nag = { + "Ctrl+d" = "mode default"; + + "Ctrl+c" = "exec ${nag} --exit"; + "q" = "exec ${nag} --exit"; + "Escape" = "exec ${nag} --exit"; + + "Return" = "exec ${nag} --confirm"; + + "j" = "exec ${nag} --next"; + "Tab" = "exec ${nag} --next"; + "Up" = "exec ${nag} --next"; + + "k" = "exec ${nag} --prev"; + "Shift+Tab" = "exec ${nag} prev"; + "Down" = "exec ${nag} prev"; + }; + }; + + keybindings = { + # Activate modes + "${modifier}+s" = "mode resize"; + + # Misc + "${modifier}+Return" = "exec ${terminal}"; + "${modifier}+c" = "kill"; + "${modifier}+p" = "exec ${menu}"; + "${modifier}+z" = "reload"; + "${modifier}+x" = "exec swaylock"; + + # Volume control + "XF86AudioRaiseVolume" = " exec 'pamixer --increase 5'"; + "XF86AudioLowerVolume" = " exec 'pamixer --decrease 5'"; + "XF86AudioMute" = " exec 'pamixer --toggle-mute'"; + + # Music player control + "XF86AudioPrev" = "exec 'playerctl previous'"; + "XF86AudioNext" = "exec 'playerctl next'"; + "XF86AudioPlay" = "exec 'playerctl play-pause'"; + "${modifier}+Down" = "exec 'playerctl pause'"; + "${modifier}+Up" = "exec 'playerctl play'"; + "${modifier}+Right" = "exec 'playerctl next'"; + "${modifier}+Left" = "exec 'playerctl previous'"; + + # Backlight keys + "XF86MonBrightnessDown" = "exec 'light -U 5'"; + "XF86MonBrightnessUp" = "exec 'light -A 5'"; + + # Navigation + + ## Focus + + ### Move your focus around + "${modifier}+${left}" = "focus left"; + "${modifier}+${down}" = "focus down"; + "${modifier}+${up}" = "focus up"; + "${modifier}+${right}" = "focus right"; + + ### Move the focused window with the same, but add Shift + "${modifier}+Shift+${left}" = "move left"; + "${modifier}+Shift+${down}" = "move down"; + "${modifier}+Shift+${up}" = "move up"; + "${modifier}+Shift+${right}" = "move right"; + + ## Workspaces + + ### Switch to a workspace + "${modifier}+q" = "workspace number 1"; + "${modifier}+w" = "workspace number 2"; + "${modifier}+e" = "workspace number 3"; + "${modifier}+r" = "workspace number 4"; + "${modifier}+t" = "workspace number 5"; + "${modifier}+y" = "workspace number 6"; + "${modifier}+u" = "workspace number 7"; + "${modifier}+i" = "workspace number 8"; + "${modifier}+o" = "workspace number 9"; + + ### Move focused container to workspace + "${modifier}+Shift+q" = "move container to workspace number 1"; + "${modifier}+Shift+w" = "move container to workspace number 2"; + "${modifier}+Shift+e" = "move container to workspace number 3"; + "${modifier}+Shift+r" = "move container to workspace number 4"; + "${modifier}+Shift+t" = "move container to workspace number 5"; + "${modifier}+Shift+y" = "move container to workspace number 6"; + "${modifier}+Shift+u" = "move container to workspace number 7"; + "${modifier}+Shift+i" = "move container to workspace number 8"; + "${modifier}+Shift+o" = "move container to workspace number 9"; + + # Layout + + ## Split direction + "${modifier}+v" = "splith"; + "${modifier}+g" = "splitv"; + + ## Switch the current container between different layout styles + "${modifier}+b" = "layout stacking"; + "${modifier}+n" = "layout tabbed"; + "${modifier}+m" = "layout toggle split"; + + ## Make the current focus fullscreen + "${modifier}+f" = "fullscreen"; + + ## move container between displays + "${modifier}+semicolon" = "move workspace to output up"; + + ## Toggle the current focus between tiling and floating mode + "${modifier}+Shift+f" = "floating toggle"; + + ## Swap focus between the tiling area and the floating area + "${modifier}+space" = "focus mode_toggle"; + + ## Move focus to the parent container + "${modifier}+a" = "focus parent"; + + # Notifications + + ## Toggle notification center + "${modifier}+Shift+n" = "exec '${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw'"; + + ## Toggle Do Not Disturb + "${modifier}+Shift+d" = "exec '${pkgs.swaynotificationcenter}/bin/swaync-client -d -sw'"; + + # Screenshots + + ## Current window + "${modifier}+period" = generate_grimshot_command "active"; + + ## Area selection + "${modifier}+Shift+period" = generate_grimshot_command "area"; + + ## Current output + "${modifier}+Alt+period" = generate_grimshot_command "output"; + + ## Window selection + "${modifier}+Ctrl+period" = generate_grimshot_command "window"; + + # Scratchpad + # Move the currently focused window to the scratchpad + "${modifier}+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. + "${modifier}+minus" = "scratchpad show"; + + # TODO: Get keyboard navigation working with this + # Exit sway (logs you out of your Wayland session) + "${modifier}+Shift+z" = '' + exec ${nag} -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' \ + -b 'Reload' 'swaymsg reload' + ''; + }; + }; + }; + }; +} diff --git a/modules/nixos/desktop/sway/wallpaper.jpg b/modules/home/windowManagers/sway/wallpaper.jpg similarity index 100% rename from modules/nixos/desktop/sway/wallpaper.jpg rename to modules/home/windowManagers/sway/wallpaper.jpg diff --git a/modules/nixos/desktop/sway/default.nix b/modules/nixos/desktop/sway/default.nix deleted file mode 100644 index d1f9132..0000000 --- a/modules/nixos/desktop/sway/default.nix +++ /dev/null @@ -1,305 +0,0 @@ -{ - options, - config, - lib, - pkgs, - ... -}: -with lib; let - cfg = config.aa.desktop.sway; - user_cfg = config.home-manager.users.${config.aa.user.name}; - nag = "swaynag"; - left = "h"; - right = "l"; - up = "k"; - down = "j"; - modifier = "Mod4"; - - # TODO: This assume I'll be using rofi and alacritty. Should make more - # generic. - menu = "rofi -show run"; - terminal = "alacritty"; - - generate_grimshot_command = target: ''exec mkdir -p ~/screenshots && ${pkgs.sway-contrib.grimshot}/bin/grimshot --notify save ${target} ~/screenshots/"$(date -u --iso-8601=seconds)".png''; -in { - options.aa.desktop.sway = with types; { - enable = mkEnableOption "sway"; - - wallpaperPath = mkOption { - type = str; - default = "sway/wallpaper.jpg"; - description = '' - Path to wallpaper, relative to config.home-home-manager.users..xdg.dataHome - ''; - }; - }; - - config = mkIf cfg.enable { - aa.desktop.addons = { - alacritty.enable = true; - - # TODO - # light - }; - - aa.system.fonts.enable = true; - - environment.systemPackages = with pkgs; [ - feh - grim - slurp - sway-contrib.grimshot - wev - wl-clipboard - xdg-desktop-portal-wlr - xdg-utils - ]; - - # For screen sharing to work - xdg.portal = { - enable = true; - extraPortals = with pkgs; [xdg-desktop-portal-gtk]; - wlr.enable = true; - config.common.default = "*"; - }; - - aa.home.dataFile = { - ${cfg.wallpaperPath}.source = ./wallpaper.jpg; - }; - aa.home.extraOptions = { - wayland.windowManager.sway = { - # WORKAROUND: https://github.com/nix-community/home-manager/issues/5311 - checkConfig = false; - - enable = true; - swaynag.enable = true; - wrapperFeatures.gtk = true; # so that gtk works properly - systemd.enable = true; # needed this for screen sharing to work - - config = { - inherit (terminal menu left right up down modifier); - workspaceAutoBackAndForth = true; - - colors = { - focused = { - border = "#2B3C44"; - background = "#4E3D45"; - text = "#FFFFFF"; - indicator = "#333333"; - childBorder = "#000000"; - }; - focusedInactive = { - border = "#484848"; - background = "#333333"; - text = "#FFFFFF"; - indicator = "#000000"; - childBorder = "#000000"; - }; - unfocused = { - border = "#484848"; - background = "#333333"; - text = "#FFFFFF"; - indicator = "#000000"; - childBorder = "#000000"; - }; - }; - - window = { - titlebar = true; - commands = [ - { - command = "inhibit_idle fullscreen"; - criteria = {class = ".*";}; - } - ]; - }; - - focus.followMouse = false; - - fonts = { - names = ["Hack Nerd Font"]; - size = 10.0; - }; - - # TODO: Should this live at the system configuration level? - output = { - "*".bg = "${user_cfg.xdg.dataHome}/${cfg.wallpaperPath} fill"; - "eDP-1".scale = "1"; - "Dell Inc. DELL S2721QS 4FR7M43".position = "0 0"; - "Dell Inc. DELL S2721QS 47W7M43".position = "0 2160"; - }; - - modes = { - 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 - "${left}" = "resize shrink width 50px"; - "${down}" = "resize grow height 50px"; - "${up}" = "resize shrink height 50px"; - "${right}" = "resize grow width 50px"; - - # Ditto, with arrow keys - "Left" = "resize shrink width 50px"; - "Down" = "resize grow height 50px"; - "Up" = "resize shrink height 50px"; - "Right" = "resize grow width 50px"; - - # Exit resize mode - "Insert" = "mode default"; - "Escape" = "mode default"; - "Return" = "mode default"; - }; - - nag = { - "Ctrl+d" = "mode default"; - - "Ctrl+c" = "exec ${nag} --exit"; - "q" = "exec ${nag} --exit"; - "Escape" = "exec ${nag} --exit"; - - "Return" = "exec ${nag} --confirm"; - - "j" = "exec ${nag} --next"; - "Tab" = "exec ${nag} --next"; - "Up" = "exec ${nag} --next"; - - "k" = "exec ${nag} --prev"; - "Shift+Tab" = "exec ${nag} prev"; - "Down" = "exec ${nag} prev"; - }; - }; - - keybindings = { - # Activate modes - "${modifier}+s" = "mode resize"; - - # Misc - "${modifier}+Return" = "exec ${terminal}"; - "${modifier}+c" = "kill"; - "${modifier}+p" = "exec ${menu}"; - "${modifier}+z" = "reload"; - "${modifier}+x" = "exec swaylock"; - - # Volume control - "XF86AudioRaiseVolume" = " exec 'pamixer --increase 5'"; - "XF86AudioLowerVolume" = " exec 'pamixer --decrease 5'"; - "XF86AudioMute" = " exec 'pamixer --toggle-mute'"; - - # Music player control - "XF86AudioPrev" = "exec 'playerctl previous'"; - "XF86AudioNext" = "exec 'playerctl next'"; - "XF86AudioPlay" = "exec 'playerctl play-pause'"; - "${modifier}+Down" = "exec 'playerctl pause'"; - "${modifier}+Up" = "exec 'playerctl play'"; - "${modifier}+Right" = "exec 'playerctl next'"; - "${modifier}+Left" = "exec 'playerctl previous'"; - - # Backlight keys - "XF86MonBrightnessDown" = "exec 'light -U 5'"; - "XF86MonBrightnessUp" = "exec 'light -A 5'"; - - # Navigation - - ## Focus - - ### Move your focus around - "${modifier}+${left}" = "focus left"; - "${modifier}+${down}" = "focus down"; - "${modifier}+${up}" = "focus up"; - "${modifier}+${right}" = "focus right"; - - ### Move the focused window with the same, but add Shift - "${modifier}+Shift+${left}" = "move left"; - "${modifier}+Shift+${down}" = "move down"; - "${modifier}+Shift+${up}" = "move up"; - "${modifier}+Shift+${right}" = "move right"; - - ## Workspaces - - ### Switch to a workspace - "${modifier}+q" = "workspace number 1"; - "${modifier}+w" = "workspace number 2"; - "${modifier}+e" = "workspace number 3"; - "${modifier}+r" = "workspace number 4"; - "${modifier}+t" = "workspace number 5"; - "${modifier}+y" = "workspace number 6"; - "${modifier}+u" = "workspace number 7"; - "${modifier}+i" = "workspace number 8"; - "${modifier}+o" = "workspace number 9"; - - ### Move focused container to workspace - "${modifier}+Shift+q" = "move container to workspace number 1"; - "${modifier}+Shift+w" = "move container to workspace number 2"; - "${modifier}+Shift+e" = "move container to workspace number 3"; - "${modifier}+Shift+r" = "move container to workspace number 4"; - "${modifier}+Shift+t" = "move container to workspace number 5"; - "${modifier}+Shift+y" = "move container to workspace number 6"; - "${modifier}+Shift+u" = "move container to workspace number 7"; - "${modifier}+Shift+i" = "move container to workspace number 8"; - "${modifier}+Shift+o" = "move container to workspace number 9"; - - # Layout - - ## Split direction - "${modifier}+v" = "splith"; - "${modifier}+g" = "splitv"; - - ## Switch the current container between different layout styles - "${modifier}+b" = "layout stacking"; - "${modifier}+n" = "layout tabbed"; - "${modifier}+m" = "layout toggle split"; - - ## Make the current focus fullscreen - "${modifier}+f" = "fullscreen"; - - ## move container between displays - "${modifier}+semicolon" = "move workspace to output up"; - - ## Toggle the current focus between tiling and floating mode - "${modifier}+Shift+f" = "floating toggle"; - - ## Swap focus between the tiling area and the floating area - "${modifier}+space" = "focus mode_toggle"; - - ## Move focus to the parent container - "${modifier}+a" = "focus parent"; - - # Notifications - - ## Toggle notification center - "${modifier}+Shift+n" = "exec '${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw'"; - - ## Toggle Do Not Disturb - "${modifier}+Shift+d" = "exec '${pkgs.swaynotificationcenter}/bin/swaync-client -d -sw'"; - - # Screenshots - - ## Current window - "${modifier}+period" = generate_grimshot_command "active"; - - ## Area selection - "${modifier}+Shift+period" = generate_grimshot_command "area"; - - ## Current output - "${modifier}+Alt+period" = generate_grimshot_command "output"; - - ## Window selection - "${modifier}+Ctrl+period" = generate_grimshot_command "window"; - - # Scratchpad - # Move the currently focused window to the scratchpad - "${modifier}+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. - "${modifier}+minus" = "scratchpad show"; - - # Exit sway (logs you out of your Wayland session) - "${modifier}+Shift+z" = "exec ${nag} -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' -b 'Reload' 'swaymsg reload'"; - }; - }; - }; - }; - }; -} diff --git a/modules/nixos/hardware/logitech/default.nix b/modules/nixos/hardware/logitech/default.nix index 4400c47..1468ec7 100644 --- a/modules/nixos/hardware/logitech/default.nix +++ b/modules/nixos/hardware/logitech/default.nix @@ -1,14 +1,16 @@ { - options, config, lib, pkgs, + namespace, ... -}: -with lib; let - cfg = config.aa.hardware.logitech; +}: let + inherit (lib) mkIf mkEnableOption; + + cfg = config.${namespace}.hardware.logitech; + username = config.${namespace}.user.name; in { - options.aa.hardware.logitech = with types; { + options.${namespace}.hardware.logitech = { enable = mkEnableOption "logitech devices"; }; @@ -27,6 +29,6 @@ in { ExecStart = "${pkgs.solaar}/bin/solaar -w hide"; }; }; - systemd.user.services.solaar.wantedBy = mkIf config.aa.desktop.sway.enable ["sway-session.target"]; + systemd.user.services.solaar.wantedBy = mkIf config.home-manager.users.${username}.wayland.windowManager.sway.enable ["sway-session.target"]; }; } diff --git a/modules/nixos/suites/desktop/default.nix b/modules/nixos/suites/desktop/default.nix index 9b57f63..07e554a 100644 --- a/modules/nixos/suites/desktop/default.nix +++ b/modules/nixos/suites/desktop/default.nix @@ -13,12 +13,6 @@ in { }; config = mkIf cfg.enable { - ${namespace} = { - desktop = { - sway.enable = true; - }; - }; - # Required to use gammastep home module without providing lat/long services.geoclue2.enable = true;