最近接觸了windows 7上的螢幕調整大小,感覺非常好用。它的工作原理如下:
monitor 1 monitor 2
------------------------- ----------------------------
| | | | | |
| | | | | |
| | | | | |
| 1 | 2 | | 3 | 4 |
| | | | | |
| | | | | |
| | | | | |
------------------------- ----------------------------
假設您在監視器 1 中開啟了一個應用程序,目前處於焦點狀態。
若按 mod4+up,顯示器 1 上將全螢幕顯示(即覆蓋區域 1 和 2)。
若按下 mod4+left,顯示器 1 上的螢幕將變為半螢幕(即覆蓋區域 1)。
如果按 mod4+right,顯示器 1 上的螢幕會變成半螢幕(但現在它覆蓋區域 2)。
再按 mod4+right,監視器 2(區域 3)上將變為半屏
再按 mod4+right,監視器 2(區域 4)上將變為半屏
再按 mod4+up,顯示器 2 上將全螢幕顯示(區域 3 和 4)
我的問題:我想使用獨立於視窗管理器的三個程式來重現此行為:
- p_right 向右移動:從監視器 1 中的全螢幕轉到區域 2、區域 3、區域 4
- p_left 向左移動
- p_full 使應用程式在目前顯示器上全螢幕顯示
- p_right 和 p_left 很聰明:它們只將程式傳送到另一台監視器(如果那裡有)。
當然,然後我必須將應用程式連接到視窗管理器,以便在按下組合鍵時呼叫程序
我該怎麼做呢?我必須針對 X/Wayland 進行程式設計嗎?或者是否有一些我可以使用的實用程序,並且我的程式可以變成相對簡單的 bash 腳本?
編輯:
xdotool getactivewindow windowmove 21% 0 windowsize 21% 70%
上一個指令設定視窗位置和大小
xrandr | grep connected | grep -v disconnected | egrep '[0-9]+x[0-9]++[0-9x+]*' -o
此命令取得所有監視器的幾何形狀
準備好後我會發布完整的答案
答案1
接下來是一個 bash 腳本,使用兩者xdotool
來xrandr
完成這項工作。如果可能的話/如果人們要求的話,我將提供更多細節/新版本。
它透過命令列完成工作,並且必須在視窗管理器上進行配置,以便在按下特定組合鍵時開始運行
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