Mover e redimensionar janelas para os cantos da tela

Publicado por Ryuk Shinigami (última atualização em 30/01/2020)

[ Hits: 5.493 ]

Homepage: www.alem.com.br

Download 6976.windowmove.sh

Download windowmove2.sh (versão 2)




Este script pode ser usado em qualquer ambiente gráfico para manipular as janelas ativas com atalhos de teclado. Útil para posicionar/redimensionar as janelas lado a lado, complementando as funções do próprio gerenciador de janelas.

  



Versões atualizadas deste script

Versão 2 - Enviado por Ryuk Shinigami em 24/09/2019

Changelog: Pequenos ajustes nas funções.

Download windowmove2.sh


Esconder código-fonte

#!/bin/bash
# Autor: Paulo Costa (costapha@outlook.com)
# Posiciona a janela ativa nos cantos ou no centro da Área de Trabalho.
# Configure no seu DE atalhos de teclado para cada função do script.
# Dependências: x11-utils (xprop), xdotool, wmctrl

help() {
echo "Como usar este script:

    $ ./windowmove.sh (options)

options:
    (1) move para o canto inferior esquerdo da tela;
    (2) move para a metade inferior da tela;
    (3) move para o canto inferior direito da tela;
    (4) move para a metade esquerda da tela;
    (5) move para o centro da tela;
    (6) move para a metade direita da tela;
    (7) move para o canto superior esquerdo da tela;
    (8) move para a metade superior da tela;
    (9) move para o canto superior direito da tela;
    (1|3|5|7|9)r move e redimensiona para um quarto da tela.
"
}

top-left() {
WX="0%"
WY="0%"
xdotool getactivewindow windowmove $WX $WY
}

top-right() {
WX="100%"
WY="0%"
xdotool getactivewindow windowmove $WX $WY
}

bottom-left() {
WX="0%"
WY="100%"
xdotool getactivewindow windowmove $WX $WY
}

bottom-right() {
WX="100%"
WY="100%"
xdotool getactivewindow windowmove $WX $WY
}

center() {
# Tamanho da janela (sem bordas):
WW=$(xdotool getactivewindow getwindowgeometry | grep -oP 'Geometry: \K.*' | cut -d'x' -f1)
WH=$(xdotool getactivewindow getwindowgeometry | grep -oP 'Geometry: \K.*' | cut -d'x' -f2)
# Tamanho Total da janela (com bordas):
TWW=$(( $BE + $WW + $BD ))
TWH=$(( $BS + $WH + $BI ))
# Posição (X,Y) centralizada:
GRAVITY=$(xprop -id $ID | grep -oP 'gravity:\s+\K.*')
if [ $GRAVITY = "Static" ]; then
    WX=$(( $AX + $BE + ($AW - $TWW) / 2 ))
    WY=$(( $AY + $BS + ($AH - $TWH) / 2 ))
else
    WX=$(( $AX + ($AW - $TWW) / 2 ))
    WY=$(( $AY + ($AH - $TWH) / 2 ))
fi
xdotool getactivewindow windowmove $WX $WY
}

center-resize() {
# Tamanho da janela (sem bordas):
WW=1200
WH=600
# Tamanho Total da janela (com bordas):
TWW=$(( $BE + $WW + $BD ))
TWH=$(( $BS + $WH + $BI ))
# Posição (X,Y) centralizada:
GRAVITY=$(xprop -id $ID | grep -oP 'gravity:\s+\K.*')
if [ $GRAVITY = "Static" ]; then
    WX=$(( $AX + $BE + ($AW - $TWW) / 2 ))
    WY=$(( $AY + $BS + ($AH - $TWH) / 2 ))
else
    WX=$(( $AX + ($AW - $TWW) / 2 ))
    WY=$(( $AY + ($AH - $TWH) / 2 ))
fi
#wmctrl -r :ACTIVE: -e 0,$WX,$WY,$WW,$WH
xdotool getactivewindow windowsize $WW $WH
xdotool getactivewindow windowmove $WX $WY 
}

half-vertical() {
MVW=$(( ($AW / 2) - $BE - $BD ))
MVH=$(( $AH - $BS - $BI ))
xdotool getactivewindow windowsize $MVW $MVH
}

half-horizontal() {
MVW=$(( $AW - $BE - $BD ))
MVH=$(( ($AH / 2) - $BS - $BI ))
xdotool getactivewindow windowsize $MVW $MVH
}

fourth() {
MVW=$(( ($AW / 2) - $BE - $BD ))
MVH=$(( ($AH / 2) - $BS - $BI ))
xdotool getactivewindow windowsize $MVW $MVH
}

# Dimensões (WxH) da Área de Trabalho (A)
AX=$(wmctrl -d | awk 'NR==1{print $8}' | cut -d',' -f1)
AY=$(wmctrl -d | awk 'NR==1{print $8}' | cut -d',' -f2)
AW=$(wmctrl -d | awk 'NR==1{print $9}' | cut -d'x' -f1)
AH=$(wmctrl -d | awk 'NR==1{print $9}' | cut -d'x' -f2)
# ID da janela ativa:
ID=$(xprop -root _NET_ACTIVE_WINDOW | cut -d' ' -f5)
# Tamanho das bordas do gerenciador de janelas:
# Borda Esquerda
BE=$(xprop -id $ID _NET_FRAME_EXTENTS | cut -d' ' -f3 | sed 's/,//')
# Borda Direita
BD=$(xprop -id $ID _NET_FRAME_EXTENTS | cut -d' ' -f4 | sed 's/,//')
# Borda Superior
BS=$(xprop -id $ID _NET_FRAME_EXTENTS | cut -d' ' -f5 | sed 's/,//')
# Borda Inferior
BI=$(xprop -id $ID _NET_FRAME_EXTENTS | cut -d' ' -f6 | sed 's/,//')

case $1 in
     1) bottom-left ;;
     2) half-horizontal; bottom-left ;;
     3) bottom-right ;;
     4) half-vertical; top-left ;;
     5) center ;;
     6) half-vertical; top-right ;;
     7) top-left ;;
     8) half-horizontal; top-left ;;
     9) top-right ;;
    1r) fourth; bottom-left ;; 
    3r) fourth; bottom-right ;;
    5r) center-resize ;;
    7r) fourth; top-left ;;
    9r) fourth; top-right ;;
     *) help; exit 1
esac

Scripts recomendados

tela.sh

Eu vejo gente morta. Descubra se alguém já morreu!

Ogg to Mp3 Audio Convert

Scrip para criação de arquivos em série

Sincronizando seu hosts.deny com blacklist online


  

Comentários
[1] Comentário enviado por Ryuk em 13/05/2019 - 10:04h

Detalhe: não funciona no Gnome, nem em DE rodando sobre o Wayland.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts