home-manager: programs.valw.noctalia.enable; README and checklist

This commit is contained in:
elwrcl committed 2026-10-04 06:15:11 +03:00
1 parent 127d44040e
commit 9fa71fd399
4 files changed
+64 -13

No files matched your search

+19 -1
View File
@@ -61,7 +61,7 @@ binds {
| `valw region` | Drag a region; Shift locks an axis, Alt grows from the centre, Space moves it; Space before dragging switches to window mode | | `valw region` | Drag a region; Shift locks an axis, Alt grows from the centre, Space moves it; Space before dragging switches to window mode |
| `valw window [--pick]` | Pick a window from cards over a liquid-paint background (Tab/arrows, Enter, Esc); `--pick` clicks it on screen instead | | `valw window [--pick]` | Pick a window from cards over a liquid-paint background (Tab/arrows, Enter, Esc); `--pick` clicks it on screen instead |
| `valw zoom` | Freeze the screen and zoom: wheel, drag, `f` flashlight, `c` capture the view, `0` reset, Esc | | `valw zoom` | Freeze the screen and zoom: wheel, drag, `f` flashlight, `c` capture the view, `0` reset, Esc |
| `valw toolbar` | Pick a mode from a floating bar, with a timer and options | | `valw toolbar` | Pick a mode from a floating bar, with a timer and options; `--state`, `--set KEY=VALUE` and `--run [MODE]` drive it without the bar (the Noctalia plugin uses them) |
| `valw edit FILE` | The markup editor (clicking a preview opens it) | | `valw edit FILE` | The markup editor (clicking a preview opens it) |
| `valw backdrop` | Keep running: the liquid-paint background behind niri's overview (below) | | `valw backdrop` | Keep running: the liquid-paint background behind niri's overview (below) |
| `valw doctor` | What the compositor and system support | | `valw doctor` | What the compositor and system support |
@@ -89,6 +89,24 @@ With Noctalia, turn its own backdrop off (`[backdrop] enabled = false`).
Colours elsewhere (the region dim, the window picker's fallback) follow Colours elsewhere (the region dim, the window picker's fallback) follow
Noctalia's current community palette when there is one. Noctalia's current community palette when there is one.
## Noctalia
With [Noctalia](https://noctalia.dev), valw comes as a plugin: a camera
button on the bar (left click: the toolbar, right click: a region shot),
the toolbar as a Noctalia panel and a control-center tile. Noctalia draws
them, so they follow your Noctalia theme.
```nix
programs.valw.noctalia.enable = true;
```
Then enable `elars/valw` in Noctalia, add a widget of type `elars/valw:bar`
to a bar, and bind the toolbar:
```kdl
Mod+Shift+T { spawn "noctalia" "msg" "panel-toggle" "elars/valw:toolbar"; }
```
## Configuration ## Configuration
Every key is optional; these are the defaults. Every key is optional; these are the defaults.
+12
View File
@@ -188,3 +188,15 @@ image, a cancel brought the thumbnail back, and a swipe still dismissed it.
- The backdrop calls every lock error "another backdrop is running"; it keeps its first scale after a scale change. - The backdrop calls every lock error "another backdrop is running"; it keeps its first scale after a scale change.
- libEGL is unloaded when the last backdrop surface goes; a removed output leaks its viewport object. - libEGL is unloaded when the last backdrop surface goes; a removed output leaks its viewport object.
- Holding Tab doesn't repeat in the picker; "no windows" exits as an error instead of a cancel. - Holding Tab doesn't repeat in the picker; "no windows" exits as an error instead of a cancel.
## Noctalia plugin
- [ ] `programs.valw.noctalia.enable` + `elars/valw` enabled: the camera button appears where the widget is placed; its tooltip says Screenshot.
- [ ] Left click opens the toolbar panel next to the bar; it uses Noctalia's colours, font, corners and border; switching the palette or light/dark restyles it.
- [ ] The remembered mode is highlighted; Screen / Region / Window / Zoom each capture, and the panel is never in the shot.
- [ ] Timer and the three toggles persist, and match what `valw toolbar` (the self-drawn bar) shows, both ways; the timer shows valw's countdown.
- [ ] Right click on the button: a region shot (no timer).
- [ ] Control-center tile: click closes the control center, then a region shot; right click opens the toolbar panel.
- [ ] `noctalia msg panel-toggle elars/valw:toolbar` (Mod+Shift+T) opens and closes the panel.
- [ ] With valw off Noctalia's PATH: "valw is not available" and a notification, no crash.
- [ ] Turkish locale: the Turkish strings appear.
+24 -12
View File
@@ -13,28 +13,32 @@
# The home-manager module, evaluated with stand-ins for the two # The home-manager module, evaluated with stand-ins for the two
# home-manager options it sets (no home-manager input needed). # home-manager options it sets (no home-manager input needed).
homeModule = homeModule =
settings: valwConfig:
(lib.evalModules { (lib.evalModules {
modules = [ modules = [
self.homeModules.default self.homeModules.default
( (
{ lib, ... }: { lib, ... }:
{ let
options.home.packages = lib.mkOption { files = lib.mkOption {
type = lib.types.listOf lib.types.package;
default = [ ];
};
options.xdg.configFile = lib.mkOption {
type = lib.types.attrsOf ( type = lib.types.attrsOf (
lib.types.submodule { options.source = lib.mkOption { type = lib.types.path; }; } lib.types.submodule { options.source = lib.mkOption { type = lib.types.path; }; }
); );
default = { }; default = { };
}; };
in
{
options.home.packages = lib.mkOption {
type = lib.types.listOf lib.types.package;
default = [ ];
};
options.xdg.configFile = files;
options.xdg.dataFile = files;
config._module.args.pkgs = pkgs; config._module.args.pkgs = pkgs;
config.programs.valw = { config.programs.valw = {
enable = true; enable = true;
inherit settings; }
}; // valwConfig;
} }
) )
]; ];
@@ -58,12 +62,19 @@
let let
plain = homeModule { }; plain = homeModule { };
set = homeModule { set = homeModule {
preview.timeout_secs = 3; settings = {
sound.volume = 0.4; preview.timeout_secs = 3;
sound.volume = 0.4;
};
}; };
noctalia = homeModule { noctalia.enable = true; };
in in
assert lib.assertMsg (plain.home.packages == [ valw ]) "the module installs valw"; assert lib.assertMsg (plain.home.packages == [ valw ]) "the module installs valw";
assert lib.assertMsg (plain.xdg.configFile == { }) "no settings, no config file"; assert lib.assertMsg (plain.xdg.configFile == { }) "no settings, no config file";
assert lib.assertMsg (plain.xdg.dataFile == { }) "no Noctalia plugin unless asked";
assert lib.assertMsg (
noctalia.xdg.dataFile."noctalia/plugins/valw".source == "${valw}/share/valw/noctalia-plugin"
) "the plugin is linked where Noctalia looks";
pkgs.runCommand "valw-home-module" { } '' pkgs.runCommand "valw-home-module" { } ''
grep -qx 'timeout_secs = 3' ${set.xdg.configFile."valw/config.toml".source} grep -qx 'timeout_secs = 3' ${set.xdg.configFile."valw/config.toml".source}
grep -qx 'volume = 0.4' ${set.xdg.configFile."valw/config.toml".source} grep -qx 'volume = 0.4' ${set.xdg.configFile."valw/config.toml".source}
@@ -79,7 +90,8 @@
let let
fails = fails =
settings: settings:
pkgs.testers.testBuildFailure (homeModule settings).xdg.configFile."valw/config.toml".source; pkgs.testers.testBuildFailure
(homeModule { inherit settings; }).xdg.configFile."valw/config.toml".source;
in in
pkgs.runCommand "valw-home-module-rejects" { } '' pkgs.runCommand "valw-home-module-rejects" { } ''
grep -q 'sound.volume must be between 0 and 1' ${fails { sound.volume = 2; }}/testBuildFailure.log grep -q 'sound.volume must be between 0 and 1' ${fails { sound.volume = 2; }}/testBuildFailure.log
+9
View File
@@ -45,6 +45,12 @@
valw at build time. Empty means valw's defaults. valw at build time. Empty means valw's defaults.
''; '';
}; };
noctalia.enable = lib.mkEnableOption ''
valw's Noctalia plugin (a bar button, the toolbar as a Noctalia
panel and a control-center tile), linked into
`$XDG_DATA_HOME/noctalia/plugins/valw`. Enable `elars/valw` and
place its widget in Noctalia's own settings
'';
}; };
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
@@ -52,6 +58,9 @@
xdg.configFile."valw/config.toml" = lib.mkIf (cfg.settings != { }) { xdg.configFile."valw/config.toml" = lib.mkIf (cfg.settings != { }) {
source = checked cfg.settings; source = checked cfg.settings;
}; };
xdg.dataFile."noctalia/plugins/valw" = lib.mkIf cfg.noctalia.enable {
source = "${cfg.package}/share/valw/noctalia-plugin";
};
}; };
}; };
} }