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 xdotool
y xrandr
que 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