Posso mover / redimensionar janelas um pixel de cada vez com o meu teclado?

4

No Windows (desde pelo menos XP, provavelmente antes), se você usar o teclado para mover ou redimensionar uma Janela, poderá obter localizações e tamanhos muito precisos - até mais do que com um mouse - usando a tecla Ctrl em combinação com as teclas de seta (depois de ter chamado a funcionalidade Move ou Resize do menu da janela [Alt + Espaço]) para mover as bordas da janela um pixel de cada vez.

Existe uma maneira de fazer o mesmo (ou algo semelhante) no Ubuntu?

    
por Wilson F 24.12.2014 / 17:22

2 respostas

5

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:

  • Asjanelasgnome-terminalsópodemserredimensionadasemetapas.Comoresultado,aumentar/diminuirotamanhodajanelaem1pxnãofuncionacomgnome-terminal.
  • Ajanelaasermovida/redimensionadaprecisaserpelomenosalgunspixelsdoiniciadordoUnityedopainelsuperior.

Comousar

  • Primeiro,instaleowmctrl,queénecessárioparaobterageometriadajanelaemoverajanela.

    sudoapt-getinstallwmctrl
  • Crieumdiretório~/bin(portanto,emseudiretóriopessoal)

  • Copieoscriptabaixoemumarquivovazio,salve-ocomomove_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

  1. 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 de wmctrl , precisamos adicionar um zero na terceira posição: 0x04200085

  2. 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
  3. 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.

    
por Jacob Vlijm 24.12.2014 / 21:52
1

Aparentemente, isso também não funciona no XFCE. Eu tenho uma ideia indireta que pode funcionar ...

Sugiro tentar opções de acessibilidade para controlar o mouse com o teclado , configurá-lo para mover-se bem devagar e usá-lo para fazer com que a janela se mova um pouco de cada vez.

Cada área de trabalho parece colocar as opções de acessibilidade em algum lugar diferente, no XFCE está sob o Gerenciador de configurações geral, mas não deve ser difícil encontrar no Unity & amp; outros ...

    
por Xen2050 24.12.2014 / 17:44