我想要获取当前显示器的分辨率(我运行脚本的屏幕)或屏幕的名称(LVDS、VGA1 等)。
如果我无法获得分辨率而只能获得显示器名称,我可以 grep“xrandr -q”输出来获取当前分辨率。
提前致谢。
答案1
您应该能够通过xrandr
和的组合来做到这一点xwininfo
。
获取屏幕、其分辨率和偏移量:
$ xrandr | grep -w connected | awk -F'[ \+]' '{print $1,$3,$4}' VGA-0 1440x900 1600 DP-3 1600x900 0
获取当前窗口的位置
$ xwininfo -id $(xdotool getactivewindow) | grep Absolute Absolute upper-left X: 1927 Absolute upper-left Y: 70
因此,通过结合两者您应该能够获得当前屏幕的分辨率:
#!/usr/bin/env bash
## Get screen info
screen1=($(xrandr | grep -w connected | awk -F'[ +]' '{print $1,$3,$4}' |
head -n 1))
screen2=($(xrandr | grep -w connected | awk -F'[ +]' '{print $1,$3,$4}' |
tail -n 1))
## Figure out which screen is to the right of which
if [ ${screen1[2]} -eq 0 ]
then
right=(${screen2[@]});
left=(${screen1[@]});
else
right=(${screen1[@]});
left=(${screen2[@]});
fi
## Get window position
pos=$(xwininfo -id $(xdotool getactivewindow) | grep "Absolute upper-left X" |
awk '{print $NF}')
## Which screen is this window displayed in? If $pos
## is greater than the offset of the rightmost screen,
## then the window is on the right hand one
if [ "$pos" -gt "${right[2]}" ]
then
echo "${right[0]} : ${right[1]}"
else
echo "${left[0]} : ${left[1]}"
fi
该脚本将打印当前屏幕的名称和分辨率。
答案2
我修改了@terdon 的(优秀)解决方案,以便它可以与水平和/或垂直堆叠的任意数量的显示器一起工作,并改变了从 xrandr 获取偏移的方式(它在我的设置上不起作用,可能是由于 xrandr 输出格式的变化造成的)。
#!/usr/bin/env bash
OFFSET_RE="\+([-0-9]+)\+([-0-9]+)"
# Get the window position
pos=($(xwininfo -id $(xdotool getactivewindow) |
sed -nr "s/^.*geometry .*$OFFSET_RE.*$/\1 \2/p"))
# Loop through each screen and compare the offset with the window
# coordinates.
while read name width height xoff yoff
do
if [ "${pos[0]}" -ge "$xoff" \
-a "${pos[1]}" -ge "$yoff" \
-a "${pos[0]}" -lt "$(($xoff+$width))" \
-a "${pos[1]}" -lt "$(($yoff+$height))" ]
then
monitor=$name
fi
done < <(xrandr | grep -w connected |
sed -r "s/^([^ ]*).*\b([-0-9]+)x([-0-9]+)$OFFSET_RE.*$/\1 \2 \3 \4 \5/" |
sort -nk4,5)
# If we found a monitor, echo it out, otherwise print an error.
if [ ! -z "$monitor" ]
then
echo $monitor
exit 0
else
echo "Couldn't find any monitor for the current window." >&2
exit 1
fi
还值得注意的是,xdotool
可以输出窗口所在的屏幕,但是,如果您使用 Xinerama,它会使所有显示器显示为一个大屏幕,那么这将只会输出 0。
答案3
这是我使用 Python 编写的基于 GTK 的版本,它不依赖于命令行工具(解析其输出)。
import gi
gi.require_version("Gdk", "3.0")
from gi.repository import Gdk
disp=Gdk.Display.get_default()
scr=disp.get_default_screen()
win_pos=scr.get_active_window().get_origin()
print("win: %d x %d" % (win_pos.x, win_pos.y))
rect=disp.get_monitor_at_point(win_pos.x, win_pos.y).get_geometry()
print("monitor: %d x %d" % (rect.width, rect.height))
答案4
由于某种原因,我无法让@adam-bowen 的答案与平铺窗口管理器一起工作,但使用鼠标坐标进行的一些小修改却有效。
#!/usr/bin/env bash
#
# Print's the current screen index (zero based).
#
# Modified from:
# https://superuser.com/a/992924/240907
OFFSET_RE="\+([-0-9]+)\+([-0-9]+)"
# Get the window position
eval "$(xdotool getmouselocation --shell)"
# Loop through each screen and compare the offset with the window
# coordinates.
monitor_index=0
while read name width height xoff yoff
do
if [ "${X}" -ge "$xoff" \
-a "${Y}" -ge "$yoff" \
-a "${X}" -lt "$(($xoff+$width))" \
-a "${Y}" -lt "$(($yoff+$height))" ]
then
monitor=$name
break
fi
((monitor_index++))
done < <(xrandr | grep -w connected |
sed -r "s/^([^ ]*).*\b([-0-9]+)x([-0-9]+)$OFFSET_RE.*$/\1 \2 \3 \4 \5/" |
sort -nk4,5)
# If we found a monitor, echo it out, otherwise print an error.
if [ ! -z "$monitor" ]
then
# echo $monitor
echo $monitor_index
exit 0
else
echo "Couldn't find any monitor for the current window." >&2
exit 1
fi