Получить разрешение экрана, в котором включено окно, в настройке нескольких мониторов

У меня установлено 3 монитора (один 1080p, другой 900p). Я редактирую скрипт bash для окна, который должен получить разрешение экрана, на котором активное окно включено.

/questions/350556/kak-uznat-tekuschee-razreshenie-monitora-ili-imya-monitora-lvds-vga1-i-t-d/350566#350566 предлагает скрипт для этого, но возвращает ошибку. xdotool возвращает только разрешение основного дисплея xdpyinfo, а xwininfo возвращает общее разрешение 3 дисплеев

Есть ли решение?

2 ответа

Решение

Следуя советам AFH и основываясь на http://www.doknowevil.net/tag/multiple-monitors/ и https://askubuntu.com/questions/207685/is-it-possible-to-place-windows-with-keyboard-shortcuts-in-xfce Я пришел с этим сценарием, который немного сложен, потому что мои настройки для 3 экранов не горизонтальные, а основной имеет другое разрешение.

#!/bin/bash
# rsizes the window to full height and 50% width and moves into upper right corner


function getActiveWindowID
{
activeWinID=$(xdotool getactivewindow )
echo $activeWinID
}

function getActiveWindowHorizontalPosition
{
activeWinID=$(getActiveWindowID)
xPosLine=$(xwininfo -id $activeWinID | grep "Absolute upper-left X")
xPos=${xPosLine:25}
echo $xPos
}

function getActiveWindowVerticalPosition
{
activeWinID=$(getActiveWindowID)
yPosLine=$(xwininfo -id $activeWinID | grep "Absolute upper-left Y")
yPos=${yPosLine:25}
echo $yPos
}

function getActiveWindowWidth
{
activeWinID=$(getActiveWindowID)
xWidthLine=$(xwininfo -id $activeWinID | grep "Width")
xWidth=${xWidthLine:8}
echo $xWidth
}

function getActiveWindowHeight
{
activeWinID=$(getActiveWindowID)
xHeightLine=$(xwininfo -id $activeWinID | grep "Height")
xHeight=${xHeightLine:8}
echo $xHeight
}

function getActiveWindowCurrentMonitorHorizontal
{

activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
yPos=$(getActiveWindowVerticalPosition)



if [ $xPos -ge 1920 ] || [ $yPos -le 900 ]; then


monitorwidth=1440
echo $monitorwidth

else     
monitorwidth=1920
echo $monitorwidth


fi

}

function getActiveWindowCurrentMonitorVertical
{

activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
yPos=$(getActiveWindowVerticalPosition)




if [ $xPos -ge 1920 ] || [ $yPos -le 900 ]; then


monitorheight=873 
echo $monitorheight 
else     

monitorheight=1054
echo $monitorheight

fi

}
function getActiveScreenDistHorizontal
{

activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
yPos=$(getActiveWindowVerticalPosition)




if [ $xPos -ge 1920 ]; then
activescreendisthorizontal=1920
echo $activescreendisthorizontal
else
if [ $yPos -le 900 ]; then
activescreendisthorizontal=480
echo $activescreendisthorizontal
else
activescreendisthorizontal=0
echo $activescreendisthorizontal
fi
fi  
}

function getActiveScreenDistVertical
{

activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
yPos=$(getActiveWindowVerticalPosition)




if [ $xPos -ge 1920 ]; then
activescreendistvertical=438
echo $activescreendisvertical
else
if [ $yPos -le 900 ]; then

activescreendistvertical=0
echo $activescreendistvertical
else
activescreendistvertical=900
echo $activescreendistvertical
fi  
fi  
}

#define MARGINS IN PIXELS
TOPMARGIN=0
RIGHTMARGIN=0
LEFTMARGIN=0
BOTTOMMARGIN=0
# get width of screen and height of screen
SCREEN_WIDTH=$(getActiveWindowCurrentMonitorHorizontal)
SCREEN_HEIGHT=$(getActiveWindowCurrentMonitorVertical)

xPos=$(getActiveWindowHorizontalPosition)
yPos=$(getActiveWindowVerticalPosition)



AVAILABLE_WIDTH=$(( $SCREEN_WIDTH - $RIGHTMARGIN -$LEFTMARGIN))
AVAILABLE_HEIGHT=$(( $SCREEN_HEIGHT - $TOPMARGIN - $BOTTOMMARGIN))

# new width and height
W=$(( $AVAILABLE_WIDTH / 2))

H=$(( $AVAILABLE_HEIGHT))


# Available coordinates
activescreendisthorizontal=$(getActiveScreenDistHorizontal)
activescreendistvertical=$(getActiveScreenDistVertical)

XLEFT=$(($activescreendisthorizontal+$LEFTMARGIN))
XRIGHT=$(($XLEFT+$LEFTMARGIN+$W ))
YTOP=$(($activescreendistvertical+$TOPMARGIN))
YBOTTOM=$(( $TOPMARGIN+$H ))

# Actual new coordinates
X=$XRIGHT
Y=$YTOP

wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz && wmctrl -r 
:ACTIVE: -e 10,$X,$Y,$W,$H                    

Я не совсем уверен, что вы хотите, но следующая команда получит положение и размеры вашей оболочки:

$ wmctrl -plG|grep -E "^[^ ]+ +[^ ]+ $PPID "
0x0560000b  1 2481   10   47   1352 386  Lenovo-Ubuntu Terminal

Это упрощенно, потому что он работает только из начальной оболочки; для работы из под-оболочки вам понадобится:

$ wmctrl -plG|grep -E "^[^ ]+ +[^ ]+ $(pid=$PPID; until [ "`ps -p $pid -o comm= | grep -i term`" ]; do pid=`ps -p $pid -o ppid=`; done; echo $pid) "
0x0560000b  1 2481   10   47   1352 386  Lenovo-Ubuntu Terminal

Это предполагает, что ваш терминал содержит term в его названии: вам может понадобиться другой способ идентифицировать ваш терминал (извините за длинную линию, но большая ее часть находится в строке поиска).

Вы можете узнать размеры подключенных мониторов, набрав:

$ xrandr | grep ' connected'
LVDS1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 344mm x 194mm
HDMI1 connected 1920x1080+1366+0 (normal left inverted right x axis y axis) 708mm x 398mm

После размеров, +0+0 а также +1366+0 смещения по осям X и Y каждого монитора на глобальном экране.

Чтобы выяснить, на каком мониторе отображается терминал, вам нужно сравнить ось X (между знаками "+") с четвертым полем в wmctrl выходной сигнал, чтобы найти самый правый монитор, ось X которого меньше позиции X терминала.

В примерах, которые я показал, X-позиция терминала 10, который больше чем 0ось X LVDS1, но меньше чем 1366ось X HDMI1, так что терминал включен LVDS1 чьи размеры поэтому 1366x768,

В отличие от wmctrl Команда на терминале на другом экране дала:

0x0740000f 1 12147 1466 46 2356 966 Lenovo-Ubuntu xterm

Вот 1466 больше, чем оба 0 а также 1366так что самый правый монитор HDMI1с размерами 1920x1080,

Обратите внимание, что терминал может располагаться на двух мониторах: то, что я описал, найдет самый левый из них, но вы можете проверить некоторые другие поля, если вы хотите сделать что-то другое в этом случае.

Для сравнения вам понадобятся сложные сценарии, и я не собираюсь делать это для вас, но я надеюсь, что у вас достаточно информации для начала.

Другие вопросы по тегам