From ec5871b524f5badd4119fd076ddab1afc698be42 Mon Sep 17 00:00:00 2001 From: Gabriel Arazas Date: Thu, 17 Apr 2025 16:09:08 +0800 Subject: [PATCH] home-manager/programs/kando: init --- modules/home-manager/default.nix | 1 + modules/home-manager/programs/kando.nix | 141 ++++++++++++++++++ tests/modules/home-manager/default.nix | 1 + .../home-manager/programs/kando/basic.nix | 23 +++ .../home-manager/programs/kando/default.nix | 4 + .../programs/kando/empty-settings.nix | 10 ++ 6 files changed, 180 insertions(+) create mode 100644 modules/home-manager/programs/kando.nix create mode 100644 tests/modules/home-manager/programs/kando/basic.nix create mode 100644 tests/modules/home-manager/programs/kando/default.nix create mode 100644 tests/modules/home-manager/programs/kando/empty-settings.nix diff --git a/modules/home-manager/default.nix b/modules/home-manager/default.nix index 1cd16df4..a745b2c3 100644 --- a/modules/home-manager/default.nix +++ b/modules/home-manager/default.nix @@ -1,6 +1,7 @@ { imports = [ ./files/mutable-files.nix + ./programs/kando.nix ./programs/pipewire.nix ./programs/pop-launcher.nix ./programs/borgmatic.nix diff --git a/modules/home-manager/programs/kando.nix b/modules/home-manager/programs/kando.nix new file mode 100644 index 00000000..3db47931 --- /dev/null +++ b/modules/home-manager/programs/kando.nix @@ -0,0 +1,141 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.programs.kando; + + settingsFormat = pkgs.formats.json { }; +in +{ + options.programs.kando = { + enable = lib.mkEnableOption "Kando, a pie menu"; + + package = lib.mkPackageOption pkgs "kando" { }; + + settings = lib.mkOption { + type = settingsFormat.type; + default = { }; + description = '' + Settings for Kando to be generated at + {file}`$XDG_CONFIG_HOME/kando/config.json`. + ''; + example = lib.literalExpression '' + { + enableVersionCheck = false; + + menuTheme = "my-menu-theme"; + darkMenuTheme = "my-dark-menu-theme"; + + soundTheme = "my-sound-theme"; + soundVolume = 0.8; + + iconTheme = "my-icon-theme"; + } + ''; + }; + + menuSettings = lib.mkOption { + type = settingsFormat.type; + default = { }; + description = '' + Menu-specific configuration for Kando to be generated at + {file}`$XDG_CONFIG_HOME/kando/menus.json`. + ''; + example = lib.literalExpression '' + { + menus = [ + { + shortcut = "Ctrl+Space"; + shortcutId = "example-menu"; + root = { + type = "submenu"; + name = "example-menu.submenu"; + children = [ + # ... + ]; + }; + } + + { + shortcut = "Super+Space"; + shortcutId = "super-menu"; + root = { + type = "submenu"; + name = "super-menu.submenu"; + children = [ + # ... + ]; + }; + } + ]; + } + ''; + }; + + themes = let + mkThemeOption = type: expectedOutputDir: + lib.mkOption { + type = with lib.types; listOf package; + default = [ ]; + description = '' + A list of packages containing Kando ${type} themes expected at + {file}`${expectedOutputDir}`. + ''; + example = lib.literalExpression '' + with pkgs.kandoThemes; [ + doggo + catpuccin + ]; + ''; + }; + in { + menus = mkThemeOption "menu" "$out/share/kando/menu-themes"; + sounds = mkThemeOption "sound" "$out/share/kando/sound-themes"; + icons = mkThemeOption "icon" "$out/share/kando/icon-themes"; + }; + + enableGnomeInegration = lib.mkEnableOption "GNOME Shell integration"; + }; + + config = lib.mkIf cfg.enable { + home.packages = [ cfg.package ] ++ lib.optionals cfg.enableGnomeInegration [ + pkgs.gnomeExtensions.kando-integration + ]; + + xdg.configFile = { + "kando/config.json" = lib.mkIf (cfg.settings != { }) { + source = settingsFormat.generate "kando-settings-home-manager" cfg.settings; + }; + + "kando/menus.json" = lib.mkIf (cfg.menuSettings != { }) { + source = settingsFormat.generate "kando-menu-settings-home-manager" cfg.menuSettings; + }; + + "kando/menu-themes" = lib.mkIf (cfg.themes.menus != [ ]) { + source = pkgs.buildEnv { + paths = cfg.themes.menus; + pathsToLink = [ + "/share/kando/menu-themes" + ]; + }; + }; + + "kando/sound-themes" = lib.mkIf (cfg.themes.sounds != [ ]) { + source = pkgs.buildEnv { + paths = cfg.themes.menus; + pathsToLink = [ + "/share/kando/sound-themes" + ]; + }; + }; + + "kando/icon-themes" = lib.mkIf (cfg.themes.icons != [ ]) { + source = pkgs.buildEnv { + paths = cfg.themes.menus; + pathsToLink = [ + "/share/kando/icon-themes" + ]; + }; + }; + }; + }; +} diff --git a/tests/modules/home-manager/default.nix b/tests/modules/home-manager/default.nix index c4c1c484..81a0f9e7 100644 --- a/tests/modules/home-manager/default.nix +++ b/tests/modules/home-manager/default.nix @@ -50,6 +50,7 @@ in import nmt { # TODO: Fix nmt to accept specialArgs or something. tests = builtins.foldl' (a: b: a // (import b)) { } ([ #./programs/borgmatic + ./programs/kando ./programs/diceware ./programs/sesh ./programs/pipewire diff --git a/tests/modules/home-manager/programs/kando/basic.nix b/tests/modules/home-manager/programs/kando/basic.nix new file mode 100644 index 00000000..ef33503a --- /dev/null +++ b/tests/modules/home-manager/programs/kando/basic.nix @@ -0,0 +1,23 @@ +{ config, lib, pkgs, ... }: + +{ + programs.kando = { + enable = true; + + settings = { + hello = "there"; + a = "bc"; + _1 = 23; + }; + + menuSettings = { + shortcut = "Ctrl+Space"; + shortcutId = "example-menu"; + }; + }; + + nmt.script = '' + assertFileExists home-files/.config/kando/config.json + assertFileExists home-files/.config/kando/menus.json + ''; +} diff --git a/tests/modules/home-manager/programs/kando/default.nix b/tests/modules/home-manager/programs/kando/default.nix new file mode 100644 index 00000000..79fe692d --- /dev/null +++ b/tests/modules/home-manager/programs/kando/default.nix @@ -0,0 +1,4 @@ +{ + kando-basic-setup = ./basic.nix; + kando-empty-settings = ./empty-settings.nix; +} diff --git a/tests/modules/home-manager/programs/kando/empty-settings.nix b/tests/modules/home-manager/programs/kando/empty-settings.nix new file mode 100644 index 00000000..adb52eef --- /dev/null +++ b/tests/modules/home-manager/programs/kando/empty-settings.nix @@ -0,0 +1,10 @@ +{ config, lib, pkgs, ... }: + +{ + programs.kando.enable = true; + + nmt.script = '' + assertPathNotExists home-files/.config/kando/config.json + assertPathNotExists home-files/.config/kando/menus.json + ''; +}