No limite de postar uma cópia de esta ( mas a questão é um pouco diferente), o script abaixo faz o que você descreve, se você o executa com os argumentos
python3 /path/to/script.py 2 2
No entanto, se houver mais de quatro janelas (ou mais que as células de uma grade, se você usar outros argumentos além de 2 2
), o script colocará apenas as quatro janelas mais antigas na grade.
O que faz
Quando quatro janelas são abertas, colocadas aleatoriamente na tela:
aexecuçãodoscriptosorganizaráemumagrade:
Oscript
#!/usr/bin/env python3
import subprocess
import sys
#--- set your preferences below: padding between windows, margin(s)
cols = int(sys.argv[1]); rows = int(sys.argv[2]); padding = 10; left_margin = 0; top_margin = 30
#---
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_res():
xr = get("xrandr").split(); pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
def check_window(w_id):
w_type = get("xprop -id "+w_id)
if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
return True
else:
return False
# get resolution
res = get_res()
# define (calculate) the area to divide
area_h = res[0] - left_margin; area_v = res[1] - top_margin
# create a list of calculated coordinates
x_coords = [int(left_margin+area_h/cols*n) for n in range(cols)]
y_coords = [int(top_margin+area_v/rows*n) for n in range(rows)]
coords = sum([[(cx, cy) for cx in x_coords] for cy in y_coords], [])
# calculate the corresponding window size, given the padding, margins, columns and rows
w_size = [str(int(area_h/cols - padding)), str(int(area_v/rows - padding))]
# find windows of the application, identified by their pid
wlist = [w.split()[0] for w in get("wmctrl -lp").splitlines()]
w_list = [w for w in wlist if check_window(w) == True][:cols*rows]
print(w_list)
# remove possibly maximization, move the windows
for n, w in enumerate(w_list):
data = (",").join([str(item) for item in coords[n]])+","+(",").join(w_size)
cmd1 = "wmctrl -ir "+w+" -b remove,maximized_horz"
cmd2 = "wmctrl -ir "+w+" -b remove,maximized_vert"
cmd3 = "wmctrl -ir "+w+" -e 0,"+data
for cmd in [cmd1, cmd2, cmd3]:
subprocess.Popen(["/bin/bash", "-c", cmd])
Como usar
-
O script precisa dos dois
xdotool
ewmctrl
:sudo apt-get install xdotool wmctrl
-
Copie o script em um arquivo vazio, salve-o como
twobytwo.py
-
Teste-o abrindo quatro janelas (pelo menos uma janela de terminal para executar o comando), execute o comando:
python3 /path/to/twobytwo.py 2 2
As janelas devem se mover em uma grade de 4, como na segunda imagem
-
Se tudo funcionar bem, adicione-o a uma tecla de atalho: escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando:
python3 /path/to/twobytwo.py 2 2
Nota (s)
-
na seção principal, há uma seção:
left_margin = 0
Eu configurei isso para zero, já que o gnome não tem o ativador à esquerda. Para o Unity, isso deve ser (pelo menos)
65
, dependendo da largura definida do lançador. - Como mencionado, o script, como está, exibe as quatro janelas mais antigas . Isso significa que, se você precisar de mais janelas para serem colocadas na mesma grade, o script precisará de uma edição. Por favor mencione em caso afirmativo.