如何挂钩来监视睡眠事件?

如何挂钩来监视睡眠事件?

当显示器设置为睡眠状态时,是否有我可以连接的事件?我指的是显示器 DPMS 睡眠,而不是 PC 睡眠/挂起。

我的目的是当显示器进入睡眠状态但电脑仍处于开启状态时运行一个脚本。

同样,当显示器从睡眠状态恢复时是否会触发事件?

答案1

xset -q将告诉您显示器是打开还是关闭。

通常情况下,它会告诉你“显示器已打开”。但是,如果你关闭显示器然后执行命令,它会告诉你它已关闭。

输入以下命令尝试:

sleep 1; xset dpms force off; sleep 1; xset -q

(这些sleep命令是为了防止 X 混淆事件的顺序)。然后摆动鼠标以返回屏幕。

在脚本中,执行操作将为您提供一个或 的$(xset -q|grep Monitor|awk '{print $3;}')变量。OnOff

X是一个复杂的问题,但在我的系统上它每次都能正常工作。

答案2

我今天正在编写一个 bash 脚本,可能在一周左右的时间内提供更好的答案。与此同时,我发现了这一点reddit 答案使用 bash 脚本你可以使用:

#!/bin/bash
jsdev=${1:-"/dev/input/js0"}
getxss() {
    xset q | grep -e 'timeout\:\|Standby\:' \
        | awk '{a[NR]=$1}END{asort(a);print a[1]}' RS=' '
}
tellit() { notify-send "controller xss holder" "${1:-"date"}: $(date +%T)"; }
fin() { tellit "${1:-"bye"}"; exit; }
trap 'fin "sigint recieved"' INT
slt=$((($(getxss)/5)*4)); [ $slt -lt 1 ] && slt=1; w=60
until [[ -e "$jsdev" || $w -lt 1 ]]; do
    t=$(date +%s); f="$(inotifywait -qq -e create --format '%w%f' -t $w "$(dirname $jsdev)")"
    [ "$f" == "$jsdev" ] && break || t=$(($(date +%s)-$t)) && ((w-=$t))
done; [ $w -lt 1 ] && fin "dev not found" && exit
tellit "connected"; while [ -e "$jsdev" ]; do
    read -rn1< <(jstest --nonblock "$jsdev" 2>/dev/null) \
        && [ -e "$jsdev" ] && xset -display :0 s reset dpms force on
    inotifywait -qq -e delete_self --format '%w%f' -t $slt $jsdev 2>/dev/null
done; fin "disconnected"

相关内容