web-dev-qa-db-fra.com

Réduire automatiquement le programme après X heure sans mise au point?

Existe-t-il un moyen de minimiser automatiquement un programme après qu’il n’ait plus de focus pendant un certain temps?

6
L42

Il fonctionne parfaitement, à peu près exactement comme vous le décrivez.

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

Le script d'arrière-plan ci-dessous minimisera les fenêtres après un temps arbitraire sans focus.

Le scénario

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

def getwindowlist():
    # get windowlist
    try:
        return [
            l.split()[0] for l in \
            subprocess.check_output(["wmctrl", "-l"]).decode("utf-8")\
            .splitlines()
            ]
    except subprocess.CalledProcessError:
        pass

def getactive():
    # get active window, convert to hex for compatibility with wmctrl
    wid = str(hex(int(
        subprocess.check_output(["xdotool", "getactivewindow"])\
        .decode("utf-8"))))
    return wid[:2]+str((10-len(wid))*"0")+wid[2:]

# round down on 2 seconds (match needs to be exact)
minitime = (int(sys.argv[1])/2)*2

wlist1 = []
timerlist = []

while True:
    time.sleep(2)
    wlist2 = getwindowlist()
    if wlist2:
        # clean up previous windowlist; remove non- existent windows
        try:
            timerlist = [
                wcount for wcount in timerlist if wcount[0] in wlist2
                ]
        except IndexError:
            pass
        for w in wlist2:
            # add new windows, zero record
            if not w in wlist1:
                timerlist.append([w, 0])
        # add two to account(s)
        for item in timerlist:
            item[1] += 2
        active = getactive()
        for w in timerlist:
            # minimize windows that reach the threshold
            if w[1] == minitime:
                subprocess.Popen(["xdotool", "windowminimize", w[0]])
            # set acoount of active window to zero
            w[1] = 0 if w[0] == active else w[1]
        wlist1 = wlist2

Comment utiliser

  1. Le script nécessite à la fois wmctrl et xdotool:

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

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

    python3 /path/to/minimize_timer.py 300
    

    ... pour minimiser les fenêtres après 5 minutes sans mise au point

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

    /bin/bash -c "sleep 15 && python3 /path/to/minimize_timer.py 300"
    

Remarques

  • En exécutant le script, je ne pouvais pas remarquer aucun = charge supplémentaire pour le processeur.
  • Le script "arrondit" le temps sur deux secondes. Si une fenêtre a le focus pour par exemple seulement 0,5 seconde, il pourrait ne pas être remarqué comme étant "concentré".

Explication

  • Le script conserve une trace de toutes les fenêtres ouvertes. Une fois toutes les deux secondes, le script ajoute deux secondes au "compte" de la fenêtre, sauf si la fenêtre a le focus.
  • Si la fenêtre a le focus, son compte est défini sur 0
  • Si le compte atteint un certain seuil, défini dans l'argument, la fenêtre est réduite de xdotool '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 scénario

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

# --- set the application below
app = "gedit"
# ---

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

def get(cmd):
    # helper function
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

t = 0

while True:
    time.sleep(2)
    # first check if app is runing at all (saves fuel if not)
    pid = get(["pgrep", app])
    if pid:
        # if app is running, look up its windows
        windows = get(["xdotool", "search", "--all", "--pid", pid]).splitlines()
        if windows:
            # ...and see if one of its windows is focussed
            if get(["xdotool", "getactivewindow"]) in windows:
                # if so, counter is set to 0
                t = 0
            else:
                # if not, counter adds 2
                t += 2
        if t == minitime:
            # if counter equals the threshold, minimize app's windows
            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 minimize_timer.py

  3. Dans la section de tête, configurez l’application pour minimiser
  4. Testez-le avec le temps requis, en secondes (avant de minimiser), comme argument, par exemple:

    python3 /path/to/minimize_timer.py 300
    

    ... pour minimiser les fenêtres après 5 minutes sans mise au point

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

    /bin/bash -c "sleep 15 && python3 /path/to/minimize_timer.py 300"
    
8
Jacob Vlijm