From 8af2e064f93234ee79df8b9858eeefbf84394488 Mon Sep 17 00:00:00 2001 From: Gautham Venkataraman Date: Mon, 18 Aug 2025 19:36:23 +0200 Subject: [PATCH] satty: add satty to program modules Add satty, a wlroots based screenshot annotation tool, to the programs module. --- .../misc/news/2025/08/2025-08-18_19-37-24.nix | 12 ++++ modules/programs/satty.nix | 57 +++++++++++++++++++ .../programs/satty/basic-configuration.nix | 26 +++++++++ tests/modules/programs/satty/default.nix | 6 ++ .../modules/programs/satty/empty-settings.nix | 7 +++ .../programs/satty/expected-config.toml | 11 ++++ 6 files changed, 119 insertions(+) create mode 100644 modules/misc/news/2025/08/2025-08-18_19-37-24.nix create mode 100644 modules/programs/satty.nix create mode 100644 tests/modules/programs/satty/basic-configuration.nix create mode 100644 tests/modules/programs/satty/default.nix create mode 100644 tests/modules/programs/satty/empty-settings.nix create mode 100644 tests/modules/programs/satty/expected-config.toml diff --git a/modules/misc/news/2025/08/2025-08-18_19-37-24.nix b/modules/misc/news/2025/08/2025-08-18_19-37-24.nix new file mode 100644 index 000000000..77afe6f60 --- /dev/null +++ b/modules/misc/news/2025/08/2025-08-18_19-37-24.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: +{ + time = "2025-08-18T17:37:24+00:00"; + condition = pkgs.stdenv.hostPlatform.isLinux; + message = '' + A new module is available: 'programs.satty' + + Satty is a screenshot annotation tool, inspired by Swappy and Flameshot. + It can easily integrate with your wlroots based screenshot tool and + comes with a simple and functional UI for post-processing your screenshots. + ''; +} diff --git a/modules/programs/satty.nix b/modules/programs/satty.nix new file mode 100644 index 000000000..b09dec0d4 --- /dev/null +++ b/modules/programs/satty.nix @@ -0,0 +1,57 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.programs.satty; + + tomlFormat = pkgs.formats.toml { }; +in +{ + meta.maintainers = [ lib.hm.maintainers.gauthsvenkat ]; + + options.programs.satty = { + enable = lib.mkEnableOption "Satty - Modern Screenshot Annotation"; + + package = lib.mkPackageOption pkgs "satty" { nullable = true; }; + + settings = lib.mkOption { + type = tomlFormat.type; + default = { }; + example = lib.literalExpression '' + { + general = { + fullscreen = true; + corner-roundness = 12; + initial-tool = "brush"; + output-filename = "/tmp/test-%Y-%m-%d_%H:%M:%S.png"; + }; + color-palette = { + palette = [ "#00ffff" "#a52a2a" "#dc143c" "#ff1493" "#ffd700" "#008000" ]; + }; + } + ''; + description = '' + Configuration for Satty written to {file}`$XDG_CONFIG_HOME/satty/config.toml`. + + See the [Satty documentation](https://github.com/gabm/Satty#configuration-file) + for available options. + ''; + }; + + }; + + config = lib.mkIf cfg.enable { + assertions = [ + (lib.hm.assertions.assertPlatform "programs.satty" pkgs lib.platforms.linux) + ]; + + home.packages = lib.mkIf (cfg.package != null) [ cfg.package ]; + + xdg.configFile."satty/config.toml" = lib.mkIf (cfg.settings != { }) { + source = tomlFormat.generate "satty-config.toml" cfg.settings; + }; + }; +} diff --git a/tests/modules/programs/satty/basic-configuration.nix b/tests/modules/programs/satty/basic-configuration.nix new file mode 100644 index 000000000..672deae6f --- /dev/null +++ b/tests/modules/programs/satty/basic-configuration.nix @@ -0,0 +1,26 @@ +{ + programs.satty = { + enable = true; + settings = { + general = { + fullscreen = true; + corner-roundness = 12; + initial-tool = "brush"; + output-filename = "/tmp/test.png"; + }; + + font.family = "Roboto"; + + color-palette.palette = [ "#00ffff" ]; + }; + }; + + nmt.script = + let + configFile = "home-files/.config/satty/config.toml"; + in + '' + assertFileExists "${configFile}" + assertFileContent "${configFile}" ${./expected-config.toml} + ''; +} diff --git a/tests/modules/programs/satty/default.nix b/tests/modules/programs/satty/default.nix new file mode 100644 index 000000000..a7ab446a4 --- /dev/null +++ b/tests/modules/programs/satty/default.nix @@ -0,0 +1,6 @@ +{ lib, pkgs, ... }: + +lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux { + satty-basic-configuration = ./basic-configuration.nix; + satty-empty-configuration = ./empty-settings.nix; +} diff --git a/tests/modules/programs/satty/empty-settings.nix b/tests/modules/programs/satty/empty-settings.nix new file mode 100644 index 000000000..a4c6cbfe3 --- /dev/null +++ b/tests/modules/programs/satty/empty-settings.nix @@ -0,0 +1,7 @@ +{ + programs.satty.enable = false; + + nmt.script = '' + assertPathNotExists "home-files/.config/satty" + ''; +} diff --git a/tests/modules/programs/satty/expected-config.toml b/tests/modules/programs/satty/expected-config.toml new file mode 100644 index 000000000..0afb88d2a --- /dev/null +++ b/tests/modules/programs/satty/expected-config.toml @@ -0,0 +1,11 @@ +[color-palette] +palette = ["#00ffff"] + +[font] +family = "Roboto" + +[general] +corner-roundness = 12 +fullscreen = true +initial-tool = "brush" +output-filename = "/tmp/test.png"