Mover todas as janelas de uma classe de janela específica para uma tela específica por nome (tela)
O script abaixo enviará janelas, pertencentes a um WM_CLASS
(aplicativo) específico, para uma tela específica, pelo nome da tela. Como isso é feito é explicado no script e também abaixo.
O script pressupõe que as telas estão organizadas horizontalmente e mais ou menos alinhadas na parte superior (com uma diferença de < 100 PX).
O script
#!/usr/bin/env python3
import subprocess
import sys
# just a helper function, to reduce the amount of code
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8")
# get the data on all currently connected screens, their x-resolution
screendata = [l.split() for l in get(["xrandr"]).splitlines() if " connected" in l]
screendata = sum([[(w[0], s.split("+")[-2]) for s in w if s.count("+") == 2] for w in screendata], [])
def get_class(classname):
# function to get all windows that belong to a specific window class (application)
w_list = [l.split()[0] for l in get(["wmctrl", "-l"]).splitlines()]
return [w for w in w_list if classname in get(["xprop", "-id", w])]
scr = sys.argv[2]
try:
# determine the left position of the targeted screen (x)
pos = [sc for sc in screendata if sc[0] == scr][0]
except IndexError:
# warning if the screen's name is incorrect (does not exist)
print(scr, "does not exist. Check the screen name")
else:
for w in get_class(sys.argv[1]):
# first move and resize the window, to make sure it fits completely inside the targeted screen
# else the next command will fail...
subprocess.Popen(["wmctrl", "-ir", w, "-e", "0,"+str(int(pos[1])+100)+",100,300,300"])
# maximize the window on its new screen
subprocess.Popen(["xdotool", "windowsize", "-sync", w, "100%", "100%"])
Como usar
-
O script precisa dos dois
wmctrl
exdotool
:sudo apt-get install xdotool wmctrl
-
Copie o script abaixo em um arquivo vazio, salve-o como
move_wclass.py
-
Execute-o pelo comando:
python3 /path/to/move_wclass.py <WM_CLASS> <targeted_screen>
por exemplo:
python3 /path/to/move_wclass.py gnome-terminal VGA-1
Para o WM_CLASS
, você pode usar parte do WM_CLASS
, como no exemplo. O nome da tela precisa ser o exato e o nome completo.
Como é feito (o conceito)
A explicação é principalmente sobre o conceito, não tanto sobre a codificação.
Na saída do xrandr, para cada tela conectada, há uma string / linha, parecida com:
VGA-1 connected 1280x1024+1680+0
Esta linha nos fornece informações sobre a posição da tela e seu nome , conforme explicado aqui .
O script lista as informações para todas as telas. Quando o script é executado com a tela e a classe da janela como argumentos, ele procura a posição (x-) da tela, procura todas as janelas (-id's) de uma determinada classe (com a ajuda de wmctrl -l
e saída de xprop -id <window_id>
.
Posteriormente, o script move todas as janelas, uma por uma, para uma posição na tela de destino (usando wmctrl -ir <window_id> -e 0,<x>,<y>,<width>,<height>
) e maximiza-a (com xdotool windowsize 100% 100%
).
Nota
O script funcionou bem nos testes que eu executei. Usar wmctrl
, e até xdotool
, em Unity pode ter algumas peculiaridades teimosas, no entanto, que às vezes precisam ser resolvidas pelo experimento, e não pelo raciocínio. Se você pode se deparar com exceções, por favor mencione.