summaryrefslogtreecommitdiffstats
path: root/modules/lidControl.nix
blob: b9297c94a6a7b0a672277e3f08a04da8a5851f68 (plain)
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
{ config, lib, pkgs, ... }: {
  options = {
    tv.lidControl.enable = lib.mkEnableOption "tv.lidControl";
  };
  config = let
    cfg = config.tv.lidControl;
  in lib.mkIf cfg.enable {
    services.acpid.enable = true;
    services.acpid.lidEventCommands = /* sh */ ''
      lid_state=$(${pkgs.gawk}/bin/awk '{print$2}' /proc/acpi/button/lid/*/state)

      # usage: vt_is_xserver NUMBER
      vt_is_xserver() {
        ${pkgs.iproute2}/bin/ss -lp src unix:/tmp/.X11-unix/X* |
        ${pkgs.gnused}/bin/sed -n 's|.*/tmp/.X11-unix/X\([0-9]\+\)\>.*|\1|p' |
        ${pkgs.gnugrep}/bin/grep -Fqx "$1"
      }

      console=$(${pkgs.kbd}/bin/fgconsole)

      if vt_is_xserver "$console"; then
        # usage: run_on_display COMMAND [ARG...]
        run_on_display() {
          owner=$(${pkgs.coreutils}/bin/stat -c %u /tmp/.X11-unix/X$console)
          ${pkgs.systemd}/bin/systemd-run -GPq \
              -E DISPLAY=:$console \
              --uid=$owner \
              "$@"
        }
        case $lid_state in
          open)
            run_on_display ${pkgs.xorg.xset}/bin/xset dpms force on
            ;;
          closed)
            run_on_display ${pkgs.xorg.xset}/bin/xset dpms force off
            ;;
        esac
      else
        case $lid_state in
          open)
            ${pkgs.brightnessctl}/bin/brightnessctl --restore >/dev/null 2>&1
            ;;
          closed)
            brightness=$(${pkgs.brightnessctl}/bin/brightnessctl --quiet get)
            if test "$brightness" -gt 0; then
              ${pkgs.brightnessctl}/bin/brightnessctl --save >/dev/null 2>&1
              ${pkgs.brightnessctl}/bin/brightnessctl --quiet set 0
            fi
            ;;
        esac
      fi
    '';
    services.logind.settings.Login.HandleLidSwitch = "ignore";
    services.logind.settings.Login.HandleLidSwitchDocked = "ignore";
    services.logind.settings.Login.HandleLidSwitchExternalPower = "ignore";
  };
}