如何在不使用 d-bus 的情况下通过键盘或鼠标监控用户不活动状态,并使用 gnome 42.9 在 ubuntu 22.04 上全屏或小屏幕跟踪任何视频
我已经有了一个使用 dbus 的解决方案,但是自从最新更新以来它变得不可靠了。
我正在寻找一个 Python 脚本,它将从系统“屏幕空白”变量中获取时间作为此脚本的输入时间。此外,查看用户是否正在全屏或小屏播放任何视频,并查看来自键盘或鼠标移动的任何用户活动,然后打印“用户已闲置”,如果没有视频正在播放,然后如果有鼠标或键盘活动,则打印“用户已从闲置状态恢复”
问题是我没有连接 PC 显示器,我有一台具有 CEC 功能的电视,因此可以通过脚本打开和关闭电视,但是当出现 dpms 关闭信号时,我的电视只是说没有视频信号,所以我几年前制作了这个脚本,与咖啡因一起使用,它多年来一直运行良好,直到现在,所以我正在寻找更好的解决方案
#!/bin/bash
toggle=0
# Function to handle screen off and set toggle
handle_screen_off() {
if [[ "$toggle" == "0" ]]; then
echo "Screen is off!"
toggle=1
echo off > /home/user/bin/command.txt
fi
}
# Function to handle screen on and reset toggle
handle_screen_on() {
if [[ "$toggle" == "1" ]]; then
echo "Screen is on!"
toggle=0
echo on > /home/user/bin/command.txt
fi
}
# Monitor screen saver state
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) handle_screen_off;;
*"boolean false"*) handle_screen_on;;
esac
done
#dbus-monitor is cmd to see what signal is used
我也发现了这个代码,但是它不处理视频跟踪并且它不是 python。
#!/bin/bash
# Define a function to handle the keyboard interrupt signal
function handle_interrupt {
echo "Loop interrupted. Exiting..."
exit 0
}
# Trap the keyboard interrupt signal and associate it with the handle_interrupt function
trap handle_interrupt SIGINT
# Function to handle setting idle time
function set_idletime() {
if [[ $# -eq 0 ]]; then
# Use default idle time if no argument provided
echo "No idle time provided. Using default of $idletime seconds."
else
new_idle_time="$1"
if [[ ! "$new_idle_time" =~ ^[0-9]+$ ]]; then
echo "Error: Idle time must be a positive integer."
exit 1
fi
echo "Setting idle time to $new_idle_time seconds."
idletime="$new_idle_time"
fi
}
# Set default idle time first
idletime=10 # seconds
# Then call set_idletime to handle potential arguments
set_idletime "$1"
# Optional echo to confirm the idle time being used
echo "Using idle time of $idletime seconds."
idleloop() {
touch /tmp/.{,last_}input
cmd='stat --printf="%s"'
#idletime=10 # seconds
echo "Using idle time of $idletime seconds."
a=2
t=0
while true
do
timeout 1 xinput test-xi2 --root > /tmp/.input
if [[ `eval $cmd /tmp/.input` == `eval $cmd /tmp/.last_input` ]]
then
let t++ # increases $t by 1
else
t=0 # resets $t
fi
mv /tmp/.{,last_}input -f
if [ $t -ge $idletime ] && [[ $a == "2" ]]
then
echo "user has gone idle"
a=1
fi
if [ $t -lt $idletime ] && [[ $a == "1" ]]
then
echo "user has come back from idle"
a=2
fi
done
}
idleloop
因此理想情况下我希望尽可能少地使用外部库。
在此先感谢您的帮助。