Est-il possible, via un script Shell ou une commande de terminal, en supposant que vous ayez le PID, de déterminer s'il a une fenêtre principale (formulaire), puis d'obtenir des informations à ce sujet (titre) et de l'afficher/le masquer/le fermer?
Puisque vous mentionnez la ligne de commande, le script ci-dessous s'exécute dans une fenêtre de terminal. Vous l’exécutez avec la variable pid
comme argument, par exemple:
python3 /path/to/script.py 1234
Ensuite, une fenêtre (liste) apparaît, dans laquelle vous pouvez choisir un numéro (liste) et taper une option à exécuter:
Current Windows for pid 2189:
------------------------------------------------------------
[1] Niet-opgeslagen document 1 - gedit
[2] testbackup.py (~/Bureaublad) - gedit
------------------------------------------------------------
Type window number + option:
-k [kill (gracfully)]
-m [minimize]
-s [show]
Press <Enter> to cancel
------------------------------------------------------------
1 -k
S'il n'y a pas de fenêtres:
There are no windows for pid 1234
#!/usr/bin/env python3
import subprocess
import sys
pid = sys.argv[1]
message = """
------------------------------------------------------------
Type window number + option:
-k [kill (gracfully)]
-m [minimize]
-s s[how]
<Enter> to cancel
------------------------------------------------------------
"""
# just a helper function
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
# get the window list
wlist = [l.split()[0] for l in get(["wmctrl", "-lp"]).splitlines() if pid in l]
# create a indexed list of window name, id
wdata = [[i+1, get(["xdotool", "getwindowname", w_id]), w_id] \
for i, w_id in enumerate(wlist)]
# if the list is not empty (windows exist)
if wdata:
# print the window list
print("\nCurrent Windows for pid "+pid+":\n"+"-"*60)
for item in wdata:
print("["+str(item[0])+"]", item[1])
# ask for user input (see "message" at the top)
action = input(message)
action = action.split()
# run the chosen action
try:
subj = [item[2] for item in wdata if item[0] == int(action[0])][0]
options = ["-k", "-m", "-s"]; option = options.index(action[1])
command = [
["wmctrl", "-ic", subj],
["xdotool", "windowminimize", subj],
["wmctrl", "-ia", subj],
][option]
subprocess.Popen(command)
except (IndexError, ValueError):
pass
else:
print("There are no windows for pid", pid)
Le script utilise à la fois xdotool
et wmctrl
:
Sudo apt-get install wmctrl xdotool
Copiez le script dans un fichier vide, enregistrez-le sous le nom get_wlist.py
Exécutez-le avec la commande:
python3 /path/to/get_wlist.py <pid>
À propos de xdotool et wmctrl :
Pour manipuler, déplacer ou fermer des fenêtres, il existe deux outils importants sous Linux: xdotool
et wmctrl
. Parmi ces deux, xdotool
est probablement le plus robuste, ce que je préfère en général. Bien que les options des deux outils se chevauchent, elles se complètent cependant et pour créer une liste de fenêtres , nous avons simplement besoin de wmctrl
.
Par conséquent, dans la plupart des cas, je finis par utiliser un mélange des deux outils.
Que fait le script:
Le script obtient la liste de fenêtres actuellement ouverte à l'aide de la commande suivante:
wmctrl -lp
Ce qui nous donne des informations à la fois sur l'id de la fenêtre et sur le pid auquel elle appartient, avec une sortie ressemblant à:
0x05a03ecc 0 2189 jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
Le script filtre ensuite les fenêtres, appartenant au pid correspondant, recherche le nom de la fenêtre avec la commande xdotool
:
xdotool getwindowname <window_id>
et affiche les fenêtres trouvées par nom . Sous le capot, ces fenêtres sont numérotées .
ensuite, si l'utilisateur tape un nombre + une option, l'action correspondante est effectuée sur la fenêtre choisie:
wmctrl -ic <window_id>
fermer la fenêtre gracieusement, ou
xdotool windowminimize <window_id>
pour minimiser la fenêtre choisie, ou
wmctrl -ia <window_id>
lever la fenêtre.