diff options
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/dpmsmouse | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/bin/dpmsmouse b/bin/dpmsmouse new file mode 100755 index 0000000..a9ebf09 --- /dev/null +++ b/bin/dpmsmouse @@ -0,0 +1,154 @@ +#!/bin/sh + +set -eu + +DEFAULT_POLL_TIME=5 + +debug=0 + +err() +{ + local fmt="${1}" + shift 1 + + printf "Error: ${fmt}\n" "${@}" 1>&2 + return 0 +} + +dbg() +{ + local fmt="${1}" + shift 1 + + case "${debug}" in '1') + printf "DEBUG: ${fmt}\n" "${@}" 1>&2 + esac + + return 0 +} + +enable_devices() +{ + local device= + + dbg 'Enabling devices:' + for device in "${@}"; do + dbg ' %s' "${device}" + xinput --enable "${device}" + done +} + +disable_devices() +{ + local device= + + dbg 'Disabling devices:' + for device in "${@}"; do + dbg ' %s' "${device}" + xinput --disable "${device}" + done +} + +poll() +{ + local poll_time=${1} + shift 1 + local displays= + local prev_state= + local displays_on= + local displays_off= + local display= + local status= + local dpms= + local state= + + displays="$(printf '%s ' \ + /sys/devices/pci????:??/????:??:??.?/drm/card*/card*-*/ \ + /sys/devices/pci????:??/????:??:??.?/????:??:??.?/drm/card*/card*-*/)" + + prev_state='' + while :; do + displays_on=0 + displays_off=0 + for display in ${displays}; do + [ -f "${display}/status" ] || continue + read status 0<"${display}/status" + case "${status}" in 'disconnected') + continue + esac + read dpms 0<"${display}/dpms" + case "${dpms}" in + 'On') displays_on=1;; + 'Off') displays_off=1;; + esac + done + + state='enable_devices' + case ${displays_on} in 0) + case ${displays_off} in 1) + state='disable_devices' + esac + esac + + case "${state}" in + "${prev_state}");; + *) + "${state}" "${@}" + prev_state="${state}" + ;; + esac + + sleep ${poll_time} + done +} + +usage() +{ + printf 'Usage: %s [<options>] <device> [<device> ...]\n' "${0}" + printf '\n' + printf 'Options:\n' + printf ' -p <secs> Poll at least every <secs> seconds\n' + printf ' -d Enable debugging output\n' +} + +main() +{ + local move_win= + local opt= + local dir= + local dx= + local dy= + local cur_dt= + local new_dt= + + poll_time=${DEFAULT_POLL_TIME} + + while getopts 'p:d' opt "${@}"; do + case "${opt}" in + 'p') + case "${OPTARG}" in *[!0-9]* | '') + usage 1>&2 + return 1 + esac + poll_time="${OPTARG}" + ;; + 'd') debug=1;; + '?') + usage 1>&2 + return 1 + ;; + esac + done + shift $((${OPTIND} - 1)) + + if [ ${#} -lt 1 ]; then + usage 1>&2 + return 1 + fi + + poll ${poll_time} "${@}" + + return 0 +} + +main "${@}" |