현재 응용 프로그램 창의 인스턴스 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

문제는 모니터가 두 개라는 것입니다. 첫 번째 모니터에는 작업 표시줄이 있습니다.

두 번째 모니터에서 네모 창 4개를 열면 스크립트가 작동하지 않습니다. 두 번째 모니터의 창 4개 모두와 겹칩니다.

또 다른 문제는 작업 표시줄 높이입니다. 첫 번째 모니터에는 작업 표시줄이 있습니다. 높이를 빼려면 어떻게 해야 합니까?

답변1

나는 이것을 달성하기 위한 여러 가지 방법을 찾았습니다.우분투18.04(단일 모니터 사용) 두 변형 모두에서 시작 좌표는 x첫 번째 창을 좌표에 배치한 다음 실제 좌표를 요청하여 0, 0결정 됩니다.엑스오프셋은 xwininfo프로그램에 의해 결정됩니다. 존재하다변형 1사용 가능한 너비를 구하고 추가하려면 루트 창 너비에서 이 오프셋을 뺍니다.변종 2사용 가능한 너비는 첫 번째 창을 100%로 늘리고 크기를 확인하여 결정됩니다.

창을 최대화하면 깜박임이 눈에 띄게 나타납니다. 최대화하기 전에 창을 보이지 않게 하기 위해 unmapping()을 시도했지만 이 경우 오프셋 값이 사라지고 - 0이 되기 때문에 한 번의 실행으로 두 값을 모두 얻을 xdotool windowunmap수는 없습니다 . xwininfo그러나 x이 접근 방식은 상위 창의 축에 왼쪽(예: Ubuntu 실행 프로그램)뿐만 아니라 오른쪽에도 두 개의 패널이 있는 경우 유용할 수 있습니다.

변형 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

첫 번째 변형 데모:

여기에 이미지 설명을 입력하세요.

관련 정보