Mover / redimensionar janelas em 1px
Supondo que você esteja usando o Unity, o script abaixo move ou redimensiona as janelas em 1 px. O script pode ser executado com 8 argumentos diferentes. Dependendo das opções de movimentação / redimensionamento que você deseja usar, você pode adicionar os comandos a uma combinação de teclas de atalho. Uma visão geral das opções e os comandos correspondentes abaixo:
Exceções/limitações
Existemalgumaslimitações:
- Asjanelas
gnome-terminal
sópodemserredimensionadasemetapas.Comoresultado,aumentar/diminuirotamanhodajanelaem1pxnãofuncionacomgnome-terminal
. - Ajanelaasermovida/redimensionadaprecisaserpelomenosalgunspixelsdoiniciadordoUnityedopainelsuperior.
Comousar
Primeiro,instaleowmctrl,queénecessárioparaobterageometriadajanelaemoverajanela.
sudoapt-getinstallwmctrl
Crieumdiretório
~/bin
(portanto,emseudiretóriopessoal)- Copieoscriptabaixoemumarquivovazio,salve-ocomo
move_window
(semextensão) Torne-aexecutável(cliquecomobotãodireitodomousenoarquivo>Propriedades>Permissões(guia),marque"permitir executar")
Para testar, abra uma janela de terminal e execute subseqüentemente:
move_window l move_window r move_window u move_window d
Como a janela do terminal é a mais frontal, ela deve mover 1px para a esquerda / direita / para cima / para baixo.
(Como mencionado, o redimensionamento não funciona com
gnome-terminal
)-
Se funcionar corretamente, adicione os comandos às teclas de atalho;
escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione os comandos a quatro combinações diferentes de teclas de atalho. Isso pode ser complicado, já que os comandos que você mencionou provavelmente estão ocupados. O que funcionou no meu sistema:- Shift + Ctrl + tecla de seta para a esquerda
- Shift + Ctrl + tecla de seta para a direita
- Shift + Ctrl + tecla de seta para cima
- Shift + Ctrl + tecla de seta para baixo
para as ações de movimento.
Para as ações de redimensionamento, você terá que tentar combinações adicionais.
O script
#!/usr/bin/env python3
import subprocess
import sys
# calibration
cal = 4
# direction, as argument from user input (l, r, u, d / h+, h-, v+, v-)
direction = sys.argv[1]
# move step size
mv = -1 if direction in ["l", "d", "h-", "v-"] else 1
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command])\
.decode("utf-8")
def execute(command):
subprocess.call(["/bin/bash", "-c", command])
# find the top shift (height of the panel = resolution - working area)
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))[-1]
topshift = int(res) - int(get("wmctrl -d").split()[8].split("x")[-1])+cal
# find frontmost window
def get_windowid():
cmd = "xprop -root"
frontmost = [l for l in get(cmd).splitlines() if\
"ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
return frontmost[:2]+"0"+frontmost[2:]
# get window geometry, create move command
set_w = [w.split()[0:6] for w in get("wmctrl -lG").splitlines()\
if get_windowid() in w][0]
set_w[0] = "wmctrl -ir "+set_w[0]+" -e 0"
set_w.pop(1)
if direction in ["l", "r"]:
set_w[1] = str(int(set_w[1])+mv); set_w[2] = str(int(set_w[2])-topshift)
elif direction in ["u", "d"]:
set_w[2] = str(int(set_w[2])-topshift-mv)
elif direction in ["v-", "v+"]:
set_w[2] = str(int(set_w[2])-topshift); set_w[4] = str(int(set_w[4])+mv)
elif direction in ["h-", "h+"]:
set_w[2] = str(int(set_w[2])-topshift); set_w[3] = str(int(set_w[3])+mv)
execute((",").join(set_w))
Nota
Há uma pequena diferença na maneira como wmctrl
reporta a geometria da janela, e a maneira como wmctrl
define a geometria da janela. No primeiro caso, calcula a partir do ecrã inteiro (resolução), no segundo caso apenas a partir da área de trabalho (??). Mesmo assim, o script teve que "calibrar" 4 px na vertical, para o qual não encontrei nenhuma explicação satisfatória. A boa notícia é que, em computadores diferentes, não vi diferença no desvio.
Se no seu caso a janela fizer saltos inesperados, deixe um comentário.
Explicação
Como funciona
-
A janela mais frontal é procurada com a ajuda de
xprop
:xprop -root
Em algum lugar na saída (extensa), há uma linha como:
_NET_ACTIVE_WINDOW(WINDOW): window id # 0x4600a8d
a partir do qual o ID da nossa janela pode ser analisado:
0x4600a8d
. Como o formato é um pouco diferente dewmctrl
, precisamos adicionar um zero na terceira posição:0x04200085
-
O id da janela é usado para procurar a janela e seus dados de geometria atuais, na saída de
wmctrl -lG
. Quando tivermos a linha correta, os dados que temos na janela serão:0x04200085 0 322 52 823 998 <computer_name> <window_name>
onde as colunas 2, 3, 4 e 5 são subsequentes:
- x coordenada do canto superior esquerdo da janela
- coordenada y
- largura da janela
- altura da janela
-
manipulando esses números, podemos mover / redimensionar a janela com o comando:
(exemplo para mover a janela para a direita em 1 px, alterando "322" para "323")wmctrl -ir 0x04200085 -e 0,323,52,823,998
Existem algumas complicações para lidar, mas é basicamente assim que funciona.