是否可以知道连接的液晶显示器中哪一个已打开?

是否可以知道连接的液晶显示器中哪一个已打开?

我只想在连接的显示器打开时自动启用输出(但它可能处于电源管理状态)。

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

相关内容