diff --git a/scripts/default.nix b/scripts/default.nix index 01ce2b8..799403e 100644 --- a/scripts/default.nix +++ b/scripts/default.nix @@ -128,7 +128,12 @@ auto_connect_gamepad = [ bluez coreutils - gnugrep + final.gnugrep + ]; + powerplay-led-idle = [ + final.bash + libinput + libratbag ]; } // lib.mapAttrs import_script { diff --git a/scripts/powerplay-led-idle b/scripts/powerplay-led-idle new file mode 100755 index 0000000..a99905e --- /dev/null +++ b/scripts/powerplay-led-idle @@ -0,0 +1,79 @@ +#!/usr/bin/env bash + +set -e + +# Constants +SECONDS_UNTIL_FADE=$(( 1 * 60)) +SECONDS_UNTIL_OFF=$(( 5 * 60)) + +COLOR_ON=ff0000 +COLOR_FADE=880000 +COLOR_OFF=000000 + +# Logging + +if [[ "$1" = "debug" ]]; then + echo "Running with debugging" >&2 + DEBUG="true" + + SECONDS_UNTIL_FADE=$(( 3 )) + SECONDS_UNTIL_OFF=$(( 5 )) +fi + +log() { + if [[ "$DEBUG" = "true" ]]; then + echo "$@" >&2 + fi +} + +# Implementation + +main() { + CURRENT_STATE="UNKNOWN" + LAST_POINTER_MOTION="$(date +%s)" + + if [ "$(ratbagctl list | wc -l)" -ne 1 ]; then + echo "Not exactly one device found, exiting..." + exit 1 + fi + + DEVICE="$(ratbagctl list | cut -d: -f1)" + + while true; do + while read line; do + LAST_POINTER_MOTION="$(date +%s)" + break + done < <( + timeout 5s \ + libinput debug-events \ + | grep POINTER_MOTION + ) + TIME_SINCE_LAST=$(( "$(date +%s)" - "$LAST_POINTER_MOTION" )) + log "Last pointer motion was $TIME_SINCE_LAST seconds ago" + if [ "$TIME_SINCE_LAST" -gt "$SECONDS_UNTIL_OFF" ]; then + setState OFF "$COLOR_OFF" + elif [ "$TIME_SINCE_LAST" -gt "$SECONDS_UNTIL_FADE" ]; then + setState FADE "$COLOR_FADE" + else + setState ON "$COLOR_ON" + fi + done +} + +setState() { + STATE="$1" + COLOR="$2" + MODE="$3" + + if [[ "$STATE" = "$CURRENT_STATE" ]]; then + log "Already in $STATE state" + return + fi + log "Changing state to $STATE" + CURRENT_STATE="$STATE" + + ratbagctl "$DEVICE" led 0 set mode on + ratbagctl "$DEVICE" led 0 set color "$COLOR" +} + +main diff --git a/user/sway/default.nix b/user/sway/default.nix index a8ed460..af61969 100644 --- a/user/sway/default.nix +++ b/user/sway/default.nix @@ -23,6 +23,7 @@ in ./swayidle.nix ./swaylock.nix ./theme.nix + ./powerplay-led-idle.nix ]; config = lib.mkIf (config.my.desktop == "sway") { services.mako.enable = true; diff --git a/user/sway/powerplay-led-idle.nix b/user/sway/powerplay-led-idle.nix new file mode 100644 index 0000000..a6aa3e0 --- /dev/null +++ b/user/sway/powerplay-led-idle.nix @@ -0,0 +1,17 @@ +{ pkgs, lib, ... }: +{ + systemd.user.services.powerplay-led-idle = { + Unit = { + Description = "Autosuspend Powerplay mousepad led"; + PartOf = [ "graphical-session.target" ]; + After = [ "graphical-session.target" ]; + }; + Service = { + ExecStart = lib.getExe pkgs.powerplay-led-idle; + Restart = "on-failure"; + }; + Install = { + WantedBy = [ "sway-session.target" ]; + }; + }; +}