要在连接笔记本电脑时自动更改 Xserver 的显示布局,我不仅需要检测该事件是否实际发生,还需要检测哪个连接显示器能够区分多个扩展坞设置,即有多个扩展坞具有不同的连接显示器。这在 Linux 上怎么可能(最好是在 POSIX shell 代码中)?
答案1
如果您实际上正在寻找一种在对接(取消)对接时自动设置显示器的方法,我建议您查看自动排序在自己开始做类似的事情之前(不像我;)。
要检测某个显示输出是否连接到显示器,存在好的答案在这个问题中。最有趣的似乎是看看/sys/class/drm/card0-*-*/status
哪个读取connected
或disconnected
。
尽管这并不能解决这个问题中所述的问题,但可以采取非常相似的方法,因为存在/sys/class/drm/card0-*-*/edid
(缓存)EDID 又名 DDC 信息各自的监视器。如果您幸运的话,此数据甚至包含显示器的序列号,因此甚至可以区分相同显示器类型的设置(您可以使用 进行检查edid-decode /sys/class/drm/.../edid
)。
因此,为了区分附加监视器组,我使用以下 shell 函数,该函数在很大程度上基于具有类似功能的函数自动排序。
# hash_sysfs_edid() simply concatenates the md5 hashes of all connected
# monitors and hashes them again so that the output is always 32 characters long.
hash_sysfs_edid () {
edid_hash=""
for DEVICE in /sys/class/drm/card*-*; do
[ -e "${DEVICE}/status" ] && grep -q "^connected$" "${DEVICE}/status" || continue
edid_hash="${edid_hash}"$(md5sum "${DEVICE}/edid" | awk '{print $1}')
done
echo $(echo "$edid_hash" | md5sum | awk '{print $1}')
}