Como executar um comando após um certo período de inatividade, acionado por atividade de teclado e mouse e pela tela inteira?

1

Minha máquina suspende após 5 minutos de inatividade, no entanto, quero executar um comando após 4 minutos e 30 segundos de inatividade. Existe uma maneira de executar um comando após 4 minutos e 30 segundos de não janela de tela cheia e sem atividade de teclado e mouse?

Estou executando o Ubuntu GNOME 15.10 com o GNOME 3.18. Eu já examinei esta questão . No entanto, xprintidle não é acionado por uma janela de tela cheia, apenas pela atividade de teclado e mouse.

    
por Jacob Vlijm 09.12.2015 / 18:20

1 resposta

0

Execução de um comando após o tempo ocioso, acionado por tela inteira e atividade de mouse / teclado

Oi Paranoid Panda, o script abaixo deve fazer o que você descreve.

A questão era que ambos ter uma tela cheia em qualquer janela, bem como atividades de mouse ou teclado devem redefinir o tempo ocioso "real". Como xprintidle não pode ser redefinido a partir da linha de comando, resolvi subtraindo o tempo ocioso de si mesmo por ocasião de uma janela de tela cheia:

  • Em um loop, os scripts pesquisam o tempo ocioso atual
  • se qualquer janela estiver maximizada (verificando se alguma janela é tão grande quanto a resolução da tela, usando xrandr e wmctrl -lG ), o tempo ocioso atual é subtraído do tempo ocioso, resultando em um tempo ocioso "real" correto, mesmo quando a janela não está mais cheia.

O script

#!/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

Para usar

  • o script precisa de wmctrl e xprintidle :

    sudo apt-get install xdotool xprintidle
    
  • Copie o script em um arquivo vazio, salve-o como run_ontime.py

  • Execute-o pelo comando:

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

    onde o comando precisa estar entre aspas se contiver espaços. Eu testei por exemplo com:

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

    qual fez o trabalho:)

Nota

O comando é executado uma vez a cada vez que o tempo passa no tempo ocioso.

    
por Jacob Vlijm 09.12.2015 / 23:19