并排放置当前应用程序窗口的四个实例(双显示器)

并排放置当前应用程序窗口的四个实例(双显示器)

我已将以下脚本添加到键绑定中。

假设我打开了 5 个 nemo 实例。它将取出前四个并将它们并排放置。

#!/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

问题是,我有两个显示器。第一个显示器中有一个任务栏。

如果我在第二个监视器中打开四个 nemo 窗口,则脚本将不起作用。它将第二个监视器中的所有四个窗口重叠。

另一个问题是任务栏高度。在第一个显示器中,有一个任务栏。我怎样才能得到它的高度以便我可以减去它?

答案1

我找到了几种方法来实现这一目标乌班图18.04(使用单显示器)。在这两种变体中,起始x坐标是通过将第一个窗口放置到0, 0坐标并随后请求真实坐标来确定的。X的偏移量由xwininfo程序决定。在变体1从根窗口的宽度中减去该偏移量以获得可用宽度并在变体2可用宽度是通过将第一个窗口增加到 100% 并检查其大小来确定的。

窗口最大化会导致明显的眨眼。我尝试在最大化之前取消映射窗口以使其不可见 ( 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

第一个变体的演示:

在此输入图像描述

相关内容