{ pkgs, config, hostName, lib, ... }: let # execs swaymsg = "${pkgs.sway}/bin/swaymsg"; lock = "${pkgs.swaylock}/bin/swaylock --daemonize"; term = "${pkgs.kitty}/bin/kitty"; dmenu = "${pkgs.rofi}/bin/rofi -show drun"; notify = "${pkgs.libnotify}/bin/notify-send"; # keybinds key_mod = "Alt"; key_left = "Left"; key_right = "Right"; key_up = "Up"; key_down = "Down"; # style style_font = "Inconsolata"; style_font_sz = "12"; style_font_bold = "${style_font}-Bold"; color_blue_1 = "#99c1f1"; color_blue_2 = "#62a0ea"; color_blue_3 = "#3584e4"; color_blue_4 = "#1c71d8"; color_blue_5 = "#1a5fb4"; color_green_1 = "#8ff0a4"; color_green_2 = "#57e389"; color_green_3 = "#33d17a"; color_green_4 = "#2ec27e"; color_green_5 = "#26a269"; color_yellow_1 = "#f9f06b"; color_yellow_2 = "#f8e45c"; color_yellow_3 = "#f6d32d"; color_yellow_4 = "#f5c211"; color_yellow_5 = "#e5a50a"; color_orange_1 = "#ffbe6f"; color_orange_2 = "#ffa348"; color_orange_3 = "#ff7800"; color_orange_4 = "#e66100"; color_orange_5 = "#c64600"; color_red_1 = "#f66151"; color_red_2 = "#ed333b"; color_red_3 = "#e01b24"; color_red_4 = "#c01c28"; color_red_5 = "#a51d2d"; color_purple_1 = "#dc8add"; color_purple_2 = "#c061cb"; color_purple_3 = "#9141ac"; color_purple_4 = "#813d9c"; color_purple_5 = "#613583"; color_brown_1 = "#cdab8f"; color_brown_2 = "#b5835a"; color_brown_3 = "#986a44"; color_brown_4 = "#865e3c"; color_brown_5 = "#63452c"; color_light_1 = "#ffffff"; color_light_2 = "#f6f5f4"; color_light_3 = "#d8d8d8"; color_light_4 = "#c0c0c0"; color_light_5 = "#9b9b9b"; color_dark_1 = "#757575"; color_dark_2 = "#666666"; color_dark_3 = "#494949"; color_dark_4 = "#333333"; color_dark_5 = "#000000"; color_f_bg = color_dark_3; color_f_text = color_light_1; color_uf_bg = color_dark_4; color_uf_text = color_light_4; color_alert_bg = color_red_5; color_alert_text = color_light_1; color_inv_bg = color_light_4; color_inv_text = color_dark_5; # 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 {}; in { wayland.windowManager.sway = { enable = true; wrapperFeatures.gtk = true; # Fixes common issues with GTK 3 apps config = { modifier = "${key_mod}"; startup = [ { command = "systemctl --user start libinput-gestures"; } ]; bars = [ { command = "${pkgs.waybar}/bin/waybar"; } ]; fonts = { names = ["${style_font}"]; size = style_font_sz; }; 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"; }; "*" = { xkb_layout = "us,se"; xkb_options = "grp:win_space_toggle"; }; }; # end input keybindings = { # Basic "${key_mod}+Return" = "exec ${term}"; "${key_mod}+d" = "exec ${dmenu}"; "${key_mod}+Shift+q" = "kill"; "${key_mod}+F4" = "kill"; "${key_mod}+L" = "exec ${lock}"; # 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}+Mod4+Tab" = "workspace next"; "${key_mod}+Mod4+Shift+Tab" = "workspace prev"; # System "Mod4+space" = ''exec ${notify} -t 2000 "$(xonsh ~/.nixos_config/util/get_xkb.xsh)"''; #Screenshot region "${key_mod}+Shift+s" = "exec grimshot savecopy area"; "Print" = "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 10"; "XF86MonBrightnessDown" = "exec ${pkgs.light}/bin/light -U 10"; # Function layer 4 esc-pgdn "KP_End" = "exec"; "KP_Down" = "exec"; "KP_Next" = "exec"; "KP_Left" = "exec"; "KP_Begin" = "exec"; "KP_Right" = "exec"; "KP_Home" = "exec"; "KP_Up" = "exec"; "KP_Prior" = "exec"; "KP_Insert" = "exec"; "KP_Divide" = "exec"; "KP_Multiply" = "exec"; "KP_Subtract" = "exec"; "KP_Add" = "exec"; }; # end keybindings window = { titlebar = false; }; colors = { background = color_dark_5; focused = { border = color_f_bg; background = color_f_bg; text = color_light_1; indicator = color_f_bg; childBorder = color_f_bg; }; focusedInactive = { border = color_f_bg; background = color_f_bg; text = color_light_1; indicator = color_f_bg; childBorder = color_f_bg; }; unfocused = { border = color_uf_bg; background = color_uf_bg; text = color_uf_text; indicator = color_uf_bg; childBorder = color_uf_bg; }; urgent = { border = color_alert_bg; background = color_alert_bg; text = color_alert_text; indicator = color_alert_bg; childBorder = color_alert_bg; }; placeholder = { border = color_dark_3; background = color_dark_3; text = color_light_4; indicator = color_dark_3; childBorder = color_dark_3; }; }; # end colors assigns = { "1" = [{app_id = "firefox";}]; "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"; background-color = color_f_bg; border-color = color_f_bg; border-radius = 0; default-timeout = 10000; font = "${style_font} ${style_font_sz}"; 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; font = "${style_font} ${style_font_sz}"; theme = let inherit (config.lib.formats.rasi) mkLiteral; in { "*" = { bg = mkLiteral color_uf_bg; fg = mkLiteral color_f_text; ac = mkLiteral color_f_bg; background-color = mkLiteral "transparent"; }; "#window" = { background-color = mkLiteral "@bg"; location = mkLiteral "center"; width = mkLiteral "30%"; }; "#prompt" = { text-color = mkLiteral "@fg"; }; "#textbox-prompt-colon" = { text-color = mkLiteral "@fg"; }; "#entry" = { text-color = mkLiteral "@fg"; blink = mkLiteral "true"; }; "#inputbar" = { children = mkLiteral "[ prompt, entry ]"; text-color = mkLiteral "@fg"; padding = mkLiteral "5px"; }; "#listview" = { columns = mkLiteral "1"; lines = mkLiteral "6"; cycle = mkLiteral "true"; dynamic = mkLiteral "true"; }; "#mainbox" = { border = mkLiteral "3px"; border-color = mkLiteral "@ac"; children = mkLiteral "[ inputbar, listview ]"; padding = mkLiteral "10px"; }; "#element" = { text-color = mkLiteral "@fg"; padding = mkLiteral "5px"; }; "#element-icon" = { text-color = mkLiteral "@fg"; size = mkLiteral "32px"; }; "#element-text" = { text-color = mkLiteral "@fg"; padding = mkLiteral "5px"; }; "#element selected" = { border = mkLiteral "3px"; border-color = mkLiteral "@ac"; text-color = mkLiteral "@fg"; background-color = mkLiteral "@ac"; }; }; # end theme }; # end rofi waybar = { enable = true; settings = { mainBar = { layer = "bottom"; position = "top"; height = 32; spacing = 0; modules-left = [ "sway/workspaces" ]; modules-center = [ "sway/window" ]; modules-right = [ "tray" "network" "pulseaudio" "battery" "clock" ]; "sway/workspaces" = { on-click = "activate"; sort-by-number = true; format = "{value}"; }; "sway/window" = { max-length = 64; }; "tray" = { icon-size = 13; spacing = 8; }; "clock" = { interval = 60; tooltip = true; format = "| {:%Y-%m-%d %R} "; tooltip-format = "{:%A}"; }; "battery" = { states = { critical = 10; warning = 20; good = 90; full = 100; over = 101; }; interval = 30; format = "| Bat {capacity}% "; format-charging = "| Chr {capacity}% "; format-plugged = "| Plg {capacity}% "; }; "network" = { format-wifi = "| WiFi up "; format-ethernet = ""; tooltip-format = "{ifname} = {ipaddr}/{cidr}"; format-linked = "| {ifname} (no ip) "; format-disconnected = "| Disconnected "; format-alt = "| {essid}: {ipaddr} "; interval = 10; }; "pulseaudio" = { # "scroll-step" = 1; # %; can be a float format = "| Sound: {volume}% "; format-muted = "| Sound: x% "; }; }; # end mainbar }; # end settings style = '' * { font-family: ${style_font_bold}; font-size: ${style_font_sz}pt; } window#waybar { color: ${color_f_text}; background-color: ${color_uf_bg}; transition-property: background-color; transition-duration: .5s; } window#waybar.hidden { opacity: 0.2; } /* window#waybar.empty { background-color: transparent; } window#waybar.solo { background-color: ${color_purple_1}; } */ button { box-shadow: inset 0 -8px transparent; border: none; border-radius: 0; } button:hover { color: ${color_f_text}; background: ${color_f_bg}; } #workspaces button { color: ${color_uf_text}; background-color: ${color_uf_bg}; } #workspaces button:hover { color: ${color_f_text}; background: ${color_f_bg}; } #workspaces button.focused { color: ${color_inv_text}; background-color: ${color_inv_bg}; } #workspaces button.urgent { color: ${color_alert_text}; background-color: ${color_alert_bg}; } #battery, #clock, #network, #pulseaudio, #tray, #window, #workspaces { margin: 0 2px; } .modules-left > widget:first-child > #workspaces { margin-left: 0; } .modules-right > widget:last-child > #workspaces { margin-right: 0; } #battery { color: ${color_f_text}; background-color: transparent; } #battery.critical.discharging { animation: blink 1s infinite; color: ${color_red_2}; } #battery.warning.discharging { animation: blink 1s infinite; color: ${color_orange_2}; } #battery.good { animation: none; color: ${color_f_text}; } #battery.full.charging { color: ${color_green_2}; } #battery.over.charging { color: ${color_green_2}; } #clock { color: ${color_f_text}; background-color: transparent; } label:focus { color: ${color_f_text}; background-color: transparent; } #network { color: ${color_f_text}; background-color: transparent; } #network.disconnected { color: ${color_f_text}; background-color: transparent; } #pulseaudio { color: ${color_f_text}; background-color: transparent; } #pulseaudio.muted { color: ${color_f_text}; background-color: transparent; } #tray { background-color: transparent; border-bottom: 3px solid ${color_f_text}; } #tray > .passive { -gtk-icon-effect: dim; } #tray > .needs-attention { -gtk-icon-effect: highlight; background-color: transparent; } ''; # end style }; # end waybar swaylock = { enable = true; settings = { color = color_uf_bg; font = style_font; font-size = style_font_sz; ignore-empty-password = true; indicator-caps-lock = true; indicator-radius = 50; indicator-thickness = 10; }; # end settings }; # end swaylock kitty = { enable = true; font = { name = style_font; size = lib.toInt style_font_sz; }; settings = { confirm_os_window_close = 0; enable_audio_bell = false; window_padding_width = 2; foreground = color_f_text; background = color_uf_bg; }; }; # end kitty }; # end programs dconf = { enable = true; settings = { "org/gnome/desktop/interface" = { color-scheme = "prefer-dark"; gtk-theme = "Adwaita-Dark"; }; }; }; xdg.configFile."libinput-gestures.conf".text = '' 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 pinch in 3 ${swaymsg} floating enable gesture pinch out 3 ${swaymsg} floating disable gesture pinch in 4 ${swaymsg} kill gesture swipe up 4 ${lock} ''; xdg.configFile."electron-flags.conf".text = '' --enable-features=WaylandWindowDecorations,AllowQt --ozone-platform=wayland --gtk-version=4 ''; xdg.configFile."chromium-flags.conf".text = '' --enable-features=WaylandWindowDecorations,AllowQt --ozone-platform=wayland --gtk-version=4 ''; # this right here offends me https://source.chromium.org/chromium/chromium/src/+/main:base/nix/xdg_util.cc;l=179-180 systemd.user.sessionVariables = { GNOME_DESKTOP_SESSION_ID = "999"; }; } # end file