如何在一段时间不活动后执行由键盘和鼠标活动以及全屏窗口触发的命令?

如何在一段时间不活动后执行由键盘和鼠标活动以及全屏窗口触发的命令?

我的机器在 5 分钟不活动后挂起,但是我想在 4 分 30 秒不活动后执行命令。有没有办法在 4 分 30 秒不活动后运行命令全屏窗口且没有键盘和鼠标活动?

我正在运行 Ubuntu GNOME 15.10 和 GNOME 3.18。我已经查看了这个问题。但是,xprintidle不是由全屏窗口触发的,仅由键盘和鼠标活动触发。

答案1

在空闲时间后运行命令,由全屏触发鼠标/键盘活动

你好,Paranoid Panda,下面的脚本应该按照你描述的进行。

问题是,无论是全屏显示(任何)窗口,还是鼠标或键盘活动,都应重置“实际”空闲时间。由于xprintidle无法从命令行重置,因此我通过在全屏显示窗口时从其自身中减去空闲时间来解决此问题:

  • 脚本循环查找当前空闲时间
  • 如果任何窗口最大化(检查是否有任何窗口与屏幕分辨率一样大,使用xrandrwmctrl -lG),则当前的从空闲时间中减去空闲时间,从而得出正确的“真实”空闲时间,即使窗口不再是全屏。

剧本

#!/usr/bin/env python3
import subprocess
import time
import sys

idletime = int(sys.argv[1])
command = sys.argv[2]

get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()

def get_res():
    xr = [s for s in get(["xrandr"]).split() \
          if "+0+0" in s][0].split("x"); xr[1] = xr[1].split("+")[0]
    return xr

res = get_res()

def check():
    front = [l for l in get(["xprop", "-root"]).splitlines() \
             if "_NET_ACTIVE_WINDOW(WINDOW):" in l][0].split("#")[-1].strip()
    front = front[:2]+(10-len(front))*"0"+front[2:]
    try:
        wdata = subprocess.check_output(
            ["wmctrl", "-lG"]
            ).decode("utf-8").splitlines()
        match = [l for l in wdata if front in l][0].split()[4:6]
        if match == res:
            return True
        else:
            return False
    except subprocess.CalledProcessError:
        pass

minus = 0; real_idle = 0; t1 = 0; due_1 = False
while True:
    time.sleep(1)
    fscreen = check()
    t2 = int(int(get(["xprintidle"]))/1000)
    if t2 < t1:
        minus = 0; real_idle = 0
    else:
        if fscreen == True:
            minus = t2
    real_idle = t2 - minus
    due_2 = [real_idle > idletime][0]
    if all([real_idle > idletime, due_1 != due_2]):
        subprocess.Popen(["/bin/bash", "-c", command])
    due_1 = due_2
    t1 = t2

使用

  • 脚本wmctrl需要xprintidle

    sudo apt-get install xdotool xprintidle
    
  • 将脚本复制到一个空文件中,另存为run_ontime.py

  • 通过命令运行:

    python3 /path/to/run_ontime.py <seconds> <command>
    

    如果命令包含空格,则命令需要放在引号中。例如,我使用以下命令进行了测试:

    python3 /path/to/run_ontime.py 10 "firefox askubuntu.com"
    

    完成了任务 :)

笔记

每当时间经过空闲时间时,该命令就会执行一次。

相关内容