Script para procurar a (s) janela (s) possível (s) do dado pid, depois mostrar, minimizar ou fechá-lo
Como você mencionou a linha de comando, o script abaixo é executado em uma janela de terminal. Você o executa com o pid
como argumento, por exemplo:
python3 /path/to/script.py 1234
Posteriormente, uma janela (lista) aparece, da qual você pode escolher um número (lista-) e digitar uma opção para executar nele:
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
Se não houver janelas:
There are no windows for pid 1234
O script
#!/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)
Como usar
-
O script usa
xdotool
ewmctrl
:sudo apt-get install wmctrl xdotool
-
Copie o script em um arquivo vazio, salve-o como
get_wlist.py
-
Execute-o com o comando:
python3 /path/to/get_wlist.py <pid>
Explicação sobre o procedimento
Sobre xdotool e wmctrl :
Para manipular, mover ou fechar janelas, existem duas ferramentas importantes no Linux: xdotool
e wmctrl
. Destes dois, xdotool
é provavelmente o mais robusto, o que eu prefiro em geral. Embora as opções de ambas as ferramentas se sobreponham, elas se completam e, para criar uma janela list , precisamos apenas de wmctrl
.
Na maioria dos casos, portanto, acabo usando uma mistura de ambas as ferramentas.
O que o script faz:
-
O script obtém a lista de janelas abertas no momento, usando o comando:
wmctrl -lp
O que nos dá informações sobre o id da janela e o pid ao qual ele pertence, com uma saída, parecida com:
0x05a03ecc 0 2189 jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
-
O script então filtra as janelas, pertencentes ao pid correspondente, procura o nome da janela com o comando
xdotool
:xdotool getwindowname <window_id>
e exibe as janelas encontradas por nome . Sob o capô, essas janelas são numeradas .
-
posteriormente, se o usuário digitar um número + uma opção, a ação correspondente será executada na janela escolhida:
wmctrl -ic <window_id>
para fechar a janela normalmente ou
xdotool windowminimize <window_id>
para minimizar a janela escolhida ou
wmctrl -ia <window_id>
para levantar a janela.