¿Cómo ejecutar un comando después de un cierto período de inactividad, provocado por la actividad del teclado y el mouse y la ventana de pantalla completa?

¿Cómo ejecutar un comando después de un cierto período de inactividad, provocado por la actividad del teclado y el mouse y la ventana de pantalla completa?

Mi máquina se suspende después de 5 minutos de inactividad, sin embargo, también quiero ejecutar un comando después de 4 minutos y 30 segundos de inactividad. ¿Hay alguna manera de ejecutar un comando después de 4 minutos y 30 segundos deNo¿Ventana de pantalla completa y sin actividad de teclado y mouse?

Estoy ejecutando Ubuntu GNOME 15.10 con GNOME 3.18. ya he miradoesta pregunta. Sin embargo, xprintidleno se activa con una ventana de pantalla completa, sólo con la actividad del teclado y el mouse.

Respuesta1

Ejecutar un comando después del tiempo de inactividad, activado por ambas pantallas completasyactividad del mouse/teclado

Hola Paranoid Panda, el siguiente script debería funcionar como lo describe.

El problema era que tanto tener una ventana (cualquiera) en pantalla completa, como también las actividades del mouse o del teclado deberían restablecer el tiempo de inactividad "real". Como xprintidleno se puede restablecer desde la línea de comando, lo resolví restándole el tiempo de inactividad con motivo de una ventana de pantalla completa:

  • En un bucle, los scripts buscan el tiempo de inactividad actual.
  • Si alguna ventana está maximizada (verificando si alguna ventana es tan grande como la resolución de la pantalla, usando ambos xrandry wmctrl -lG), elactualEl tiempo de inactividad se resta del tiempo de inactividad, lo que da como resultado un tiempo de inactividad "real" correcto, incluso cuando la ventana ya no está en pantalla completa.

La secuencia de comandos

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

  • el guión necesita wmctrly xprintidle:

    sudo apt-get install xdotool xprintidle
    
  • Copie el script en un archivo vacío, guárdelo comorun_ontime.py

  • Ejecútelo con el comando:

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

    donde el comando debe estar entre comillas si contiene espacios. Lo probé por ejemplo con:

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

    que hizo el trabajo :)

Nota

El comando se ejecuta una vez cada vez que pasa el tiempo de inactividad.

información relacionada