web-dev-qa-db-fra.com

Comment exécuter une commande après une certaine période d'inactivité, déclenchée par l'activité du clavier et de la souris et la fenêtre plein écran?

Ma machine s'interrompt après 5 minutes d'inactivité, mais je souhaite également exécuter une commande après 4 minutes et 30 secondes d'inactivité. Existe-t-il un moyen d'exécuter une commande après 4 minutes et 30 secondes de aucune fenêtre plein écran et aucune activité clavier et souris?

J'utilise Ubuntu GNOME 15.10 avec GNOME 3.18. J'ai déjà regardé cette question . Cependant, xprintidle n'est pas déclenché par une fenêtre plein écran, uniquement par l'activité du clavier et de la souris.

1
user364819

Exécution d'une commande après une période d'inactivité, déclenchée par le plein écran et activité souris/clavier

Salut Paranoid Panda, le script ci-dessous devrait faire ce que vous décrivez.

Le problème était que les deux ayant une (toute) fenêtre plein écran, ainsi que des activités de souris ou de clavier devraient réinitialiser le temps d'inactivité "réel". Comme xprintidle ne peut pas être réinitialisé à partir de la ligne de commande, je l'ai résolu en soustrayant le temps d'inactivité de lui-même à l'occasion d'une fenêtre plein écran:

  • En boucle, les scripts recherchent le temps d'inactivité actuel
  • si une fenêtre est agrandie (vérifier si une fenêtre est aussi grande que la résolution de l'écran, en utilisant à la fois xrandr et wmctrl -lG), le courant temps d'inactivité est soustrait du temps d'inactivité, résultant en un temps d'inactivité "réel" correct, même lorsque la fenêtre n'est plus en plein écran.

Le 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

Utiliser

  • le script a besoin de wmctrl et xprintidle:

    Sudo apt-get install xdotool xprintidle
    
  • Copiez le script dans un fichier vide, enregistrez-le sous run_ontime.py

  • Exécutez-le par la commande:

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

    où la commande doit être entre guillemets si elle contient des espaces. Je l'ai testé par exemple avec:

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

    qui a fait le boulot :)

Remarque

La commande est exécutée une fois à chaque fois que le temps passe au repos.

0
Jacob Vlijm