mirror of
https://github.com/nix-community/home-manager
synced 2024-12-23 10:19:48 +01:00
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.
This commit is contained in:
parent
8e7a10602d
commit
65e5b835a9
7 changed files with 184 additions and 0 deletions
3
.github/CODEOWNERS
vendored
3
.github/CODEOWNERS
vendored
|
@ -399,3 +399,6 @@
|
|||
/tests/modules/targets-darwin @midchildan
|
||||
|
||||
Makefile @thiagokokada
|
||||
|
||||
/modules/services/swayidle.nix @c0deaddict
|
||||
/tests/modules/services/swayidle @c0deaddict
|
||||
|
|
|
@ -2336,6 +2336,14 @@ in
|
|||
A new module is available: 'xsession.windowManager.herbstluftwm'.
|
||||
'';
|
||||
}
|
||||
|
||||
{
|
||||
time = "2022-01-03T10:34:45+00:00";
|
||||
condition = hostPlatform.isLinux;
|
||||
message = ''
|
||||
A new module is available: 'services.swayidle'.
|
||||
'';
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -218,6 +218,7 @@ let
|
|||
./services/spotifyd.nix
|
||||
./services/stalonetray.nix
|
||||
./services/status-notifier-watcher.nix
|
||||
./services/swayidle.nix
|
||||
./services/sxhkd.nix
|
||||
./services/syncthing.nix
|
||||
./services/systembus-notify.nix
|
||||
|
|
118
modules/services/swayidle.nix
Normal file
118
modules/services/swayidle.nix
Normal file
|
@ -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" ]; };
|
||||
};
|
||||
};
|
||||
}
|
|
@ -146,6 +146,7 @@ import nmt {
|
|||
./modules/services/polybar
|
||||
./modules/services/redshift-gammastep
|
||||
./modules/services/screen-locker
|
||||
./modules/services/swayidle
|
||||
./modules/services/sxhkd
|
||||
./modules/services/syncthing
|
||||
./modules/services/trayer
|
||||
|
|
52
tests/modules/services/swayidle/basic-configuration.nix
Normal file
52
tests/modules/services/swayidle/basic-configuration.nix
Normal file
|
@ -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}'
|
||||
'';
|
||||
};
|
||||
}
|
1
tests/modules/services/swayidle/default.nix
Normal file
1
tests/modules/services/swayidle/default.nix
Normal file
|
@ -0,0 +1 @@
|
|||
{ swayidle-basic-configuration = ./basic-configuration.nix; }
|
Loading…
Reference in a new issue