現在のアプリケーションウィンドウの4つのインスタンスを並べて配置します(デュアルモニター)。

現在のアプリケーションウィンドウの4つのインスタンスを並べて配置します(デュアルモニター)。

キーバインディングに次のスクリプトを追加しました。

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

最初のバリエーションデモ:

ここに画像の説明を入力してください。

関連情報