6 votes

Automatiquement réduire le programme après X temps sans mise au point?

Y a-t-il un moyen de minimiser automatiquement un programme après qu'il n'a pas eu le focus pendant un certain temps?

9voto

Jacob Vlijm Points 78990

Ca fonctionne parfaitement, exactement comme vous le décrivez.

1. Script pour minimiser les fenêtres après x temps sans focus

Le script de fond ci-dessous minimisera les fenêtres après un temps arbitraire sans focus.

Le script

#!/usr/bin/env python3
import subprocess
import sys
import time

def getwindowlist():
    # obtenir la liste des fenêtres
    try:
        return [
            l.split()[0] for l in \
            subprocess.check_output(["wmctrl", "-l"]).decode("utf-8")\
            .splitlines()
            ]
    except subprocess.CalledProcessError:
        pass

def getactive():
    # obtenir la fenêtre active, convertir en hexadécimal pour compatibilité avec wmctrl
    wid = str(hex(int(
        subprocess.check_output(["xdotool", "getactivewindow"])\
        .decode("utf-8"))))
    return wid[:2]+str((10-len(wid))*"0")+wid[2:]

# arrondir à la baisse sur 2 secondes (la correspondance doit être exacte)
minitime = (int(sys.argv[1])/2)*2

wlist1 = []
timerlist = []

while True:
    time.sleep(2)
    wlist2 = getwindowlist()
    if wlist2:
        # nettoyer la liste de fenêtres précédente; enlever les fenêtres qui n'existent pas
        try:
            timerlist = [
                wcount for wcount in timerlist if wcount[0] in wlist2
                ]
        except IndexError:
            pass
        for w in wlist2:
            # ajouter de nouvelles fenêtres, mettre le compte à zéro
            if not w in wlist1:
                timerlist.append([w, 0])
        # ajouter deux pour compter
        for item in timerlist:
            item[1] += 2
        active = getactive()
        for w in timerlist:
            # minimiser les fenêtres qui atteignent le seuil
            if w[1] == minitime:
                subprocess.Popen(["xdotool", "windowminimize", w[0]])
            # mettre le compte de la fenêtre active à zéro
            w[1] = 0 if w[0] == active else w[1]
        wlist1 = wlist2

Comment utiliser

  1. Le script a besoin à la fois de wmctrl et de xdotool:

    sudo apt-get install wmctrl xdotool
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom de minimize_timer.py

  3. Testez-le en exécutant avec le temps requis, en secondes (avant de minimiser), comme argument, par exemple :

    python3 /chemin/vers/minimize_timer.py 300

    ... pour minimiser les fenêtres après 5 minutes sans focus

  4. Si tout fonctionne correctement, ajoutez-le aux applications au démarrage : Dash > Applications au démarrage > Ajouter. Ajoutez la commande :

    /bin/bash -c "sleep 15 && python3 /chemin/vers/minimize_timer.py 300"

Notes

  • En exécutant le script, je n'ai remarqué aucune charge supplémentaire sur le processeur.
  • Le script "arrondit" le temps sur deux secondes. Si une fenêtre est en focus par exemple pendant seulement 0,5 seconde, elle peut ne pas être remarquée comme étant "focus".

Explication

  • Le script garde une trace de toutes les fenêtres ouvertes. Une fois toutes les deux secondes, le script ajoute deux secondes au "compte" des fenêtres, sauf si la fenêtre est en focus.
  • Si la fenêtre est en focus, son compte est mis à 0
  • Si le compte atteint un certain seuil, défini dans l'argument, la fenêtre est minimisée par xdotool avec windowminimize.

Si une fenêtre n'existe plus, elle est supprimée de la liste des enregistrements.


2. Version spécifique à l'application

La version ci-dessous minimisera toutes les fenêtres d'une application arbitraire après x secondes.

Le script

#!/usr/bin/env python3
import subprocess
import sys
import time

# --- définir l'application ci-dessous
app = "gedit"
# ---

minitime = (int(sys.argv[1])/2)*2

def get(cmd):
    # fonction d'aide
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

t = 0

while True:
    time.sleep(2)
    # d'abord vérifier si l'application est en cours d'exécution (économise du carburant si ce n'est pas le cas)
    pid = get(["pgrep", app])
    if pid:
        # si l'application est en cours d'exécution, rechercher ses fenêtres
        windows = get(["xdotool", "search", "--all", "--pid", pid]).splitlines()
        if windows:
            # ...et voir si l'une de ses fenêtres est en focus
            if get(["xdotool", "getactivewindow"]) in windows:
                # si c'est le cas, le compteur est défini sur 0
                t = 0
            else:
                # sinon, le compteur ajoute 2
                t += 2
        if t == minitime:
            # si le compteur atteint le seuil, minimiser les fenêtres de l'application
            for w in windows:
                subprocess.Popen(["xdotool", "windowminimize", w])
    else:
        t = 0

Comment utiliser

  1. Le script a besoin de xdotool:

    sudo apt-get install xdotool
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom de minimize_timer.py

  3. Dans la section d'en-tête, définissez l'application à minimiser

  4. Testez-le en exécutant avec le temps requis, en secondes (avant de minimiser), comme argument, par exemple :

    python3 /chemin/vers/minimize_timer.py 300

    ... pour minimiser les fenêtres après 5 minutes sans focus

  5. Si tout fonctionne correctement, ajoutez-le aux applications au démarrage : Dash > Applications au démarrage > Ajouter. Ajoutez la commande :

    /bin/bash -c "sleep 15 && python3 /chemin/vers/minimize_timer.py 300"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X