我只想在连接的显示器打开时自动启用输出(但它可能处于电源管理状态)。
答案1
您可以使用ddutil通过检查 VCP 0xd6 代码的值是否设置为除 0x05 之外的任何值(如表 8-5 中指定)来检查给定监视器是否已打开VESA 监视器控制命令集:
$ sudo ddcutil -d 1 getvcp d6 --terse |& awk '{ print $NF }'
x01
这意味着第一个显示器已打开。
$ sudo ddcutil -d 1 getvcp d6 --terse |& awk '{ print $NF }'
x05
这意味着第一个显示器已关闭。
最难的部分是将 xrandr 指定的输出与可与 ddcutil 一起使用的显示标识进行匹配。我想到的方法之一是从 xrandr 输出中提取 EDID,用 edid-decode 解析它,获取序列号并将其与 ddcutil 一起使用(尽管 ddcutil 接受 --edid 参数,但我无法在某些情况下使用原因)。总而言之,整个xrandr-turned-on.sh
脚本可能如下所示:
#!/usr/bin/env sh
if [ ! $# -eq 1 ]
then
printf "Check if monitor represented by xrandr output is turned on.\n
Usage: %s output\n" "$0"
exit 1
fi
for prog in ddcutil edid-decode
do
if ! command -v "$prog" >/dev/null
then
printf "%s not found. Exiting.\n" "$prog" >&2
exit 1
fi
done
set -e
serial="$(xrandr --prop | awk -v output="$1" '$1 ~ output {getline; for (i=1; i<=16; i++) {getline; printf("%s", $1)}}' | edid-decode | grep "Serial number" | cut -d: -f2 | sed "s,^ ,,")"
state="$(sudo ddcutil -n "$serial" getvcp d6 --terse | awk '{print $NF}')"
if [ "$state" != "x05" ]
then
printf "Monitor for output %s turned on\n" "$1"
else
printf "Monitor for output %s turned off\n" "$1"
fi
(请注意, 的用法getline
相当在 awk 脚本中不鼓励)
用法:
$ ./xrandr-turned-on.sh HDMI3
Monitor for output HDMI3 turned on