administrador de ventanas cambio de tamaño de ventana independiente

administrador de ventanas cambio de tamaño de ventana independiente

Recientemente, entré en contacto con el cambio de tamaño de pantalla en Windows 7 y lo encuentro muy bueno. Funciona así:

    monitor 1                       monitor 2
-------------------------   ----------------------------
|          |            |   |             |            | 
|          |            |   |             |            |
|          |            |   |             |            |
|   1      |    2       |   |    3        |    4       |
|          |            |   |             |            |
|          |            |   |             |            |
|          |            |   |             |            |
-------------------------   ----------------------------

Supongamos que tiene una aplicación abierta en el monitor 1, actualmente enfocada.

  • Si presiona mod4+arriba, pasa a pantalla completa en el monitor 1 (es decir, cubre las áreas 1 y 2).

  • Si presiona mod4+izquierda, pasa a media pantalla en el monitor 1 (es decir, cubre el área 1).

  • Si presiona mod4+derecha, pasa a media pantalla en el monitor 1 (pero ahora cubre el área 2).

  • Presione mod4+derecha nuevamente y pasará a media pantalla en el monitor 2 (área 3)

  • Presione mod4+derecha nuevamente y pasará a media pantalla en el monitor 2 (área 4)

  • Presione mod4+arriba nuevamente y pasará a pantalla completa en el monitor 2 (áreas 3 y 4)

Mi pregunta: quiero reproducir este comportamiento, utilizando un trío de programas independientes del administrador de ventanas:

  • p_right se mueve hacia la derecha: pasa de pantalla completa en el monitor 1 al área 2, al área 3, al área 4
  • p_left se mueve hacia la izquierda
  • p_full hace que la aplicación esté en pantalla completa en el monitor actual
  • p_right y p_left son inteligentes: sólo envían el programa a otro monitor si hay uno allí.

Por supuesto, entonces tendré que conectar mis aplicaciones a mi administrador de ventanas para que los programas sean llamados cuando se presione una combinación de teclas.

¿Cómo haría para hacer eso?¿Tengo que programar contra X/Wayland?¿O hay alguna utilidad que pueda usar y mis programas pueden convertirse en scripts bash relativamente triviales??

Editar:

xdotool getactivewindow windowmove 21% 0 windowsize 21% 70%

El comando anterior establece la posición y el tamaño de una ventana.

xrandr | grep connected | grep -v disconnected | egrep '[0-9]+x[0-9]++[0-9x+]*' -o

Este comando obtiene la geometría de todos los monitores.

Publicaré una respuesta completa cuando esté lista.

Respuesta1

Lo que sigue es un script bash, que utiliza ambos xdotooly xrandrque hace el trabajo. Proporcionaré más detalles/nuevas versiones a medida que sea posible/si la gente lo solicita.

Hace su trabajo desde la línea de comando y debe configurarse en su administrador de ventanas para comenzar a ejecutarse cuando se presiona una determinada combinación de teclas.

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

información relacionada