如何在使用 gnome 42.9 的 ubuntu 22.04 上不使用 d-bus 监视用户不活动状态

如何在使用 gnome 42.9 的 ubuntu 22.04 上不使用 d-bus 监视用户不活动状态

如何在不使用 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

因此理想情况下我希望尽可能少地使用外部库。

在此先感谢您的帮助。

相关内容