From 1c554f1700022109099f0836c241a10209fd9e88 Mon Sep 17 00:00:00 2001 From: Nikolaos Karaolidis Date: Tue, 20 May 2025 09:07:45 +0100 Subject: [PATCH] Update theme engine Signed-off-by: Nikolaos Karaolidis --- .gitattributes | 2 - .../common/configs/user/gui/swww/default.nix | 9 ++- .../common/configs/user/gui/theme/options.nix | 61 ++++------------ .../user/gui/theme/theme.completion.zsh | 3 + hosts/common/configs/user/gui/theme/theme.sh | 69 +++++++++++++++---- .../users/nick/configs/gui/theme/default.nix | 8 --- hosts/eirene/users/nick/default.nix | 1 - .../nikara/configs/gui/theme/default.nix | 8 --- hosts/elara/users/nikara/default.nix | 1 - static/wallpapers/car.jpg | 3 - static/wallpapers/cats.jpg | 3 - static/wallpapers/clouds.png | 3 - static/wallpapers/girl.png | 3 - static/wallpapers/mountain.jpg | 3 - static/wallpapers/plane.jpg | 3 - static/wallpapers/snow.jpg | 3 - 16 files changed, 81 insertions(+), 102 deletions(-) delete mode 100644 .gitattributes delete mode 100644 hosts/eirene/users/nick/configs/gui/theme/default.nix delete mode 100644 hosts/elara/users/nikara/configs/gui/theme/default.nix delete mode 100644 static/wallpapers/car.jpg delete mode 100644 static/wallpapers/cats.jpg delete mode 100644 static/wallpapers/clouds.png delete mode 100644 static/wallpapers/girl.png delete mode 100644 static/wallpapers/mountain.jpg delete mode 100644 static/wallpapers/plane.jpg delete mode 100644 static/wallpapers/snow.jpg diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index cf74e61..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -**/wallpapers/*.jpg filter=lfs diff=lfs merge=lfs -text -**/wallpapers/*.png filter=lfs diff=lfs merge=lfs -text diff --git a/hosts/common/configs/user/gui/swww/default.nix b/hosts/common/configs/user/gui/swww/default.nix index 399121a..4938fc2 100644 --- a/hosts/common/configs/user/gui/swww/default.nix +++ b/hosts/common/configs/user/gui/swww/default.nix @@ -11,6 +11,7 @@ }: let hmConfig = config.home-manager.users.${user}; + themeSwww = lib.meta.getExe ( pkgs.writeShellApplication { name = "theme-swww"; @@ -18,7 +19,13 @@ let coreutils swww ]; - text = "exec swww img \"${hmConfig.theme.configDir}/wallpaper\""; + text = '' + if [[ -L "${hmConfig.theme.configDir}"/wallpaper ]]; then + exec swww img "${hmConfig.theme.configDir}"/wallpaper + elif [[ -f "${hmConfig.theme.configDir}"/color ]]; then + exec swww clear "$(<"${hmConfig.theme.configDir}"/color)" + fi + ''; } ); in diff --git a/hosts/common/configs/user/gui/theme/options.nix b/hosts/common/configs/user/gui/theme/options.nix index bbb4dca..d9a366b 100644 --- a/hosts/common/configs/user/gui/theme/options.nix +++ b/hosts/common/configs/user/gui/theme/options.nix @@ -8,20 +8,24 @@ let cfg = config.theme; - wallpaper = pkgs.copyPathToStore cfg.wallpaper; - init = pkgs.writeShellApplication { name = "theme-init"; runtimeInputs = with pkgs; [ matugen ]; text = '' - [[ ! -d "${cfg.configDir}" ]] && mkdir -p "${cfg.configDir}" - [[ ! -L "${cfg.configDir}"/wallpaper ]] && ln -sf "${wallpaper}" "${cfg.configDir}"/wallpaper - [[ ! -f "${cfg.configDir}"/mode ]] && echo "${cfg.mode}" > "${cfg.configDir}"/mode + mkdir -p "${cfg.configDir}" - matugen image "${cfg.configDir}/wallpaper" \ - --type scheme-${cfg.flavour} \ - --mode "$(cat "${cfg.configDir}/mode")" \ - --contrast ${builtins.toString cfg.contrast} + [[ ! -L "${cfg.configDir}"/wallpaper ]] && [[ ! -f "${cfg.configDir}"/color ]] && echo "#000000" > "${cfg.configDir}"/color + [[ ! -f "${cfg.configDir}"/mode ]] && echo "dark" > "${cfg.configDir}"/mode + [[ ! -f "${cfg.configDir}"/flavor ]] && echo "tonal-spot" > "${cfg.configDir}"/flavor + [[ ! -f "${cfg.configDir}"/contrast ]] && echo "0" > "${cfg.configDir}"/contrast + + flags=(--mode "$(<"${cfg.configDir}/mode")" --type "scheme-$(<"${cfg.configDir}/flavor")" --contrast "$(<"${cfg.configDir}/contrast")") + + if [[ -L "${cfg.configDir}"/wallpaper ]]; then + matugen image "${cfg.configDir}"/wallpaper "''${flags[@]}" + elif [[ -f "${cfg.configDir}"/color ]]; then + matugen color hex "$(<"${cfg.configDir}"/color)" "''${flags[@]}" + fi ${cfg.initExtraConfig} wait @@ -41,8 +45,6 @@ let runtimeInputs = with pkgs; [ coreutils ]; runtimeEnv = { CONFIG = cfg.configDir; - DEFAULT_WALLPAPER = wallpaper; - DEFAULT_MODE = cfg.mode; INIT = lib.meta.getExe init; RELOAD = lib.meta.getExe reload; }; @@ -63,11 +65,6 @@ in description = "The path to the theme config directory."; }; - wallpaper = mkOption { - type = path; - description = "The path to the default wallpaper"; - }; - pkg = mkOption { type = package; default = theme; @@ -120,36 +117,6 @@ in description = "Templates to fill with theme colors."; }; - flavour = mkOption { - type = enum [ - "content" - "expressive" - "fidelity" - "fruit-salad" - "monochrome" - "neutral" - "rainbow" - "tonal-spot" - ]; - default = "tonal-spot"; - description = "The flavour of the theme."; - }; - - mode = mkOption { - type = enum [ - "dark" - "light" - ]; - default = "dark"; - description = "The default mode of the theme."; - }; - - contrast = mkOption { - type = numbers.between (-1) 1; - default = 0; - description = "Use a modified contrast."; - }; - opacity = mkOption { type = numbers.between 0 1; default = 1; @@ -506,8 +473,6 @@ in percentageToHex = percentage: zeroPad (lib.trivial.toHexString (builtins.floor (percentage * 255))); in { - flavour = cfg.flavour; - contrast = builtins.toString cfg.contrast; radius = builtins.toString cfg.radius; padding = builtins.toString cfg.padding; padding_double = builtins.toString (cfg.padding * 2); diff --git a/hosts/common/configs/user/gui/theme/theme.completion.zsh b/hosts/common/configs/user/gui/theme/theme.completion.zsh index 2e6bee2..76fdd3b 100644 --- a/hosts/common/configs/user/gui/theme/theme.completion.zsh +++ b/hosts/common/configs/user/gui/theme/theme.completion.zsh @@ -2,6 +2,9 @@ _theme_completion() { local options=( '-m[Set mode: 'light', 'dark', or 'toggle']:mode:(light dark toggle)' '-w[Set wallpaper file]:file:_files' + '-h[Set plain color (hex)]:hex color:' + '-f[Set flavor]:flavor:(content expressive fidelity fruit-salad monochrome neutral rainbow tonal-spot)' + '-c[Set contrast (-1 to 1)]:contrast:' ) local curcontext="$curcontext" state line typeset -A opt_args diff --git a/hosts/common/configs/user/gui/theme/theme.sh b/hosts/common/configs/user/gui/theme/theme.sh index 83a532f..8c844d6 100644 --- a/hosts/common/configs/user/gui/theme/theme.sh +++ b/hosts/common/configs/user/gui/theme/theme.sh @@ -1,7 +1,10 @@ # shellcheck shell=bash wallpaper="" +color="" mode="" +flavor="" +contrast="" set_wallpaper() { if [[ -f "$1" ]]; then @@ -12,6 +15,37 @@ set_wallpaper() { fi } +set_color() { + local re='^#?([A-Fa-f0-9]{6})$' + if [[ "$1" =~ $re ]]; then + color="$1" + else + echo "Invalid color format: $1" + exit 1 + fi +} + +set_flavor() { + case "$1" in + content|expressive|fidelity|fruit-salad|monochrome|neutral|rainbow|tonal-spot) + flavor="$1" + ;; + *) + echo "Invalid flavor: $1" + exit 1 + ;; + esac +} + +set_contrast() { + if [[ "$1" =~ ^-?[0-1](\.[0-9]+)?$ ]]; then + contrast="$1" + else + echo "Invalid contrast value: $1" + exit 1 + fi +} + toggle_mode() { if [[ "$(cat "$CONFIG"/mode)" = "light" ]]; then mode="dark" @@ -21,37 +55,48 @@ toggle_mode() { } usage() { - echo "Usage: $0 [-m {light|dark|toggle}] [-w ]" + echo "Usage: $0 [-m {light|dark|toggle}] [-w ] [-h ] [-f ] [-c ]" + echo " Only one of -w (wallpaper) or -h (hex color) can be used." + echo " Valid flavors: content, expressive, fidelity, fruit-salad, monochrome, neutral, rainbow, tonal-spot" + echo " Contrast must be a number between -1 and 1" exit 1 } finish() { - [[ -n "$wallpaper" ]] && ln -sf "$wallpaper" "$CONFIG"/wallpaper + [[ -n "$wallpaper" ]] && rm -f "$CONFIG"/color && ln -sf "$wallpaper" "$CONFIG"/wallpaper + [[ -n "$color" ]] && rm -f "$CONFIG"/wallpaper && echo "$color" > "$CONFIG"/color [[ -n "$mode" ]] && echo "$mode" > "$CONFIG"/mode + [[ -n "$flavor" ]] && echo "$flavor" > "$CONFIG"/flavor + [[ -n "$contrast" ]] && echo "$contrast" > "$CONFIG"/contrast "$INIT" > /dev/null "$RELOAD" > /dev/null } # Parse arguments -while getopts "m:w:" opt; do +while getopts "m:w:h:f:c:" opt; do case "$opt" in m) case "$OPTARG" in - light|dark) - mode="$OPTARG" - ;; - toggle) - toggle_mode - ;; - *) - usage - ;; + light|dark) mode="$OPTARG" ;; + toggle) toggle_mode ;; + *) usage ;; esac ;; w) + [[ -n "$color" ]] && usage set_wallpaper "$OPTARG" ;; + h) + [[ -n "$wallpaper" ]] && usage + set_color "$OPTARG" + ;; + f) + set_flavor "$OPTARG" + ;; + c) + set_contrast "$OPTARG" + ;; *) usage ;; diff --git a/hosts/eirene/users/nick/configs/gui/theme/default.nix b/hosts/eirene/users/nick/configs/gui/theme/default.nix deleted file mode 100644 index 0107e4b..0000000 --- a/hosts/eirene/users/nick/configs/gui/theme/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ - user ? throw "user argument is required", - home ? throw "home argument is required", -}: -{ ... }: -{ - home-manager.users.${user}.theme.wallpaper = ../../../../../../../static/wallpapers/clouds.png; -} diff --git a/hosts/eirene/users/nick/default.nix b/hosts/eirene/users/nick/default.nix index 74f9d25..571cbb4 100644 --- a/hosts/eirene/users/nick/default.nix +++ b/hosts/eirene/users/nick/default.nix @@ -87,7 +87,6 @@ in (import ./configs/console/syncthing { inherit user home; }) (import ./configs/gui/obsidian { inherit user home; }) - (import ./configs/gui/theme { inherit user home; }) (import ./configs/gui/vscode { inherit user home; }) ]; diff --git a/hosts/elara/users/nikara/configs/gui/theme/default.nix b/hosts/elara/users/nikara/configs/gui/theme/default.nix deleted file mode 100644 index c912b77..0000000 --- a/hosts/elara/users/nikara/configs/gui/theme/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ - user ? throw "user argument is required", - home ? throw "home argument is required", -}: -{ ... }: -{ - home-manager.users.${user}.theme.wallpaper = ../../../../../../../static/wallpapers/snow.jpg; -} diff --git a/hosts/elara/users/nikara/default.nix b/hosts/elara/users/nikara/default.nix index e714268..5296386 100644 --- a/hosts/elara/users/nikara/default.nix +++ b/hosts/elara/users/nikara/default.nix @@ -87,7 +87,6 @@ in (import ./configs/console/viya4-orders-cli { inherit user home; }) (import ./configs/gui/obsidian { inherit user home; }) - (import ./configs/gui/theme { inherit user home; }) (import ./configs/gui/vscode { inherit user home; }) ]; diff --git a/static/wallpapers/car.jpg b/static/wallpapers/car.jpg deleted file mode 100644 index e875a05..0000000 --- a/static/wallpapers/car.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a02be2cc6471cbb35f1a0ec657581578fe2e9fc2c8f2e1b0769b21f65dcfadec -size 4656195 diff --git a/static/wallpapers/cats.jpg b/static/wallpapers/cats.jpg deleted file mode 100644 index 980fc81..0000000 --- a/static/wallpapers/cats.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63d92b63e616073e074684d756779b4491245ebc4c6fad63d87a02def12880a1 -size 319291 diff --git a/static/wallpapers/clouds.png b/static/wallpapers/clouds.png deleted file mode 100644 index 8441988..0000000 --- a/static/wallpapers/clouds.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eab8229ea4b6d29c3ee2ad601b09f883bc1d4b2ca555a411cb7b9b48fa0153d4 -size 2446726 diff --git a/static/wallpapers/girl.png b/static/wallpapers/girl.png deleted file mode 100644 index 14f01a3..0000000 --- a/static/wallpapers/girl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:435df84b9561fd8453ec0790f500a7c8035da8a3618aa12c1c9ef065358f88a3 -size 4160621 diff --git a/static/wallpapers/mountain.jpg b/static/wallpapers/mountain.jpg deleted file mode 100644 index 6929d79..0000000 --- a/static/wallpapers/mountain.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4972b203699c641c43876b464962ac0934a6cdd521d33b33365afecfa760e4bb -size 1005842 diff --git a/static/wallpapers/plane.jpg b/static/wallpapers/plane.jpg deleted file mode 100644 index 4935354..0000000 --- a/static/wallpapers/plane.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a2962ac70c824d6f1baa3d642490454b1be7fa4e3c91742c75238d72713c7b4 -size 5570903 diff --git a/static/wallpapers/snow.jpg b/static/wallpapers/snow.jpg deleted file mode 100644 index b76931a..0000000 --- a/static/wallpapers/snow.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f965bd8e58c02d3ddebfe87e129ebe7934bc169bdfc723ae61fe6a67c1b00860 -size 944602