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
Jos van Bakel 3 years ago committed by GitHub
parent 8e7a10602d
commit 65e5b835a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      .github/CODEOWNERS
  2. 8
      modules/misc/news.nix
  3. 1
      modules/modules.nix
  4. 118
      modules/services/swayidle.nix
  5. 1
      tests/default.nix
  6. 52
      tests/modules/services/swayidle/basic-configuration.nix
  7. 1
      tests/modules/services/swayidle/default.nix

@ -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

@ -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

@ -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…
Cancel
Save