Mover e redimensionar janelas para os cantos da tela

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

[ Hits: 5.266 ]

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

Script para controle do servidor ProFTP no Slackware

Shell Script para instalação do ePSXe no Ubuntu

Instalação de programas em Debian-like

Troca de MAC

Script para enviar put para uma API usando curl e dados no formato json


  

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