diff --git a/hosts/chris-pc/hardware.nix b/hosts/chris-pc/hardware.nix index cb6117a..b59c579 100644 --- a/hosts/chris-pc/hardware.nix +++ b/hosts/chris-pc/hardware.nix @@ -37,10 +37,4 @@ in power-profiles-deamon-enable = false; thermald.enable = false; }; - - modules.hardware = { - pipewire.enable = true; - bluetooth.enable = false; - pointer.enable = true; - }; } diff --git a/hosts/chris-server/hardware.nix b/hosts/chris-server/hardware.nix index 67ec70a..9362264 100644 --- a/hosts/chris-server/hardware.nix +++ b/hosts/chris-server/hardware.nix @@ -35,10 +35,4 @@ in power-profiles-deamon-enable = false; thermald.enable = false; }; - - modules.hardware = { - pipewire.enable = true; - bluetooth.enable = false; - pointer.enable = true; - }; } diff --git a/modules/shell/zsh.nix b/modules/shell/zsh.nix index e747ca4..fa86e8c 100644 --- a/modules/shell/zsh.nix +++ b/modules/shell/zsh.nix @@ -11,7 +11,6 @@ in modules.shell = { corePkgs.enable = true; toolset = { - macchina.enable = true; starship.enable = true; }; }; diff --git a/modules/themes/default.nix b/modules/themes/default.nix new file mode 100644 index 0000000..534a5f3 --- /dev/null +++ b/modules/themes/default.nix @@ -0,0 +1,375 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (builtins) getEnv map; + inherit (lib.attrsets) attrValues mapAttrsToList; + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.strings) concatStringsSep optionalString; + + cfg = config.modules.themes; + desktop = config.modules.desktop; +in { + options.modules.themes = let + inherit (lib.options) mkOption mkPackageOption; + inherit (lib.types) attrsOf int lines listOf nullOr path package str; + inherit (lib.my) mkOpt toFilteredImage; + in { + active = mkOption { + type = nullOr str; + default = null; + apply = v: let + theme = getEnv "THEME"; + in + if theme != "" + then theme + else v; + description = '' + Name of the theme which ought to be applied. + Can be overridden by the `THEME` environment variable. + ''; + }; + + wallpaper = mkOpt (nullOr path) null; + + loginWallpaper = mkOpt (nullOr path) ( + if cfg.wallpaper != null + then toFilteredImage cfg.wallpaper "-gaussian-blur 0x2 -modulate 70 -level 5%" + else null + ); + + gtk = { + name = mkOpt str ""; + package = mkPackageOption pkgs "gtk" {}; + }; + + iconTheme = { + name = mkOpt str ""; + package = mkPackageOption pkgs "icon" {}; + }; + + pointer = { + name = mkOpt str ""; + package = mkPackageOption pkgs "pointer" {}; + size = mkOpt int ""; + }; + + onReload = mkOpt (attrsOf lines) {}; + + fontConfig = { + packages = mkOpt (listOf package) []; + mono = mkOpt (listOf str) [""]; + sans = mkOpt (listOf str) [""]; + emoji = mkOpt (listOf str) [""]; + }; + + font = { + mono = { + family = mkOpt str ""; + weight = mkOpt str "Bold"; + weightAlt = mkOpt str "Bold"; + weightNum = mkOpt int 700; + size = mkOpt int 13; + }; + sans = { + family = mkOpt str ""; + weight = mkOpt str "SemiBold"; + weightAlt = mkOpt str "DemiBold"; + weightNum = mkOpt int 600; + size = mkOpt int 10; + }; + }; + + colors = { + main = { + normal = { + black = mkOpt str "#000000"; # 0 + red = mkOpt str "#FF0000"; # 1 + green = mkOpt str "#00FF00"; # 2 + yellow = mkOpt str "#FFFF00"; # 3 + blue = mkOpt str "#0000FF"; # 4 + magenta = mkOpt str "#FF00FF"; # 5 + cyan = mkOpt str "#00FFFF"; # 6 + white = mkOpt str "#BBBBBB"; # 7 + }; + bright = { + black = mkOpt str "#888888"; # 8 + red = mkOpt str "#FF8800"; # 9 + green = mkOpt str "#00FF80"; # 10 + yellow = mkOpt str "#FF8800"; # 11 + blue = mkOpt str "#0088FF"; # 12 + magenta = mkOpt str "#FF88FF"; # 13 + cyan = mkOpt str "#88FFFF"; # 14 + white = mkOpt str "#FFFFFF"; # 15 + }; + types = let + inherit (cfg.colors.main.normal) black red white yellow; + inherit (cfg.colors.main.types) bg fg; + in { + bg = mkOpt str black; + fg = mkOpt str white; + panelbg = mkOpt str bg; + panelfg = mkOpt str fg; + border = mkOpt str bg; + error = mkOpt str red; + warning = mkOpt str yellow; + highlight = mkOpt str white; + }; + }; + + rofi = { + bg = { + main = mkOpt str "#FFFFFF"; + alt = mkOpt str "#FFFFFF"; + bar = mkOpt str "#FFFFFF"; + }; + fg = mkOpt str "#FFFFFF"; + ribbon = { + outer = mkOpt str "#FFFFFF"; + inner = mkOpt str "#FFFFFF"; + }; + selected = mkOpt str "#FFFFFF"; + urgent = mkOpt str "#FFFFFF"; + transparent = mkOpt str "#FFFFFF"; + }; + }; + + editor = { + neovim = { + light = mkOpt str ""; + dark = mkOpt str ""; + }; + }; + }; + + config = mkIf (cfg.active != null) (mkMerge [ + { + # Allow HM to control GTK Theme: + programs.dconf.enable = true; + + hm.gtk = let + inherit (cfg.font) sans; + inherit (cfg) gtk iconTheme; + in { + enable = true; + font = { + name = sans.family; + size = sans.size; + }; + theme = { + name = gtk.name; + package = gtk.package; + }; + iconTheme = { + name = iconTheme.name; + package = iconTheme.package; + }; + gtk3.bookmarks = map (dir: "file://${config.user.home}/" + dir) [ + "Workspace/public/snowflake" + "Workspace/public/cs-notes" + "Workspace/public/notebook" + "Library/unexplored" + "Library/unexplored/mathematics" + "Library/unexplored/programming" + ]; + gtk4.extraConfig = { + gtk-cursor-blink = false; + gtk-recent-files-limit = 20; + }; + }; + + home.pointerCursor = let + inherit (cfg.pointer) name package size; + in { + name = name; + package = package; + size = size; + gtk.enable = true; + }; + + fonts = let + inherit (cfg.fontConfig) packages emoji mono sans; + in { + packages = packages; + fontconfig.defaultFonts = { + monospace = mono; + sansSerif = sans; + emoji = emoji; + }; + }; + + hm.programs.vscode.extensions = let + inherit (cfg.vscode.extension) name publisher version hash; + in + pkgs.vscode-utils.extensionsFromVscodeMarketplace [ + { + name = "${name}"; + publisher = "${publisher}"; + version = "${version}"; + hash = "${hash}"; + } + ]; + } + + (mkIf (desktop.type == "wayland") (mkMerge [ + { + programs.regreet.settings.GTK = let + inherit (cfg) pointer font iconTheme gtk; + in { + cursor_theme_name = "${pointer.name}"; + font_name = "${font.mono.family}"; + icon_theme_name = "${iconTheme.name}"; + theme_name = "${gtk.name}"; + }; + } + + (mkIf (cfg.wallpaper != null) { + user.packages = attrValues {inherit (pkgs) swww;}; + + hm.systemd.user.services = { + swww = { + Unit = { + Description = "Wallpaper daemon for wayland"; + After = ["graphical-session.target"]; + PartOf = ["graphical-session.target"]; + }; + Install.WantedBy = ["graphical-session.target"]; + Service = { + Type = "simple"; + ExecStart = "${pkgs.swww}/bin/swww-daemon"; + ExecStop = "${getExe pkgs.swww} kill"; + Restart = "on-failure"; + }; + }; + swww-wallpaper = { + Unit = { + Description = "Default swww wallpaper"; + After = ["swww.service"]; + PartOf = ["swww.service"]; + }; + Service = { + Type = "oneshot"; + ExecStart = '' + if [ -e "$XDG_DATA_HOME/wallpaper" ]; then + ${getExe pkgs.swww} \ + img $XDG_DATA_HOME/wallpaper \ + --transition-type random \ + --transition-fps 60 + fi + ''; + Restart = "on-failure"; + }; + Install.WantedBy = ["swww.service"]; + }; + }; + + create.dataFile = + mkIf (cfg.wallpaper != null) {"wallpaper".source = cfg.wallpaper;}; + }) + ])) + + (mkIf (desktop.type == "x11") (mkMerge [ + { + hm.xresources = { + path = "${config.user.home}/.Xresources"; + properties = let + inherit (cfg.colors.main) bright normal types; + in { + "*.foreground" = "${types.fg}"; + "*.background" = "${types.bg}"; + + "*.color0" = "${normal.black}"; + "*.color8" = "${bright.black}"; + + "*.color1" = "${normal.red}"; + "*.color9" = "${bright.red}"; + + "*.color2" = "${normal.green}"; + "*.color10" = "${bright.green}"; + + "*.color3" = "${normal.yellow}"; + "*.color11" = "${bright.yellow}"; + + "*.color4" = "${normal.blue}"; + "*.color12" = "${bright.blue}"; + + "*.color5" = "${normal.magenta}"; + "*.color13" = "${bright.magenta}"; + + "*.color6" = "${normal.cyan}"; + "*.color14" = "${bright.cyan}"; + + "*.color7" = "${normal.white}"; + "*.color15" = "${bright.white}"; + }; + }; + + home.pointerCursor.x11 = { + enable = true; + defaultCursor = "left_ptr"; + }; + } + + # Apply theme options -> lightdm-mini-greeter + (mkIf (cfg.loginWallpaper != null) { + services.xserver.displayManager.lightdm = { + greeters.mini.extraConfig = let + inherit (cfg.colors.main) normal types; + in '' + background-image = "${cfg.loginWallpaper}" + background-image-size = "100% 100%" + + text-color = "${types.bg}" + password-background-color = "${normal.black}" + window-color = "${types.border}" + border-color = "${types.border}" + ''; + }; + }) + + # Auto-set wallpaper to prevent $HOME pollution! + (mkIf (cfg.wallpaper != null) (let + wCfg = config.services.xserver.desktopManager.wallpaper; + command = '' + if [ -e "$XDG_DATA_HOME/wallpaper" ]; then + ${getExe pkgs.feh} --bg-${wCfg.mode} \ + ${optionalString wCfg.combineScreens "--no-xinerama"} \ + --no-fehbg \ + $XDG_DATA_HOME/wallpaper + fi + ''; + in { + modules.themes.onReload.wallpaper = command; + services.xserver.displayManager.sessionCommands = command; + + create.dataFile = + mkIf (cfg.wallpaper != null) {"wallpaper".source = cfg.wallpaper;}; + })) + + (mkIf (cfg.loginWallpaper != null) { + programs.regreet.settings.background = { + path = cfg.loginWallpaper; + fit = "Fill"; + }; + }) + + (mkIf (cfg.onReload != {}) (let + reloadTheme = let + inherit (pkgs) stdenv writeScriptBin; + in (writeScriptBin "reloadTheme" '' + #!${stdenv.shell} + echo "Reloading current theme: ${cfg.active}" + ${concatStringsSep "\n" (mapAttrsToList (name: script: '' + echo "[${name}]" + ${script} + '') + cfg.onReload)} + ''); + in { + user.packages = [reloadTheme]; + system.userActivationScripts.reloadTheme = '' + [ -z "$NORELOAD" ] && ${reloadTheme}/bin/reloadTheme + ''; + })) + ])) + ]); +} diff --git a/modules/_programs/wallpaper.jpg b/modules/themes/everforrest/assets/wallpaper.jpg similarity index 100% rename from modules/_programs/wallpaper.jpg rename to modules/themes/everforrest/assets/wallpaper.jpg diff --git a/modules/themes/everforrest/default.nix b/modules/themes/everforrest/default.nix new file mode 100644 index 0000000..15a7250 --- /dev/null +++ b/modules/themes/everforrest/default.nix @@ -0,0 +1,111 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (builtins) toString readFile; + inherit (lib.attrsets) attrValues; + inherit (lib.modules) mkDefault mkIf mkMerge; + inherit (lib.strings) concatMapStringsSep; + + cfg = config.modules.themes; +in +{ + config = mkIf (cfg.active == "everforrest") + { + modules.themes = { + wallpaper = mkDefault ./assets/zaynstewart-anime-girl-night-alone.png; + + gtk = { + name = "everforrest-Dark-BL"; + package = pkgs.my.everforrest-gtk; + }; + + iconTheme = { + name = "everforrest-dark"; + package = pkgs.fluent-icon-theme.override { + colorVariants = []; + }; + }; + + pointer = { + name = "Bibata-Modern-Classic"; + package = pkgs.bibata-cursors; + size = 24; + }; + + fontConfig = { + packages = attrValues { + inherit (pkgs) noto-fonts-emoji sarasa-gothic; + google-fonts = pkgs.google-fonts.override {fonts = ["Cardo"];}; + nerdfonts = + pkgs.nerdfonts.override {fonts = ["CascadiaCode" "VictorMono"];}; + }; + mono = ["VictorMono Nerd Font" "Sarasa Mono SC"]; + sans = ["Caskaydia Cove Nerd Font" "Sarasa Gothic SC"]; + emoji = ["Noto Color Emoji"]; + }; + + font = { + mono.family = "VictorMono Nerd Font"; + sans.family = "CaskaydiaCove Nerd Font"; + }; + + colors = { + main = { + normal = { + black = "#15161e"; + red = "#f7768e"; + green = "#9ece6a"; + yellow = "#e0af68"; + blue = "#7aa2f7"; + magenta = "#bb9af7"; + cyan = "#7dcfff"; + white = "#a9b1d6"; + }; + bright = { + black = "#414868"; + red = "#f7768e"; + green = "#9ece6a"; + yellow = "#e0af68"; + blue = "#7aa2f7"; + magenta = "#bb9af7"; + cyan = "#7dcfff"; + white = "#c0caf5"; + }; + types = { + fg = "#c0caf5"; + bg = "#1a1b26"; + panelbg = "#ff9e64"; + border = "#1abc9c"; + highlight = "#3d59a1"; + }; + }; + + rofi = { + bg = { + main = "hsla(235, 18%, 12%, 1)"; + alt = "hsla(235, 18%, 12%, 0)"; + bar = "hsla(229, 24%, 18%, 1)"; + }; + fg = "hsla(228, 72%, 85%, 1)"; + ribbon = { + outer = "hsla(188, 68%, 27%, 1)"; + inner = "hsla(202, 76%, 24%, 1)"; + }; + selected = "hsla(220, 88%, 72%, 1)"; + urgent = "hsl(349, 89%, 72%, 1)"; + transparent = "hsla(0, 0%, 0%, 0)"; + }; + }; + + editor = { + helix = { + dark = "everforrest"; + light = "everforrest_storm"; + }; + neovim = { + dark = "everforrest"; + light = "everforrest"; + }; + }; + }; + }; +}