Recentemente, tive contato com o redimensionamento de tela no windows 7 e achei muito legal. Funciona assim:
monitor 1 monitor 2
------------------------- ----------------------------
| | | | | |
| | | | | |
| | | | | |
| 1 | 2 | | 3 | 4 |
| | | | | |
| | | | | |
| | | | | |
------------------------- ----------------------------
Digamos que você tenha um aplicativo aberto no monitor 1, atualmente em foco.
Se você pressionar mod4+up, ele fica em tela cheia no monitor 1 (ou seja, cobre as áreas 1 e 2).
Se você pressionar mod4+esquerda, ele passa para meia tela no monitor 1 (ou seja, cobre a área 1).
Se você pressionar mod4 + direita, ele fica na metade da tela no monitor 1 (mas agora cobre a área 2).
Pressione mod4 + direita novamente e vai para meia tela no monitor 2 (área 3)
Pressione mod4 + direita novamente e vai para meia tela no monitor 2 (área 4)
Pressione mod4+up novamente e entra em tela cheia no monitor 2 (áreas 3 e 4)
Minha pergunta: quero reproduzir esse comportamento, usando um trio de programas independente do gerenciador de janelas:
- p_right move para a direita: vai da tela cheia no monitor 1 para a área 2, para a área 3, para a área 4
- p_left se move para a esquerda
- p_full torna o aplicativo em tela cheia no monitor atual
- p_right e p_left são inteligentes: eles só enviam o programa para outro monitor se houver um lá.
Claro, então terei que conectar meus aplicativos ao meu gerenciador de janelas para que os programas sejam chamados quando uma combinação de teclas for pressionada
Como eu faria isso?Tenho que programar contra X/Wayland,ou há algum utilitário que eu possa usar e meus programas podem se tornar scripts bash relativamente triviais?
Editar:
xdotool getactivewindow windowmove 21% 0 windowsize 21% 70%
O comando anterior define a posição e o tamanho da janela
xrandr | grep connected | grep -v disconnected | egrep '[0-9]+x[0-9]++[0-9x+]*' -o
Este comando obtém a geometria de todos os monitores
Vou postar uma resposta completa quando estiver pronta
Responder1
O que se segue é um script bash, usando ambos xdotool
e xrandr
que faz o trabalho. Fornecerei mais detalhes/novas versões assim que for possível/se as pessoas solicitarem.
Ele faz seu trabalho a partir da linha de comando e deve ser configurado em seu gerenciador de janelas para começar a funcionar quando uma determinada combinação de teclas for pressionada
first_monitor=`xrandr | grep connected | grep -v disconnected | egrep '[0-9]+x[0-9]++[0-9x+]*' -o | head -n 1`
#echo $first_monitor
number_monitors=`xrandr | grep connected | grep -v disconnected | egrep '[0-9]+x[0-9]++[0-9x+]*' -o | wc -l`
#echo $number_monitors
if [ $number_monitors -eq 2 ]
then
second_monitor=`xrandr | grep connected | grep -v disconnected | egrep '[0-9]+x[0-9]++[0-9x+]*' -o | tail -n 1`
fi
if [ $number_monitors -ne 2 ]
then
second_monitor='not there'
fi
size_first_monitor=`echo $first_monitor | awk 'BEGIN { FS="x" } { print $1 }'`
[ $second_monitor != 'not there' ] && size_second_monitor=`echo $second_monitor | awk 'BEGIN { FS="x" } { print $1 }'`
position_px=`xdotool getactivewindow getwindowgeometry | grep Position | awk '{print $2}' | awk 'BEGIN { FS="," } { print $1 }'`
position='outside'
(( $position_px < $size_first_monitor/2 )) && position='first_half_first_monitor'
(( $position_px >= $size_first_monitor/2 )) && (($position_px < $size_first_monitor)) && position='second_half_first_monitor'
if [ '$second_monitor' != 'not there' ]
then
(( $position_px >= $size_first_monitor )) && (($position_px < $size_first_monitor+($size_second_monitor/2) )) && position='first_half_second_monitor'
(($position_px >= $size_first_monitor+($size_second_monitor/2) )) && position='second_half_second_monitor'
fi
height_first_monitor=`echo $first_monitor | awk 'BEGIN { FS="+" } { print $1 }'|awk 'BEGIN { FS="x" } { print $2 }'`
height_second_monitor=`echo $second_monitor | awk 'BEGIN { FS="+" } { print $1 }'|awk 'BEGIN { FS="x" } { print $2 }'`
height_first_monitor=$(( $height_first_monitor - 20 ))
height_second_monitor=$(( $height_second_monitor - 20 ))
first_position="xdotool getactivewindow windowmove 0 0 windowsize $(( $size_first_monitor/2 )) $height_first_monitor"
second_position="xdotool getactivewindow windowmove $(( $size_first_monitor/2 )) 0 windowsize $(( $size_first_monitor/2 )) $height_first_monitor"
third_position="xdotool getactivewindow windowmove $size_first_monitor 0 windowsize $(( $size_second_monitor/2 )) $height_second_monitor"
fourth_position="xdotool getactivewindow windowmove $(( $size_first_monitor + $size_second_monitor/2 )) 0 windowsize $(( $size_second_monitor/2 )) $height_second_monitor"
if [ "$1" == 'right' ]
then
[ "$position" == 'first_half_second_monitor' ] && [ $second_monitor != 'not there' ]&& $fourth_position
[ "$position" == 'second_half_first_monitor' ] && [ $second_monitor != 'not there' ]&& $third_position
[ "$position" == 'first_half_first_monitor' ] && $second_position
fi
size_window=`xdotool getactivewindow getwindowgeometry | grep Geometry | awk '{print $2}' | awk 'BEGIN { FS="x" } { print $1 }'`
if [ "$1" == 'left' ]
then
[ "$position" == 'first_half_first_monitor' ] && $first_position
[ "$position" == 'second_half_first_monitor' ] && $first_position
[ "$position" == 'first_half_second_monitor' ] && [ $size_window != $size_second_monitor ] && $second_position
[ "$position" == 'first_half_second_monitor' ] && [ $size_window == $size_second_monitor ] && $third_position
[ "$position" == 'second_half_second_monitor' ] && $third_position
fi
echo $size_window
echo $size_second_monitor
max_first_monitor="xdotool getactivewindow windowmove 0 0 windowsize $size_first_monitor $height_first_monitor"
max_second_monitor="xdotool getactivewindow windowmove $size_first_monitor 0 windowsize $size_second_monitor $height_second_monitor"
if [ "$1" == 'maximize' ]
then
[ "$position" == 'first_half_first_monitor' ] && $max_first_monitor
[ "$position" == 'second_half_first_monitor' ] && $max_first_monitor
[ "$position" == 'first_half_second_monitor' ] && $max_second_monitor
[ "$position" == 'second_half_second_monitor' ] && $max_second_monitor
fi