redimensionamento de janela independente do gerenciador de janelas

redimensionamento de janela independente do gerenciador de janelas

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 xdotoole xrandrque 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

informação relacionada