获取多显示器设置中窗口的显示分辨率

获取多显示器设置中窗口的显示分辨率

我设置了 3 个显示器(一个是 1080p,另一个是 900p)。我正在编辑一个窗口平铺 bash 脚本,该脚本需要检索活动窗口所在显示器的分辨率。

https://superuser.com/a/992924提供了一个脚本来执行此操作但返回错误。xdotool 仅返回主显示器的分辨率 xdpyinfo 和 xwininfo 返回 3 个显示器的总分辨率

有什么解决办法吗?

答案1

我不完全确定你想要什么,但是以下命令将获取你的 shell 的位置和尺寸:

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

这很简单,因为它只能在初始 shell 中工作;要从子 shell 中工作,您需要:

$ 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,但小于 的1366X 轴HDMI1,因此终端位于LVDS1的尺寸为1366x768

相比之下,wmctrl另一个屏幕终端上的命令显示:

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

这里1466大于和01366所以最右边的显示器为HDMI1,尺寸为1920x1080

请注意,一个终端可能跨越两个显示器:我所描述的将找到其中最左边的显示器,但如果您想在这种情况下做一些不同的事情,您可以检查其他一些字段。

您将需要一些复杂的脚本来进行比较,我并不打算为您做到这一点,但我希望您有足够的信息来开始。

答案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                    

相关内容