如何在一段時間不活動後執行由鍵盤和滑鼠活動以及全螢幕視窗觸發的命令?

如何在一段時間不活動後執行由鍵盤和滑鼠活動以及全螢幕視窗觸發的命令?

我的機器在 5 分鐘不活動後掛起,但我想在 4 分 30 秒不活動後執行命令。有沒有辦法在 4 分 30 秒後執行指令全螢幕視窗並且沒有鍵盤和滑鼠活動?

我正在運行 Ubuntu GNOME 15.10 和 GNOME 3.18。我已經看過了這個問題。但是,xprintidle不是由全螢幕視窗觸發,而是由鍵盤和滑鼠活動觸發。

答案1

空閒時間後運行命令,由全螢幕觸發滑鼠/鍵盤活動

您好,Paranoid Panda,下面的腳本應該按照您的描述進行。

問題是,(任何)視窗全螢幕以及滑鼠或鍵盤活動都應該重置「真實」空閒時間。由於xprintidle無法從命令列重置,我透過在全螢幕視窗時減去自身的空閒時間來解決它:

  • 在循環中,腳本查找當前空閒時間
  • xrandr如果任何視窗最大化(使用和 來檢查任何視窗是否與螢幕解析度一樣大wmctrl -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"
    

    哪個完成了這項工作:)

筆記

每當經過空閒時間時,該命令就會執行一次。

相關內容