swayidle: add module (#2610)
Swayidle is an idle management daemon for Wayland. This modules adds support for running swayidle as a SystemD user unit and makes it configurable through home-manager.main
parent
8e7a10602d
commit
65e5b835a9
@ -0,0 +1,118 @@ |
||||
{ config, lib, pkgs, ... }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
|
||||
cfg = config.services.swayidle; |
||||
|
||||
mkTimeout = t: |
||||
[ "timeout" (toString t.timeout) (escapeShellArg t.command) ] |
||||
++ optionals (t.resumeCommand != null) [ |
||||
"resume" |
||||
(escapeShellArg t.resumeCommand) |
||||
]; |
||||
|
||||
mkEvent = e: [ e.event (escapeShellArg e.command) ]; |
||||
|
||||
args = (concatMap mkTimeout cfg.timeouts) ++ (concatMap mkEvent cfg.events) |
||||
++ cfg.extraArgs; |
||||
|
||||
in { |
||||
meta.maintainers = [ maintainers.c0deaddict ]; |
||||
|
||||
options.services.swayidle = let |
||||
|
||||
timeoutModule = { ... }: { |
||||
options = { |
||||
timeout = mkOption { |
||||
type = types.ints.positive; |
||||
description = "Timeout in seconds"; |
||||
example = 60; |
||||
}; |
||||
|
||||
command = mkOption { |
||||
type = types.str; |
||||
description = "Command to run after timeout seconds of inactivity"; |
||||
}; |
||||
|
||||
resumeCommand = mkOption { |
||||
type = with types; nullOr str; |
||||
default = null; |
||||
description = "Command to run when there is activity again"; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
eventModule = { ... }: { |
||||
options = { |
||||
event = mkOption { |
||||
type = types.enum [ "before-sleep" "after-resume" "lock" "unlock" ]; |
||||
description = "Event name"; |
||||
}; |
||||
|
||||
command = mkOption { |
||||
type = types.str; |
||||
description = "Command to run when event occurs"; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
in { |
||||
enable = mkEnableOption "Idle manager for Wayland"; |
||||
|
||||
package = mkOption { |
||||
type = types.package; |
||||
default = pkgs.swayidle; |
||||
defaultText = literalExpression "pkgs.swayidle"; |
||||
description = "Swayidle package to install."; |
||||
}; |
||||
|
||||
timeouts = mkOption { |
||||
type = with types; listOf (submodule timeoutModule); |
||||
default = [ ]; |
||||
description = "List of commands to run after idle timeout"; |
||||
example = '' |
||||
[ |
||||
{ timeout = 60; command = "swaylock -fF"; } |
||||
] |
||||
''; |
||||
}; |
||||
|
||||
events = mkOption { |
||||
type = with types; listOf (submodule eventModule); |
||||
default = [ ]; |
||||
example = '' |
||||
[ |
||||
{ event = "before-sleep"; command = "swaylock"; } |
||||
{ event = "lock"; command = "lock"; } |
||||
] |
||||
''; |
||||
description = "Run command on occurence of a event"; |
||||
}; |
||||
|
||||
extraArgs = mkOption { |
||||
type = with types; listOf str; |
||||
default = [ ]; |
||||
description = "Extra arguments to pass to swayidle"; |
||||
}; |
||||
}; |
||||
|
||||
config = mkIf cfg.enable { |
||||
systemd.user.services.swayidle = { |
||||
Unit = { |
||||
Description = "Idle manager for Wayland"; |
||||
Documentation = "man:swayidle(1)"; |
||||
PartOf = [ "graphical-session.target" ]; |
||||
}; |
||||
|
||||
Service = { |
||||
Type = "simple"; |
||||
ExecStart = |
||||
"${cfg.package}/bin/swayidle -w ${concatStringsSep " " args}"; |
||||
}; |
||||
|
||||
Install = { WantedBy = [ "sway-session.target" ]; }; |
||||
}; |
||||
}; |
||||
} |
@ -0,0 +1,52 @@ |
||||
{ config, pkgs, lib, ... }: |
||||
|
||||
{ |
||||
config = { |
||||
services.swayidle = { |
||||
enable = true; |
||||
package = config.lib.test.mkStubPackage { }; |
||||
timeouts = [ |
||||
{ |
||||
timeout = 50; |
||||
command = ''notify-send -t 10000 -- "Screen lock in 10 seconds"''; |
||||
} |
||||
{ |
||||
timeout = 60; |
||||
command = "swaylock -fF"; |
||||
} |
||||
{ |
||||
timeout = 300; |
||||
command = ''swaymsg "output * dpms off"''; |
||||
resumeCommand = ''swaymsg "output * dpms on"''; |
||||
} |
||||
]; |
||||
events = [ |
||||
{ |
||||
event = "before-sleep"; |
||||
command = "swaylock -fF"; |
||||
} |
||||
{ |
||||
event = "lock"; |
||||
command = "swaylock -fF"; |
||||
} |
||||
]; |
||||
}; |
||||
|
||||
nmt.script = let |
||||
escapeForRegex = builtins.replaceStrings [ "'" "*" ] [ "'\\''" "\\*" ]; |
||||
expectedArgs = escapeForRegex (lib.concatStringsSep " " [ |
||||
"-w" |
||||
"timeout 50 'notify-send -t 10000 -- \"Screen lock in 10 seconds\"'" |
||||
"timeout 60 'swaylock -fF'" |
||||
"timeout 300 'swaymsg \"output * dpms off\"' resume 'swaymsg \"output * dpms on\"'" |
||||
"before-sleep 'swaylock -fF'" |
||||
"lock 'swaylock -fF'" |
||||
]); |
||||
in '' |
||||
serviceFile=home-files/.config/systemd/user/swayidle.service |
||||
|
||||
assertFileExists $serviceFile |
||||
assertFileRegex $serviceFile 'ExecStart=.*/bin/swayidle ${expectedArgs}' |
||||
''; |
||||
}; |
||||
} |
@ -0,0 +1 @@ |
||||
{ swayidle-basic-configuration = ./basic-configuration.nix; } |
Loading…
Reference in new issue