diff --git a/modules/misc/news.nix b/modules/misc/news.nix index 395a45d5f..4cc662afb 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -2062,6 +2062,18 @@ in { See https://github.com/mateusauler/git-worktree-switcher for more. ''; } + + { + time = "2025-02-20T18:39:31+00:00"; + condition = hostPlatform.isLinux; + message = '' + A new module is available: 'programs.swayimg'. + + swayimg is a fully customizable and lightweight image viewer for + Wayland based display servers. + See https://github.com/artemsen/swayimg for more. + ''; + } ]; }; } diff --git a/modules/modules.nix b/modules/modules.nix index e42be9710..70505ee83 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -237,6 +237,7 @@ let ./programs/sqls.nix ./programs/ssh.nix ./programs/starship.nix + ./programs/swayimg.nix ./programs/swaylock.nix ./programs/swayr.nix ./programs/taskwarrior.nix diff --git a/modules/programs/swayimg.nix b/modules/programs/swayimg.nix new file mode 100644 index 000000000..aac56ece3 --- /dev/null +++ b/modules/programs/swayimg.nix @@ -0,0 +1,53 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.programs.swayimg; + iniFormat = pkgs.formats.ini { }; +in { + meta.maintainers = with lib.maintainers; [ dod-101 ]; + + options.programs.swayimg = { + enable = lib.mkEnableOption "swayimg"; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.swayimg; + defaultText = lib.literalExpression "pkgs.swayimg"; + description = "The swayimg package to install"; + }; + settings = lib.mkOption { + type = iniFormat.type; + default = { }; + description = '' + Configuration written to + {file}`$XDG_CONFIG_HOME/swayimg/config`. See for a list of available options. + ''; + example = lib.literalExpression '' + { + viewer = { + window = "#10000010"; + scale = "fill"; + }; + "info.viewer" = { + top_left = "+name,+format"; + }; + "keys.viewer" = { + "Shift+r" = "rand_file"; + }; + } + ''; + }; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + (lib.hm.assertions.assertPlatform "programs.swayimg" pkgs + lib.platforms.linux) + ]; + + home.packages = [ cfg.package ]; + + xdg.configFile."swayimg/config" = lib.mkIf (cfg.settings != { }) { + source = iniFormat.generate "config" cfg.settings; + }; + }; +} diff --git a/tests/default.nix b/tests/default.nix index 5dad7cef3..459808b89 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -307,6 +307,7 @@ in import nmtSrc { ./modules/programs/rbw ./modules/programs/rofi ./modules/programs/rofi-pass + ./modules/programs/swayimg ./modules/programs/swaylock ./modules/programs/swayr ./modules/programs/terminator diff --git a/tests/modules/programs/swayimg/default.nix b/tests/modules/programs/swayimg/default.nix new file mode 100644 index 000000000..b2c3dfa9b --- /dev/null +++ b/tests/modules/programs/swayimg/default.nix @@ -0,0 +1,4 @@ +{ + swayimg-empty-settings = ./empty-settings.nix; + swayimg-example-settings = ./example-settings.nix; +} diff --git a/tests/modules/programs/swayimg/empty-settings.nix b/tests/modules/programs/swayimg/empty-settings.nix new file mode 100644 index 000000000..3ea1c2347 --- /dev/null +++ b/tests/modules/programs/swayimg/empty-settings.nix @@ -0,0 +1,7 @@ +{ + programs.swayimg.enable = true; + + nmt.script = '' + assertPathNotExists home-files/.config/swayimg + ''; +} diff --git a/tests/modules/programs/swayimg/example-settings-expected.ini b/tests/modules/programs/swayimg/example-settings-expected.ini new file mode 100644 index 000000000..f844feb6c --- /dev/null +++ b/tests/modules/programs/swayimg/example-settings-expected.ini @@ -0,0 +1,9 @@ +[info.viewer] +top_left=+name,+format + +[keys.viewer] +Shift+r=rand_file + +[viewer] +scale=fill +window=#10000010 diff --git a/tests/modules/programs/swayimg/example-settings.nix b/tests/modules/programs/swayimg/example-settings.nix new file mode 100644 index 000000000..a1c4adfd2 --- /dev/null +++ b/tests/modules/programs/swayimg/example-settings.nix @@ -0,0 +1,23 @@ +{ config, ... }: + +{ + programs.swayimg = { + enable = true; + package = config.lib.test.mkStubPackage { }; + + settings = { + viewer = { + window = "#10000010"; + scale = "fill"; + }; + "info.viewer" = { top_left = "+name,+format"; }; + "keys.viewer" = { "Shift+r" = "rand_file"; }; + }; + }; + + nmt.script = '' + assertFileContent \ + home-files/.config/swayimg/config \ + ${./example-settings-expected.ini} + ''; +}