
Minha máquina é suspensa após 5 minutos de inatividade, mas também 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 denãojanela de tela inteira e nenhuma atividade de teclado e mouse?
Estou executando o Ubuntu GNOME 15.10 com GNOME 3.18. eu já olheiessa questão. No entanto, xprintidle
não é acionado por uma janela em tela cheia, apenas pela atividade do teclado e do mouse.
Responder1
Executando um comando após o tempo ocioso, acionado por tela cheiaeatividade do mouse/teclado
Olá Paranoid Panda, o script abaixo deve servir como você descreveu.
O problema era que tanto ter uma (qualquer) janela em tela cheia quanto atividades com mouse ou teclado deveriam redefinir o tempo ocioso "real". Como xprintidle
não pode ser redefinido na linha de comando, resolvi subtraindo o tempo ocioso de si mesmo por ocasião de uma janela em tela cheia:
- Em um loop, os scripts procuram o tempo ocioso atual
- se alguma janela estiver maximizada (verificando se alguma janela é tão grande quanto a resolução da tela, usando ambos
xrandr
ewmctrl -lG
), oatualo tempo ocioso é subtraído do tempo ocioso, resultando em um tempo ocioso "real" correto, mesmo quando a janela não está mais em tela cheia.
O roteiro
#!/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
Usar
o script precisa
wmctrl
exprintidle
:sudo apt-get install xdotool xprintidle
Copie o script em um arquivo vazio e 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"
que fez o trabalho :)
Observação
O comando é executado uma vez sempre que o tempo passa do tempo ocioso.