キーバインディングに次のスクリプトを追加しました。
5つのnemoインスタンスが開いているとしましょう。最初の4つを持って並んで配置します。
#!/bin/bash
WINDOW_ID=$(xdotool getactivewindow)
CLASS_NAME=$(xprop -id $WINDOW_ID | grep WM_CLASS | cut -d '"' -f2)
WORKSPACE=$(xdotool get_desktop)
WindowsArray=()
for i in $(xdotool search --desktop $WORKSPACE --classname $CLASS_NAME); do
WindowsArray+=($i)
done
SCREEN_RESOLUTION=$(xdpyinfo | awk '/dimensions/ {print $2}')
SCREEN_WIDTH=$(echo $SCREEN_RESOLUTION | cut -d x -f1)
SCREEN_HEIGHT=$(echo $SCREEN_RESOLUTION | cut -d x -f2)
W=$(( $SCREEN_WIDTH / 4 ))
H=$(( $SCREEN_HEIGHT - 2 ))
allX=(0 $(( $SCREEN_WIDTH / 4 )) $(( $SCREEN_WIDTH / 2 )) $(( $SCREEN_WIDTH / 4 * 3 )))
echo "$W"
echo "$H"
echo "${allX[*]}"
ITER=0
for X in ${allX[@]}; do
echo "$X"
xdotool windowsize "${WindowsArray[$ITER]}" $W $H
xdotool windowmove "${WindowsArray[$ITER]}" $X 0
xdotool windowactivate "${WindowsArray[$ITER]}"
((ITER++))
done
問題はモニターが2つあることです。最初のモニターにはタスクバーがあります。
2番目のモニタで4つの4つの四角いウィンドウを開くと、スクリプトは機能しません。 2番目のモニターの4つのウィンドウすべてと重なります。
別の問題はタスクバーの高さです。最初のモニターにはタスクバーがあります。高さを引くにはどうすればよいですか?
答え1
私はこれを達成するためのいくつかの方法を見つけました。Ubuntu18.04(単一モニターを使用)両方のバリエーションでは、開始座標は最初のウィンドウを座標x
に配置してから実際の座標を要求することによって決定0, 0
されます。Xオフセットはxwininfo
プログラムによって決定されます。存在する変形1利用可能な幅を取得して追加するには、ルートウィンドウの幅からこのオフセットを減算します。亜種2使用可能な幅は、最初のウィンドウを100%に増やし、サイズを確認することによって決定されます。
ウィンドウを最大化すると、ちらつきが目立つようになります。最大化する前にウィンドウを見えなくするためにunmapping()を試しましたが、この場合、オフセット値は消えて-0になるため、1回の実行で両方の値を取得することはxdotool windowunmap
できません。xwininfo
ただし、x
このアプローチは、親ウィンドウの軸に左側(Ubuntuランチャーなど)だけでなく、右側にも2つのパネルがある場合に便利です。
変形1
#!/bin/bash
window_num=${1:-4}
arr=( $(xdotool search --class xlogo) )
xdotool windowmove ${arr[0]} 0 0
xw_info_window_0=$(xwininfo -id ${arr[0]})
x_abs_offset=$(awk -F': +' '/Absolute upper-left X/{print $2}' <<< "$xw_info_window_0")
xw_info_root=$(xwininfo -root)
root_wdth=$(awk -F': +' '/Width/{print $2}' <<< "$xw_info_root")
root_hght=$(awk -F': +' '/Height/{print $2}' <<< "$xw_info_root")
avail_wdth=$((root_wdth - x_abs_offset))
new_wdth=$((avail_wdth / window_num))
new_hght=200
for i in $(seq 0 $((window_num - 1))); do
xdotool windowsize ${arr[$i]} "$new_wdth" "$new_hght"
xdotool windowmove ${arr[$i]} $(($((new_wdth * i)) + x_abs_offset)) 0
done
亜種2
#!/bin/bash
window_num=${1:-4}
arr=( $(xdotool search --class xlogo) )
xdotool windowsize ${arr[0]} 100% 100%
xdotool windowmove ${arr[0]} 0 0
xw_info=$(xwininfo -id ${arr[0]})
avail_wdth=$(awk -F': +' '/Width/{print $2}' <<< "$xw_info")
avail_hght=$(awk -F': +' '/Height/{print $2}' <<< "$xw_info")
x_abs_offset=$(awk -F': +' '/Absolute upper-left X/{print $2}' <<< "$xw_info")
new_wdth=$((avail_wdth / window_num))
new_hght=200
for i in $(seq 0 $((window_num - 1))); do
xdotool windowsize ${arr[$i]} "$new_wdth" "$new_hght"
xdotool windowmove ${arr[$i]} $(($((new_wdth * i)) + x_abs_offset)) 0
done
最初のバリエーションデモ: