如何在英特尔图形上创建“监视器插入”回调?
作为一个粗略的解决方案,您可能能够在sysfs上进行轮询。在我的笔记本电脑,我有:
$ cat /sys/class/drm/card0-LVDS-1/status
connected
$ cat /sys/class/drm/card0-VGA-1/status
disconnected
我猜这需要内核DRM和可能KMS。
要查看您是否可以自动触发某些内容,您可以运行udevadm monitor --property
,并在您(显示)连接显示器时查看是否报告了事件。
用我的radeon,我第一次连接VGA显示器时得到一个事件,但在后续断开连接和重新连接时没有事件。该事件应该是这个样子(使用你的为例):
KERNEL[1303765357.560848] change /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
UDEV_LOG=0
ACTION=change
DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
SUBSYSTEM=drm
HOTPLUG=1
DEVNAME=dri/card0
DEVTYPE=drm_minor
SEQNUM=2943
MAJOR=226
MINOR=0
不幸的是有没有很多来匹配,但只要有只有一个,这不是太重要图片视频卡。找到在哪里得到的udev规则,从系统(可能/etc/udev/rules.d/
)上,并创建一个99-monitor-hotplug.rules
文件有:
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/root/hotplug.sh"
udev
然后将运行hotplug.sh
当连接显示器。作为测试,我把下面的/root/hotplug.sh
(别忘了让这个脚本可执行文件):
#!/bin/sh
for output in DVI-I-1 LVDS-1 VGA-1; do
echo $output >> /root/hotplug.log
cat /sys/class/drm/card0-$output/status >> /root/hotplug.log
done
就这样,我在hotplug.log
有一个条目我连接外部显示器后。即使过滤了ACTION=="change"
,我仍然在启动时收到了一些事件,因此您可能希望在脚本中以某种方式考虑这一点。
好的开始,但我不喜欢投票。 – Reactormonk 2011-04-19 18:19:59
@Tass如果您正在获取活动,请ping我,并且我可能会想出一个udev规则来运行脚本 – Andy 2011-04-21 04:48:24
发送活动。 http://pastie.org/1832835 - 并且VGA状态更改为“已连接”。 – Reactormonk 2011-04-25 21:04:52
你有三种选择:在sysfs中的特定条目
- 投票。
- 使用inotify检测sysfs中的更改。
- 使用带有NETLINK_KOBJECT_UEVENT的netlink套接字并监听所需设备的
change
事件。
在上述任何一种方式中,您仍然需要以某种方式进行轮询,所以我只是选择第一种方式。
'inotify'和'netlink'套接字使您可以使用'select()'和朋友。你真的认为“投票”? – 2012-11-30 03:03:00
使用'select()'仍在轮询更新。 – jmkeyes 2012-11-30 17:47:33
使用select()或poll()用于“轮询更新”的美妙之处在于,您可以进入休眠状态,直到超时或内核唤醒您告诉您“轮询”的某项内容(有点误导,它与大多数人所称的“轮询”不同,它甚至是GPIO中断的接口...;)) - 因此减少了CPU资源的浪费等等。 '使用select()或poll()接口更好地“轮询”。 – Svartalf 2015-02-23 16:52:01
假设您正在运行X,脚本可以解析xrandr的输出以查看连接了哪些监视器。这应该适用于任何显卡。这是您可能会用于使用脚本中的更改的相同工具。
它不能解决通知自动运行脚本的问题。虽然我没有很好的通用解决方案,但常见的情况是检测何时存在外接显示器,因为笔记本电脑已连接到扩展坞。在这种情况下,您可以让脚本触发连接到扩展坞时触发的其他事物,例如添加或移除USB键盘或以太网。
谢谢sebastianwagner!
有了这些信息,我就可以在电视关闭的情况下成功启动我的Kodi媒体中心。 事实上,当电视机关闭时,英特尔驱动程序不想设置模式,并且稍后打开电视机时屏幕出现空白。
的科迪日志显示以下行:
WARNING: CXRandR::Query - output HDMI1 has no current mode, assuming disconnected
所以我创建了/etc/udev/rules.d/99-monitor-hotplug.rules以下行:
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/sbin/hotplugtv.sh"
内容/usr/sbin/hotplugtv.sh的(我的X服务器作为根):
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/root/.Xauthority
/bin/date 2>&1 >> /var/log/hotplugtv.log;
if [[ $(cat /sys/class/drm/card0-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
echo "TV connected!" >> /var/log/hotplugtv.log;
/bin/sleep 2s;
/usr/bin/xrandr --verbose --output HDMI1 --auto 2>&1 >> /var/log/hotplugtv.log;
else
echo "TV disconnected!" >> /var/log/hotplugtv.log;
fi
不要忘记重新加载udev规则,当你进行任何更改您的脚本(这被我逼疯了!):
udevadm control --reload-rules
小心禁用任何科迪屏幕保护程序,因为它们处于激活状态永远当你终于开机了电视。 另一方面,节能/ DPMS似乎工作正常。
对于正在寻找Windows解决方案的用户:http://stackoverflow.com/questions/1440285/how-to-detect-hot-plugging-of-monitor-in-a-win32-application http:// stackoverflow。 com/questions/3267722 /在监视器上显示热插拔事件http://stackoverflow.com/questions/5981520/detect-external-display-being-connected-or-removed-under-windows -7 – hippietrail 2011-05-13 08:12:00