{ pkgs, config, hostName, lib, ... }: let # execs uwsm = "${pkgs.uwsm}/bin/uwsm-app --"; swaymsg = "${pkgs.sway}/bin/swaymsg"; lock = "${pkgs.swaylock}/bin/swaylock --daemonize"; term = "${pkgs.kitty}/bin/kitty"; notify = "${pkgs.libnotify}/bin/notify-send"; nag = "${pkgs.sway}/bin/swaynag --edge bottom"; dmenu = "${pkgs.rofi-unwrapped}/bin/rofi"; # keybinds key_mod = "Mod4"; key_mod_misc = "Alt"; key_left = "Left"; key_right = "Right"; key_up = "Up"; key_down = "Down"; # other display = status: "${swaymsg} 'output * power ${status}'"; hostnameOutput = if hostName == "tower" then { # Left monitor DP-1 = { mode = "1920x1080@143.981Hz"; transform = "90"; position = "0 0"; }; # Main monitor DP-2 = { mode = "3440x1440@99.982Hz"; position = "1080 250"; }; # Right monitor DP-3 = { mode = "1920x1080@143.981Hz"; position = "4520 250"; }; } else if hostName == "electra" then {} else {}; hostnameWorkspaceAssign = if hostName == "tower" then [ { output = "DP-2"; workspace = "1"; } { output = "DP-2"; workspace = "2"; } { output = "DP-2"; workspace = "3"; } { output = "DP-3"; workspace = "4"; } { output = "DP-3"; workspace = "5"; } { output = "DP-3"; workspace = "6"; } { output = "DP-1"; workspace = "7"; } { output = "DP-1"; workspace = "8"; } { output = "DP-1"; workspace = "9"; } ] else if hostName == "electra" then [] else []; hostnameServices = if hostName == "tower" then {} else if hostName == "electra" then { swayidle = { enable = true; timeouts = [ { timeout = 120; command = "${notify} 'Locking in 5 seconds' -t 5000"; } { timeout = 125; command = lock; } { timeout = 125; command = display "off"; resumeCommand = display "on"; } { timeout = 600; command = "${pkgs.systemd}/bin/systemctl suspend"; } ]; # end timeouts events = [ { event = "before-sleep"; command = "display off; systemctl --user stop libinput-gestures; ${lock}"; } { event = "after-resume"; command = "display on; systemctl --user start libinput-gestures"; } { event = "lock"; command = (display "off") + "; " + lock; } { event = "unlock"; command = display "on"; } ]; # end events }; # end swayidle } else {}; hostnameInputs = if hostName == "tower" then "us,se" else "se,us"; in { wayland.windowManager.sway = { enable = true; wrapperFeatures.gtk = true; config = { modifier = "${key_mod}"; startup = [ { command = "systemctl --user start libinput-gestures"; } { command = ''${uwsm} swaybg -m fill -i /home/alisceon/Pictures/system/bg.png'';} ]; bars = [ ]; input = { "type:touchpad" = { dwt = "enabled"; tap = "enabled"; natural_scroll = "disabled"; middle_emulation = "enabled"; click_method = "clickfinger"; clickfinger_button_map = "lrm"; }; "type:mouse" = { natural_scroll = "disabled"; accel_profile = "flat"; pointer_accel = "0.5"; }; "*" = { xkb_layout = hostnameInputs; xkb_options = "grp:win_space_toggle"; }; }; # end input keybindings = { # Workspaces "${key_mod}+f" = "fullscreen"; "${key_mod}+Shift+f" = "floating toggle"; "${key_mod}+1" = "workspace number 1"; "${key_mod}+2" = "workspace number 2"; "${key_mod}+3" = "workspace number 3"; "${key_mod}+4" = "workspace number 4"; "${key_mod}+5" = "workspace number 5"; "${key_mod}+6" = "workspace number 6"; "${key_mod}+7" = "workspace number 7"; "${key_mod}+8" = "workspace number 8"; "${key_mod}+9" = "workspace number 9"; "${key_mod}+0" = "scratchpad show"; "${key_mod}+Shift+1" = "move container to workspace number 1; workspace 1"; "${key_mod}+Shift+2" = "move container to workspace number 2; workspace 2"; "${key_mod}+Shift+3" = "move container to workspace number 3; workspace 3"; "${key_mod}+Shift+4" = "move container to workspace number 4; workspace 4"; "${key_mod}+Shift+5" = "move container to workspace number 5; workspace 5"; "${key_mod}+Shift+6" = "move container to workspace number 6; workspace 6"; "${key_mod}+Shift+7" = "move container to workspace number 7; workspace 7"; "${key_mod}+Shift+8" = "move container to workspace number 8; workspace 8"; "${key_mod}+Shift+9" = "move container to workspace number 9; workspace 9"; "${key_mod}+Shift+0" = "move container to scratchpad; scratchpad show"; "${key_mod}+Ctrl+1" = "move container to workspace number 1"; "${key_mod}+Ctrl+2" = "move container to workspace number 2"; "${key_mod}+Ctrl+3" = "move container to workspace number 3"; "${key_mod}+Ctrl+4" = "move container to workspace number 4"; "${key_mod}+Ctrl+5" = "move container to workspace number 5"; "${key_mod}+Ctrl+6" = "move container to workspace number 6"; "${key_mod}+Ctrl+7" = "move container to workspace number 7"; "${key_mod}+Ctrl+8" = "move container to workspace number 8"; "${key_mod}+Ctrl+9" = "move container to workspace number 9"; "${key_mod}+Ctrl+0" = "move container to scratchpad"; # Focus "${key_mod}+${key_left}" = "focus left"; "${key_mod}+${key_right}" = "focus right"; "${key_mod}+${key_down}" = "focus down"; "${key_mod}+${key_up}" = "focus up"; # Move "${key_mod}+Shift+${key_left}" = "move left"; "${key_mod}+Shift+${key_down}" = "move down"; "${key_mod}+Shift+${key_up}" = "move up"; "${key_mod}+Shift+${key_right}" = "move right"; # Sparkly alt-tab "${key_mod}+Tab" = "focus right"; "${key_mod}+Shift+Tab" = "focus left"; "${key_mod}+Ctrl+Tab" = "move right"; "${key_mod}+Ctrl+Shift+Tab" = "move left"; "${key_mod}+${key_mod_misc}+Tab" = "workspace next"; "${key_mod}+${key_mod_misc}+Shift+Tab" = "workspace prev"; # System "Mod4+space" = ''exec ${notify} -t 2000 "$(xonsh ~/.nixos_config/util/get_xkb.xsh)"''; "${key_mod}+Shift+r" = "reload"; "${key_mod}+Ctrl+r" = "restart"; "${key_mod}+Shift+Backspace" = "exec ${nag} -m 'TuneD profiles:' -Z 'Performance' 'tuned-adm profile accelerator-performance' -Z 'Balanced' 'tuned-adm profile balanced' -Z 'Power Save' 'tuned-adm profile powersave'"; "${key_mod}+Shift+q" = "kill"; "Alt+F4" = "kill"; # Locking and idle "${key_mod}+L" = "exec ${lock}"; "${key_mod}+Escape" = "exec ${nag} -m 'Shutdown options:' -Z 'Power Off' 'systemctl poweroff' -Z 'Reboot' 'systemctl reboot' -Z 'Logout' 'swaymsg exit'"; # Apps "${key_mod}+Return" = ''exec "${uwsm} ${term}"''; "${key_mod}+d" = ''exec "${uwsm} ${dmenu} -show drun"''; # Screenshot region "${key_mod}+Shift+s" = "exec grimshot savecopy area"; "${key_mod}+Ctrl+s" = "exec grimshot savecopy output"; # media keys "XF86AudioRaiseVolume" = "exec 'pactl set-sink-volume @DEFAULT_SINK@ +3%'"; "XF86AudioLowerVolume" = "exec 'pactl set-sink-volume @DEFAULT_SINK@ -3%'"; "XF86AudioMute" = "exec 'pactl set-sink-mute @DEFAULT_SINK@ toggle'"; "XF86AudioPlay" = "exec 'playerctl play-pause'"; "XF86MonBrightnessUp" = "exec ${pkgs.light}/bin/light -A 9"; "XF86MonBrightnessDown" = "exec ${pkgs.light}/bin/light -U 3"; }; # end keybindings window = { titlebar = false; commands = [ { criteria = { all = true; }; command = "inhibit_idle fullscreen"; } ]; }; # end window assigns = { "1" = [{app_id = "chromium";}]; "2" = [{class = "steam";}]; "3" = []; "4" = [{class = "Code";}]; "5" = [{app_id = "obsidian";}]; "6" = []; "7" = []; "8" = [{app_id = "discord";}]; "9" = [{app_id = "signal";}]; }; output = {} // hostnameOutput; workspaceOutputAssign = hostnameWorkspaceAssign; }; }; services = { mako = { enable = true; settings = { actions = true; anchor = "top-center"; border-radius = 0; default-timeout = 10000; height = 100; width = 600; icons = true; ignore-timeout = false; layer = "overlay"; margin = 10; markup = true; }; #end settings }; # end mako gnome-keyring = { enable = true; components = [ "ssh" "pkcs11" "secrets" ]; }; } // hostnameServices; # end services programs = { rofi = { enable = true; package = pkgs.rofi-unwrapped; terminal = term; }; # end rofi waybar = { enable = true; systemd = { enable = true; target = "graphical-session.target"; }; settings = { mainBar = { layer = "bottom"; position = "top"; height = 28; spacing = 0; modules-left = [ "sway/workspaces" ]; modules-center = [ "sway/window" ]; modules-right = [ "tray" "idle_inhibitor" "network" "pulseaudio" "battery" "sway/language" "clock" ]; "sway/workspaces" = { on-click = "activate"; sort-by-number = true; format = "{value}"; }; "sway/window" = { max-length = 64; }; "tray" = { icon-size = 24; spacing = 8; }; "idle_inhibitor" = { format = "| {icon}"; start-activated = true; format-icons = { activated = "đŸĢ¨"; deactivated = "😴"; }; }; "sway/language" = { format = "| {flag}"; }; "clock" = { interval = 60; tooltip = true; format = "| {:%Y-%m-%d %R}"; tooltip-format = "{:%A}"; }; "battery" = { interval = 60; format = "| {icon}{capacity}%"; format-charging = "| {icon}⚡{capacity}%"; format-plugged = "| {icon}🔌{capacity}%"; states = { critical = 10; warning = 20; good = 100; full = 100; over = 101; }; format-icons = [ "đŸĒĢ" "đŸĒĢ" "🔋" "🔋" "🔋"]; }; "network" = { tooltip-format = "{ifname} = {ipaddr}/{cidr}"; format-wifi = "| ᯤ"; format-ethernet = "| ⇄"; format-linked = "| 🔗"; format-disconnected = "| â›“ī¸â€đŸ’Ĩ"; format-alt = "| {essid}: {ipaddr}"; interval = 15; }; "pulseaudio" = { format = "| 🔊{volume}%"; format-muted = "| 🔈0%"; format-bluetooth = "| 🎧{volume}%"; }; }; # end mainbar }; # end settings style = '' button { box-shadow: inset 0 -8px transparent; border: none; border-radius: 0; } ''; # end style }; # end waybar swaylock = { enable = true; settings = { ignore-empty-password = true; indicator-caps-lock = true; }; # end settings }; # end swaylock kitty = { enable = true; settings = { confirm_os_window_close = 0; enable_audio_bell = false; window_padding_width = 2; }; }; # end kitty }; # end programs gtk = { enable = true; gtk2.enable = true; gtk3.enable = true; gtk4.enable = true; }; xdg = { configFile."libinput-gestures.conf".text = '' gesture pinch in 3 sh -c "echo key ctrl+w | ${pkgs.dotool}/bin/dotool" gesture swipe left 3 ${swaymsg} workspace prev gesture swipe right 3 ${swaymsg} workspace next gesture swipe down 3 ${swaymsg} move container to scratchpad gesture swipe up 3 ${swaymsg} fullscreen gesture swipe down 4 ${lock} gesture pinch out 3 ${swaymsg} floating toggle gesture pinch in 4 ${swaymsg} kill ''; configFile."electron-flags.conf".text = '' --enable-features=WaylandWindowDecorations,AllowQt --ozone-platform=wayland --gtk-version=4 ''; mimeApps = { enable = true; defaultApplicationPackages = [ pkgs.gnome-text-editor pkgs.evince pkgs.vlc pkgs.loupe pkgs.nautilus pkgs.chromium ]; defaultApplications = { # mostly redundant but the additional granularity is good for reducing friction # Text "text/*" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ]; "application/xml" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ]; "application/json" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ]; "application/pdf" = [ "${pkgs.evince}/share/applications/org.gnome.Evince.desktop" ]; # Media "video/*" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ]; "audio/*" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ]; # Browser "text/html" = [ "${pkgs.chromium}/share/applications/chromium.desktop" ]; "application/xhtml+xml" = [ "${pkgs.chromium}/share/applications/chromium.desktop" ]; "application/x-web-app-manifest+json" = [ "${pkgs.chromium}/share/applications/chromium.desktop" ]; "application/xml-dtd" = [ "${pkgs.chromium}/share/applications/chromium.desktop" ]; # Images "image/*" = [ "${pkgs.loupe}/share/applications/org.gnome.Loupe.desktop.desktop" ]; }; }; }; systemd.user.sessionVariables = { # this right here offends me https://source.chromium.org/chromium/chromium/src/+/main:base/nix/xdg_util.cc;l=179-180 # setting GNOME_DESKTOP_SESSION_ID will fool some legacy systems into thinking we're running gnome # this is an issue for xdg-open which can be circumvented by adding glib to the system which lets xdg-open fallback to gio-open GNOME_DESKTOP_SESSION_ID = "999"; SHELL_THICCNESS = "LOW"; # instructs xonsh to default to a slim environment }; } # end file