Fenstermanager-unabhängige Fenstergrößenanpassung

Fenstermanager-unabhängige Fenstergrößenanpassung

Ich habe kürzlich die Möglichkeit zur Größenanpassung des Bildschirms unter Windows 7 ausprobiert und finde sie sehr praktisch. Sie funktioniert folgendermaßen:

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

Angenommen, Sie haben auf Monitor 1 eine Anwendung geöffnet, die derzeit im Fokus ist.

  • Wenn Sie Mod4+Auf drücken, wird der Vollbildmodus auf Monitor 1 aktiviert (d. h., es werden die Bereiche 1 und 2 abgedeckt).

  • Wenn Sie Mod4+links drücken, wird auf Monitor 1 die halbe Anzeige angezeigt (d. h., es deckt Bereich 1 ab).

  • Wenn Sie Mod4+Rechts drücken, wird auf Monitor 1 die halbe Anzeige eingeblendet (es deckt jetzt aber Bereich 2 ab).

  • Drücken Sie erneut Mod4+Rechts, und es wird auf Monitor 2 (Bereich 3) halbiert.

  • Drücken Sie erneut mod4+rechts, und es wird auf Monitor 2 (Bereich 4) halbiert.

  • Drücken Sie erneut mod4+up, und es wird auf Monitor 2 (Bereiche 3 und 4) im Vollbildmodus angezeigt.

Meine Frage: Ich möchte dieses Verhalten mithilfe eines vom Fenstermanager unabhängigen Programmtrios reproduzieren:

  • p_right bewegt sich nach rechts: geht vom Vollbild in Monitor 1 zu Bereich 2, zu Bereich 3, zu Bereich 4
  • p_left bewegt sich nach links
  • p_full macht die App im Vollbildmodus auf dem aktuellen Monitor
  • p_right und p_left sind clever: Sie schicken das Programm nur dann an einen anderen Monitor, wenn dort einer vorhanden ist.

Natürlich muss ich dann meine Anwendungen an meinen Fenstermanager anbinden, damit die Programme aufgerufen werden, wenn eine Tastenkombination gedrückt wird

Wie würde ich dabei vorgehen?Muss ich gegen X/Wayland programmieren,oder gibt es ein Dienstprogramm, das ich verwenden kann, und meine Programme können relativ triviale Bash-Skripte werden?

Bearbeiten:

xdotool getactivewindow windowmove 21% 0 windowsize 21% 70%

Der vorherige Befehl legt eine Fensterposition und -größe fest

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

Dieser Befehl ruft die Geometrie aller Monitore ab

Ich werde eine vollständige Antwort posten, sobald sie fertig ist

Antwort1

Was folgt, ist ein Bash-Skript, das beides verwendet xdotoolund xrandrdas funktioniert. Ich werde weitere Details/neue Versionen bereitstellen, sobald es möglich ist/wenn Leute danach fragen.

Es erledigt seine Aufgabe über die Befehlszeile und muss in Ihrem Fenstermanager so konfiguriert werden, dass es beim Drücken einer bestimmten Tastenkombination gestartet wird.

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

verwandte Informationen