diff --git a/assets/bg1080.png b/assets/bg1080.png new file mode 100644 index 0000000..0f04f1e Binary files /dev/null and b/assets/bg1080.png differ diff --git a/assets/bg1080vert.png b/assets/bg1080vert.png new file mode 100644 index 0000000..cbdc1d9 Binary files /dev/null and b/assets/bg1080vert.png differ diff --git a/assets/bg4k.png b/assets/bg4k.png new file mode 100644 index 0000000..89f1b44 Binary files /dev/null and b/assets/bg4k.png differ diff --git a/hosts/MaxNixosLaptop/home.nix b/hosts/MaxNixosLaptop/home.nix index 52f187c..3c3f51f 100644 --- a/hosts/MaxNixosLaptop/home.nix +++ b/hosts/MaxNixosLaptop/home.nix @@ -7,14 +7,8 @@ ../../modules/home ]; - kanshi.enable = true; - kanshi.laptop = true; - - waybar.enable = true; - waybar.squeekboard = true; - waybar.mpd = true; - waybar.battery = true; - waybar.backlight = true; + sway.enable = true; + sway.laptop = true; # Home Manager needs a bit of information about you and the paths it should # manage. diff --git a/modules/home/sway/default.nix b/modules/home/sway/default.nix index cab1be3..080598a 100644 --- a/modules/home/sway/default.nix +++ b/modules/home/sway/default.nix @@ -4,6 +4,8 @@ lib, ... }: let + cfg = config.sway; + rotate_lisgd = pkgs.writeShellScriptBin "rotate_lisgd" '' # PREV_ORIENTATION and ORIENTATION are given by rot8 @@ -47,310 +49,213 @@ gsettings set $gnome_schema gtk-theme 'Dracula' ''; in { - imports = [./kanshi.nix ./waybar.nix]; + imports = [./kanshi.nix ./waybar.nix ./theme.nix]; - home.packages = with pkgs; [ - swaylock # screen locking - swayidle # automatic screen locking after system idle time - foot # terminal - keepassxc # used for secrets instead of gnome-keyring - ]; + options = { + sway.enable = lib.mkEnableOption "sway, a lightweight window manager"; + sway.laptop = lib.mkEnableOption "laptop config"; + }; - wayland.windowManager.sway = { - enable = true; - systemd = { + config = lib.mkIf cfg.enable { + sway.kanshi.enable = lib.mkDefault true; + sway.waybar.enable = lib.mkDefault true; + sway.theming.enable = lib.mkDefault true; + sway.waybar.battery = lib.mkDefault cfg.laptop; + sway.waybar.backlight = lib.mkDefault cfg.laptop; + sway.waybar.squeekboard = lib.mkDefault cfg.laptop; + + home.packages = with pkgs; [ + swaylock # screen locking + swayidle # automatic screen locking after system idle time + foot # terminal + keepassxc # used for secrets instead of gnome-keyring + ]; + + wayland.windowManager.sway = { enable = true; - xdgAutostart = false; - }; - - wrapperFeatures = { - gtk = true; - }; - - config = { - output = let - bgdir = "~/Documents/Blender/desktop background Informatiker"; - bg1080 = bgdir + "/render 1080p new color.png"; - bg1080vert = bgdir + "/render 1080p hochkant new.png"; - bg4k = bgdir + "/render 4K new color.png"; - in { - eDP-1 = { - bg = "'${bg1080}' fit"; - }; - HDMI-A-1 = { - bg = "'${bg4k}' fit"; - }; - DP-3 = { - bg = "'${bg1080}' fit"; - }; - DP-4 = { - bg = "'${bg1080}' fit"; - }; - DP-5 = { - bg = "'${bg1080vert}' fit"; - }; - DP-6 = { - bg = "'${bg1080}' fit"; - }; - DP-7 = { - bg = "'${bg1080vert}' fit"; - }; + systemd = { + enable = true; + xdgAutostart = false; }; - input = { - "*" = { - xkb_layout = "de"; - xkb_options = "caps:ctrl_modifier"; - xkb_numlock = "enable"; - }; - "type:touchpad" = { - tap = "enable"; - natural_scroll = "enable"; - }; - # map laptop touchscreen to laptop display - "1267:11676:ELAN2513:00_04F3:2D9C" = { - map_to_output = "'AU Optronics 0x4B2D Unknown'"; - }; - # map laptop stylus to laptop display - "1267:11676:ELAN2513:00_04F3:2D9C_Stylus" = { - map_to_output = "'AU Optronics 0x4B2D Unknown'"; - }; + wrapperFeatures = { + gtk = true; }; - modifier = "Mod4"; - keybindings = let - modifier = config.wayland.windowManager.sway.config.modifier; - in - lib.mkOptionDefault { - # special workspaces - "${modifier}+1" = "workspace main"; - "${modifier}+2" = "workspace term"; - "${modifier}+3" = "workspace msg"; - "${modifier}+4" = "workspace music"; - "${modifier}+Shift+1" = "move container to workspace main"; - "${modifier}+Shift+2" = "move container to workspace term"; - "${modifier}+Shift+3" = "move container to workspace msg"; - "${modifier}+Shift+4" = "move container to workspace music"; - - # screen capture - "${modifier}+Print" = ''exec ${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" - | ${pkgs.wl-clipboard}/bin/wl-copy''; - "${modifier}+Shift+Print" = ''exec ${pkgs.wf-recorder}/bin/wf-recorder -g "$(${pkgs.slurp}/bin/slurp)" -f "$HOME/Videos/screencapture_$(${pkgs.coreutils}/bin/date +%F-%T).mp4"''; - - # brightness - "XF86MonBrightnessDown" = "exec ${pkgs.light}/bin/light -U 5"; - "XF86MonBrightnessUp" = "exec ${pkgs.light}/bin/light -A 5"; - # volume - "XF86AudioRaiseVolume" = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +1%'"; - "XF86AudioLowerVolume" = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -1%'"; - "XF86AudioMute" = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle'"; - - # custom pause mode similar to typical system shutdown menus - "${modifier}+F12" = "mode pause-break"; + config = { + output = let + bgdir = ../../../assets; + bg1080 = bgdir + "/bg1080.png"; + bg1080vert = bgdir + "/bg1080vert.png"; + bg4k = bgdir + "/bg4k.png"; + in { + eDP-1 = { + bg = "'${bg1080}' fit"; + }; + HDMI-A-1 = { + bg = "'${bg4k}' fit"; + }; + DP-3 = { + bg = "'${bg1080}' fit"; + }; + DP-4 = { + bg = "'${bg1080}' fit"; + }; + DP-5 = { + bg = "'${bg1080vert}' fit"; + }; + DP-6 = { + bg = "'${bg1080}' fit"; + }; + DP-7 = { + bg = "'${bg1080vert}' fit"; + }; }; - menu = "${pkgs.nwg-launchers}/bin/nwggrid -client"; - # use foot as default terminal - terminal = "foot"; - assigns = { - "main" = [{app_id = "firefox";}]; - "term" = [{app_id = "foot-startup";}]; - "msg" = [{title = "\\[Locked\\] - KeePassXC$";}]; - }; - bars = []; + input = { + "*" = { + xkb_layout = "de"; + xkb_options = "caps:ctrl_modifier"; + xkb_numlock = "enable"; + }; + "type:touchpad" = { + tap = "enable"; + natural_scroll = "enable"; + }; + # map laptop touchscreen to laptop display + "1267:11676:ELAN2513:00_04F3:2D9C" = { + map_to_output = "'AU Optronics 0x4B2D Unknown'"; + }; + # map laptop stylus to laptop display + "1267:11676:ELAN2513:00_04F3:2D9C_Stylus" = { + map_to_output = "'AU Optronics 0x4B2D Unknown'"; + }; + }; - fonts = { - names = ["FiraCode Nerd Font"]; - size = 11.0; + modifier = "Mod4"; + keybindings = let + modifier = config.wayland.windowManager.sway.config.modifier; + in + lib.mkOptionDefault { + # special workspaces + "${modifier}+1" = "workspace main"; + "${modifier}+2" = "workspace term"; + "${modifier}+3" = "workspace msg"; + "${modifier}+4" = "workspace music"; + "${modifier}+Shift+1" = "move container to workspace main"; + "${modifier}+Shift+2" = "move container to workspace term"; + "${modifier}+Shift+3" = "move container to workspace msg"; + "${modifier}+Shift+4" = "move container to workspace music"; + + # screen capture + "${modifier}+Print" = ''exec ${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" - | ${pkgs.wl-clipboard}/bin/wl-copy''; + "${modifier}+Shift+Print" = ''exec ${pkgs.wf-recorder}/bin/wf-recorder -g "$(${pkgs.slurp}/bin/slurp)" -f "$HOME/Videos/screencapture_$(${pkgs.coreutils}/bin/date +%F-%T).mp4"''; + + # brightness + "XF86MonBrightnessDown" = "exec ${pkgs.light}/bin/light -U 5"; + "XF86MonBrightnessUp" = "exec ${pkgs.light}/bin/light -A 5"; + # volume + "XF86AudioRaiseVolume" = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +1%'"; + "XF86AudioLowerVolume" = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -1%'"; + "XF86AudioMute" = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle'"; + + # custom pause mode similar to typical system shutdown menus + "${modifier}+F12" = "mode pause-break"; + }; + menu = "${pkgs.nwg-launchers}/bin/nwggrid -client"; + + # use foot as default terminal + terminal = "foot"; + assigns = { + "main" = [{app_id = "firefox";}]; + "term" = [{app_id = "foot-startup";}]; + "msg" = [{title = "\\[Locked\\] - KeePassXC$";}]; + }; + bars = []; + + fonts = { + names = ["FiraCode Nerd Font"]; + size = 11.0; + }; + + modes = { + pause-break = { + e = "exec --no-startup-id swaymsg exit, mode default"; + s = "exec --no-startup-id ${pkgs.dash}/bin/dash -c '${pkgs.swaylock}/bin/swaylock & systemctl suspend-then-hibernate', mode default"; + r = "exec --no-startup-id systemctl reboot"; + End = "exec --no-startup-id systemctl poweroff"; + Return = "mode default"; + Escape = "mode default"; + }; + }; + + startup = [ + {command = "${dbus-sway-environment}/bin/dbus-sway-environment";} + {command = "${configure-gtk}/bin/configure-gtk";} + {command = "${pkgs.squeekboard}/bin/squeekboard";} + {command = "${pkgs.rot8}/bin/rot8 -n 10 -h ${rotate_lisgd}/bin/rotate_lisgd";} + {command = "${rotate_lisgd}/bin/rotate_lisgd";} + {command = "${pkgs.nwg-launchers}/bin/nwggrid-server -fp";} + {command = "${pkgs.keepassxc}/bin/keepassxc";} + {command = "${pkgs.foot}/bin/foot -a foot-startup";} + {command = "${pkgs.networkmanagerapplet}/bin/nm-applet";} + ]; + + defaultWorkspace = "main"; + workspaceAutoBackAndForth = true; + workspaceOutputAssign = [ + { + workspace = "main"; + output = ["DP-3" "DP-4" "DP-6" "HDMI-A-1" "eDP-1"]; + } + { + workspace = "term"; + output = ["DP-5" "DP-4" "DP-7" "eDP-1"]; + } + { + workspace = "msg"; + output = ["eDP-1"]; + } + { + workspace = "music"; + output = ["eDP-1"]; + } + { + workspace = "5"; + output = ["DP-3" "DP-4" "DP-6" "HDMI-A-1" "eDP-1"]; + } + ]; }; - modes = { - pause-break = { - e = "exec --no-startup-id swaymsg exit, mode default"; - s = "exec --no-startup-id ${pkgs.dash}/bin/dash -c '${pkgs.swaylock}/bin/swaylock & systemctl suspend-then-hibernate', mode default"; - r = "exec --no-startup-id systemctl reboot"; - End = "exec --no-startup-id systemctl poweroff"; - Return = "mode default"; - Escape = "mode default"; - }; - }; - - startup = [ - {command = "${dbus-sway-environment}/bin/dbus-sway-environment";} - {command = "${configure-gtk}/bin/configure-gtk";} - {command = "${pkgs.squeekboard}/bin/squeekboard";} - {command = "${pkgs.rot8}/bin/rot8 -n 10 -h ${rotate_lisgd}/bin/rotate_lisgd";} - {command = "${rotate_lisgd}/bin/rotate_lisgd";} - {command = "${pkgs.nwg-launchers}/bin/nwggrid-server -fp";} - {command = "${pkgs.keepassxc}/bin/keepassxc";} - {command = "${pkgs.foot}/bin/foot -a foot-startup";} - {command = "${pkgs.networkmanagerapplet}/bin/nm-applet";} - ]; - - defaultWorkspace = "main"; - workspaceAutoBackAndForth = true; - workspaceOutputAssign = [ - { - workspace = "main"; - output = ["DP-3" "DP-4" "DP-6" "HDMI-A-1" "eDP-1"]; - } - { - workspace = "term"; - output = ["DP-5" "DP-4" "DP-7" "eDP-1"]; - } - { - workspace = "msg"; - output = ["eDP-1"]; - } - { - workspace = "music"; - output = ["eDP-1"]; - } - { - workspace = "5"; - output = ["DP-3" "DP-4" "DP-6" "HDMI-A-1" "eDP-1"]; - } - ]; - - colors = { - background = "#00000000"; - focused = { - border = "#00FFEE"; - background = "#4477AA"; - text = "#F0F0F0"; - childBorder = "#00FFEE"; - indicator = "#00AA88"; - }; - focusedInactive = { - border = "#626262"; - background = "#444444"; - text = "#F0F0F0"; - childBorder = "#626262"; - indicator = "#00AA88"; - }; - placeholder = { - border = "#313131"; - background = "#222222"; - text = "#F0F0F0"; - childBorder = "#313131"; - indicator = "#005544"; - }; - unfocused = { - border = "#313131"; - background = "#222222"; - text = "#F0F0F0"; - childBorder = "#313131"; - indicator = "#00AA88"; - }; - urgent = { - border = "#FF3131"; - background = "#882222"; - text = "#F0F0F0"; - childBorder = "#FF3131"; - indicator = "#00AA88"; - }; - }; - - focus.mouseWarping = true; - - gaps = { - inner = 5; - smartGaps = true; - smartBorders = "no_gaps"; - }; - window.titlebar = false; + extraConfig = '' + bindswitch --reload --locked lid:on exec "[ $(${pkgs.sway}/bin/swaymsg -t get_outputs | ${pkgs.jq}/bin/jq '. | length') -gt 1 ] && ${pkgs.sway}/bin/swaymsg output eDP-1 disable" + bindswitch --reload --locked lid:off output eDP-1 enable + ''; }; - extraConfig = '' - bindswitch --reload --locked lid:on exec "[ $(${pkgs.sway}/bin/swaymsg -t get_outputs | ${pkgs.jq}/bin/jq '. | length') -gt 1 ] && ${pkgs.sway}/bin/swaymsg output eDP-1 disable" - bindswitch --reload --locked lid:off output eDP-1 enable - ''; - }; + services.mako = { + enable = true; + actions = true; + anchor = "top-right"; - # Theming - gtk = { - enable = true; - cursorTheme = { - package = pkgs.capitaine-cursors; - name = "capitaine-cursors-white"; - size = 24; + backgroundColor = "#313131"; + borderColor = "#00FFEE"; + progressColor = "#338833"; + textColor = "#e0e0e0"; + extraConfig = '' + [urgency=low] + border-color=#008877 + ''; + + borderRadius = 10; + borderSize = 2; + height = 100; + width = 400; + + defaultTimeout = 10000; # ms + font = "FiraCode Nerd Font 11"; + icons = true; + markup = true; }; - iconTheme = { - package = pkgs.whitesur-icon-theme; - name = "WhiteSur-dark"; - }; - theme = { - package = pkgs.whitesur-gtk-theme; - name = "WhiteSur-Dark"; - }; - gtk3.extraConfig = { - gtk-dialogs-use-header = false; - gtk-cursor-theme-size = 0; - gtk-toolbar-style = "GTK_TOOLBAR_BOTH_HORIZ"; - gtk-toolbar-icon-style = "GTK_ICON_SIZE_LARGE_TOOLBAR"; - gtk-button-images = 0; - gtk-menu-images = 0; - gtk-enable-event-sounds = 0; - gtk-enable-input-feedback-sounds = 1; - gtk-xft-antialias = 1; - gtk-xft-hinting = 1; - gtk-xft-hintstyle = "hintslight"; - gtk-xft-rgba = "none"; - }; - }; - home.pointerCursor = { - package = pkgs.capitaine-cursors; - name = "capitaine-cursors-white"; - size = 24; - x11.enable = true; - x11.defaultCursor = "capitaine-cursors-white"; - }; - xsession.enable = true; - - home.file."tofi" = { - enable = true; - target = ".config/tofi/config"; - text = '' - # fullscreen theming - width = 100% - height = 100% - border-width = 0 - outline-width = 0 - padding-top = 32 - result-spacing = 25 - font = FiraCode Nerd Font - background-color = #000D - text-color = #00FFEE - selection-color = #EEFF00 - hint-font = false - - # search behavior - history = true - fuzzy-match = true - ''; - }; - - services.mako = { - enable = true; - actions = true; - anchor = "top-right"; - - backgroundColor = "#313131"; - borderColor = "#00FFEE"; - progressColor = "#338833"; - textColor = "#e0e0e0"; - extraConfig = '' - [urgency=low] - border-color=#008877 - ''; - - borderRadius = 10; - borderSize = 2; - height = 100; - width = 400; - - defaultTimeout = 10000; # ms - font = "FiraCode Nerd Font 11"; - icons = true; - markup = true; }; } diff --git a/modules/home/sway/kanshi.nix b/modules/home/sway/kanshi.nix index d1dedaa..ed11e6d 100644 --- a/modules/home/sway/kanshi.nix +++ b/modules/home/sway/kanshi.nix @@ -4,11 +4,11 @@ pkgs, ... }: let - cfg = config.kanshi; + cfg = config.sway.kanshi; in { options = { - kanshi.enable = lib.mkEnableOption "kanshi, a dynamic display recognizer"; - kanshi.laptop = lib.mkEnableOption "laptop workspaces"; + sway.kanshi.enable = lib.mkEnableOption "kanshi, a dynamic display recognizer"; + sway.kanshi.laptop = lib.mkEnableOption "laptop workspaces"; }; config = lib.mkIf cfg.enable { diff --git a/modules/home/sway/theme.nix b/modules/home/sway/theme.nix new file mode 100644 index 0000000..13f6bf5 --- /dev/null +++ b/modules/home/sway/theme.nix @@ -0,0 +1,103 @@ +{ + lib, + config, + pkgs, + ... +}: let + cfg = config.sway.theming; +in { + options = { + sway.theming.enable = lib.mkEnableOption "theming for sway"; + }; + + config = lib.mkIf cfg.enable { + wayland.windowManager.sway.config = { + colors = { + background = "#00000000"; + focused = { + border = "#00FFEE"; + background = "#4477AA"; + text = "#F0F0F0"; + childBorder = "#00FFEE"; + indicator = "#00AA88"; + }; + focusedInactive = { + border = "#626262"; + background = "#444444"; + text = "#F0F0F0"; + childBorder = "#626262"; + indicator = "#00AA88"; + }; + placeholder = { + border = "#313131"; + background = "#222222"; + text = "#F0F0F0"; + childBorder = "#313131"; + indicator = "#005544"; + }; + unfocused = { + border = "#313131"; + background = "#222222"; + text = "#F0F0F0"; + childBorder = "#313131"; + indicator = "#00AA88"; + }; + urgent = { + border = "#FF3131"; + background = "#882222"; + text = "#F0F0F0"; + childBorder = "#FF3131"; + indicator = "#00AA88"; + }; + }; + + focus.mouseWarping = true; + + gaps = { + inner = 5; + smartGaps = true; + smartBorders = "no_gaps"; + }; + window.titlebar = false; + }; + + gtk = { + enable = true; + cursorTheme = { + package = pkgs.capitaine-cursors; + name = "capitaine-cursors-white"; + size = 24; + }; + iconTheme = { + package = pkgs.whitesur-icon-theme; + name = "WhiteSur-dark"; + }; + theme = { + package = pkgs.whitesur-gtk-theme; + name = "WhiteSur-Dark"; + }; + gtk3.extraConfig = { + gtk-dialogs-use-header = false; + gtk-cursor-theme-size = 0; + gtk-toolbar-style = "GTK_TOOLBAR_BOTH_HORIZ"; + gtk-toolbar-icon-style = "GTK_ICON_SIZE_LARGE_TOOLBAR"; + gtk-button-images = 0; + gtk-menu-images = 0; + gtk-enable-event-sounds = 0; + gtk-enable-input-feedback-sounds = 1; + gtk-xft-antialias = 1; + gtk-xft-hinting = 1; + gtk-xft-hintstyle = "hintslight"; + gtk-xft-rgba = "none"; + }; + }; + home.pointerCursor = { + package = pkgs.capitaine-cursors; + name = "capitaine-cursors-white"; + size = 24; + x11.enable = true; + x11.defaultCursor = "capitaine-cursors-white"; + }; + xsession.enable = true; + }; +} diff --git a/modules/home/sway/waybar.nix b/modules/home/sway/waybar.nix index 6f442ee..017b039 100644 --- a/modules/home/sway/waybar.nix +++ b/modules/home/sway/waybar.nix @@ -4,7 +4,7 @@ pkgs, ... }: let - cfg = config.waybar; + cfg = config.sway.waybar; schema = "org.gnome.desktop.a11y.applications"; key = "screen-keyboard-enabled"; @@ -26,11 +26,11 @@ ''; in { options = { - waybar.enable = lib.mkEnableOption "waybar, a status bar for wayland compositors"; - waybar.squeekboard = lib.mkEnableOption "squeekboard"; - waybar.mpd = lib.mkEnableOption "mpd"; - waybar.battery = lib.mkEnableOption "battery"; - waybar.backlight = lib.mkEnableOption "backlight"; + sway.waybar.enable = lib.mkEnableOption "waybar, a status bar for wayland compositors"; + sway.waybar.squeekboard = lib.mkEnableOption "squeekboard"; + sway.waybar.mpd = lib.mkEnableOption "mpd"; + sway.waybar.battery = lib.mkEnableOption "battery"; + sway.waybar.backlight = lib.mkEnableOption "backlight"; }; config = lib.mkIf cfg.enable {