mirror of
https://github.com/nix-community/home-manager
synced 2024-12-24 10:49: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
|
/tests/modules/targets-darwin @midchildan
|
||||||
|
|
||||||
Makefile @thiagokokada
|
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'.
|
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/spotifyd.nix
|
||||||
./services/stalonetray.nix
|
./services/stalonetray.nix
|
||||||
./services/status-notifier-watcher.nix
|
./services/status-notifier-watcher.nix
|
||||||
|
./services/swayidle.nix
|
||||||
./services/sxhkd.nix
|
./services/sxhkd.nix
|
||||||
./services/syncthing.nix
|
./services/syncthing.nix
|
||||||
./services/systembus-notify.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/polybar
|
||||||
./modules/services/redshift-gammastep
|
./modules/services/redshift-gammastep
|
||||||
./modules/services/screen-locker
|
./modules/services/screen-locker
|
||||||
|
./modules/services/swayidle
|
||||||
./modules/services/sxhkd
|
./modules/services/sxhkd
|
||||||
./modules/services/syncthing
|
./modules/services/syncthing
|
||||||
./modules/services/trayer
|
./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