Как выполнить команду после определенного периода неактивности, инициированной клавиатурой и полноэкранным окном и действием мыши?

Моя машина приостанавливает после 5 минут неактивности однако я хочу выполнить команду также после 4 минут и 30 секунд неактивности. Существует ли способ выполнить команду после 4 минут и 30 секунд никакого полноэкранного окна и никакой клавиатуры - и действие мыши?

Я выполняю Ubuntu GNOME 15.10 с GNOME 3.18. Я уже посмотрел на этот вопрос. Однако xprintidle не инициирован полноэкранным окном, только клавиатурой - и действие мыши.

1
задан 10 December 2015 в 11:10

1 ответ

Выполнение команды после времени простоя, инициированного и полным экраном и мышью/действием клавиатуры

Привет Параноидальная 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"
    

    который сделал задание :)

Примечание:

Команда выполняется один раз во время, время передает время простоя.

0
ответ дан 30 September 2019 в 02:03

Другие вопросы по тегам:

Похожие вопросы: