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