kanshi: add support for output aliases

- Add `services.kanshi.profiles.<name>.outputs.*.alias` to support new
  alias directive from kanshi [1].
  - Add an assertion to reject aliases not on global scope, which are
    not allowed on kanshi [2].
  - Add a new test to check alias rejection, `alias-assertion`.
- Add relevant coverage by modifying the existing "new-configuration"
  test.
- Kanshi also doesn't allow wildcards on global scope [3], correct the
  faulty test case.

[1]: 1ed86ce523
[2]: 1605f7c813/item/doc/kanshi.5.scd (L78)
[3]: 1605f7c813/item/doc/kanshi.5.scd (L80)
This commit is contained in:
O. C. Taskin 2024-09-13 10:51:33 +02:00 committed by GitHub
parent cb3ab5928c
commit daaf0c2f8d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 45 additions and 8 deletions

View file

@ -123,6 +123,15 @@ let
'';
};
alias = mkOption {
type = types.nullOr types.str;
default = null;
example = "laptopMonitor";
description = ''
Defines an alias for the output
'';
};
adaptiveSync = mkOption {
type = types.nullOr types.bool;
default = null;
@ -135,15 +144,16 @@ let
};
};
outputStr =
{ criteria, status, mode, position, scale, transform, adaptiveSync, ... }:
outputStr = { criteria, status, mode, position, scale, transform, adaptiveSync
, alias, ... }:
''output "${criteria}"'' + optionalString (status != null) " ${status}"
+ optionalString (mode != null) " mode ${mode}"
+ optionalString (position != null) " position ${position}"
+ optionalString (scale != null) " scale ${toString scale}"
+ optionalString (transform != null) " transform ${transform}"
+ optionalString (adaptiveSync != null)
" adaptive_sync ${if adaptiveSync then "on" else "off"}";
" adaptive_sync ${if adaptiveSync then "on" else "off"}"
+ optionalString (alias != null) " alias \$${alias}";
profileModule = types.submodule {
options = {
@ -296,6 +306,14 @@ in {
message =
"Cannot mix kanshi.settings with kanshi.profiles or kanshi.extraConfig";
}
{
assertion = let profiles = filter (x: x ? profile) cfg.settings;
in length
(filter (x: any (a: a ? alias && a.alias != null) x.profile.outputs)
profiles) == 0;
message =
"Output kanshi.*.output.alias can only be defined on global scope";
}
];
}

View file

@ -0,0 +1,18 @@
{ config, pkgs, ... }: {
config = {
services.kanshi = {
enable = true;
package = config.lib.test.mkStubPackage { };
settings = [{
profile.name = "nomad";
profile.outputs = [{
criteria = "eDP-1";
alias = "test";
}];
}];
};
test.asserts.assertions.expected =
[ "Output kanshi.*.output.alias can only be defined on global scope" ];
};
}

View file

@ -1,4 +1,5 @@
{
kanshi-basic-configuration = ./basic-configuration.nix;
kanshi-new-configuration = ./new-configuration.nix;
kanshi-alias-assertion = ./alias-assertion.nix;
}

View file

@ -1,12 +1,12 @@
include "path/to/included/file"
output "*" enable
output "Iiyama North America PLE2483H-DP" alias $iiyama
profile nomad {
output "eDP-1" enable
}
profile desktop {
output "eDP-1" disable
output "Iiyama North America PLE2483H-DP" enable position 0,0
output "$iiyama" enable position 0,0
output "Iiyama North America PLE2483H-DP 1158765348486" enable mode 1920x1080 position 1920,0 scale 2.100000 transform flipped-270
exec echo "1 two 3"
exec echo "4 five 6"

View file

@ -7,8 +7,8 @@
{ include = "path/to/included/file"; }
{
output = {
criteria = "*";
status = "enable";
criteria = "Iiyama North America PLE2483H-DP";
alias = "iiyama";
};
}
{
@ -27,7 +27,7 @@
status = "disable";
}
{
criteria = "Iiyama North America PLE2483H-DP";
criteria = "$iiyama";
status = "enable";
position = "0,0";
}