summaryrefslogtreecommitdiff
path: root/home/wayland/modules/sway/swayidle.nix
blob: d9ff4732a71ddb2b542e902b7356c99853455c59 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
{
  config,
  lib,
  pkgs,
  ...
}:
let
  swaylock = lib.getExe config.programs.swaylock.package;
  brightnessctl = lib.getExe pkgs.brightnessctl;
  swaymsg = "${pkgs.sway}/bin/swaymsg";

  minute = 60; # seconds
  suspend_timeout = minute * 60;
  suspend_on_battery = pkgs.writeShellApplication {
    name = "suspend_on_battery";
    runtimeInputs = with pkgs; [
      gnugrep
      systemd
      sudo
      coreutils
    ];
    text =
      let
        sudo = "/run/wrappers/bin/sudo";
      in
      ''
              is_discharging() {
        	  grep -qFx \
        	      'POWER_SUPPLY_STATUS=Discharging' \
        	      /sys/class/power_supply/*/uevent
              }

              was_charging=false
              while true; do
        	  if is_discharging; then
        	      if [ $was_charging = true ]; then
        		  sleep ${builtins.toString suspend_timeout}
        	      fi

        	      if is_discharging; then
        		  ${sudo} systemctl suspend-then-hibernate
        	      fi
        	  fi

        	  was_charging=true
        	  sleep 10
              done
      '';
  };
in
{
  systemd.user.services.suspend_on_battery = {
    Unit.Description = "Suspend on battery";
    Service.ExecStart = lib.getExe suspend_on_battery;
  };

  services.swayidle = {
    enable = true;
    systemdTarget = "sway-session.target";

    events = [
      {
        event = "before-sleep";
        command = swaylock;
      }
    ];

    timeouts = [
      {
        timeout = minute * 30;
        command = "${brightnessctl} --save; " + "${brightnessctl} set 10%-";
        resumeCommand = "${brightnessctl} --restore";
      }

      {
        timeout = minute * 31;
        command = swaylock;
      }

      {
        timeout = minute * 32;
        command =
          "${swaymsg} --type command 'output * dpms off'; "
          + "${brightnessctl} -c leds -d platform::kbd_backlight --save; "
          + "${brightnessctl} -c leds -d platform::kbd_backlight set 0";
        resumeCommand =
          "${brightnessctl} -c leds -d platform::kbd_backlight --restore; "
          + "${swaymsg} --type command 'output * dpms on'";
      }

      {
        timeout = suspend_timeout;
        command = "${pkgs.systemd}/bin/systemctl --user start suspend_on_battery";
        resumeCommand = "${pkgs.systemd}/bin/systemctl --user stop suspend_on_battery";
      }
    ];
  };
}