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?
Réponse
Trop de publicités?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
-
Le script a besoin à la fois de
wmctrl
et dexdotool
:sudo apt-get install wmctrl xdotool
-
Copiez le script dans un fichier vide, enregistrez-le sous le nom de
minimize_timer.py
-
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
-
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
avecwindowminimize
.
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
-
Le script a besoin de
xdotool
:sudo apt-get install xdotool
-
Copiez le script dans un fichier vide, enregistrez-le sous le nom de
minimize_timer.py
-
Dans la section d'en-tête, définissez l'application à minimiser
-
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
-
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"