summaryrefslogtreecommitdiffstats
path: root/modules/lid-handler.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/lid-handler.nix')
-rw-r--r--modules/lid-handler.nix57
1 files changed, 57 insertions, 0 deletions
diff --git a/modules/lid-handler.nix b/modules/lid-handler.nix
new file mode 100644
index 0000000..d89aced
--- /dev/null
+++ b/modules/lid-handler.nix
@@ -0,0 +1,57 @@
+{ config, lib, pkgs, ... }: {
+ options = {
+ hrm.lid-handler.enable = lib.mkEnableOption "hrm.lid-handler";
+ };
+ config = let
+ cfg = config.hrm.lid-handler;
+ 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";
+ };
+}