如何为“监视器插入”创建回调“在intel图形上?

我有一个带有intel图形的eeepc。我想将一个脚本挂钩到通过VGA插入监视器的事件。怎么做?     
已邀请:
作为原始解决方案,您可以在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"
,我仍然会在启动时遇到一些事件,因此您可能希望在脚本中以某种方式考虑这一点。     
你有三个选择: 轮询sysfs中的特定条目。 使用inotify检测sysfs中的更改。 使用带有NETLINK_KOBJECT_UEVENT的netlink套接字,并为所需的设备监听
change
uevent。 在提到的任何方式中,你仍然需要以某种方式进行轮询,所以我只选择第一种选择。     
另一个答案是在正确的道路上:您想要收听来自
udev
的DRM事件。 我已经实现了一个Python脚本,当USB设备或外部显示器被插入时,它会运行一些代码。我在下面包含该脚本的最小版本(未经测试):
#!/usr/bin/env python3
import pyudev

def udev_event_received(device):
    ...  # Your code here!

context = pyudev.Context()
monitor_drm = pyudev.Monitor.from_netlink(context)
monitor_drm.filter_by(subsystem='drm')
observer_drm = pyudev.MonitorObserver(monitor_drm, callback=udev_event_received, daemon=False)

observer_drm.start()

# This will prevent the program from finishing:
observer_drm.join()
也可以看看: 如果(未)插入USB设备,如何在不需要root权限的情况下运行代码? 我如何在Python中用Linux监听'usb device inserted'事件? pyudev文档 - 异步监控     
谢谢sebastianwagner! 有了这些信息,我就能够在电视关闭的情况下成功启动我的Kodi媒体中心。 实际上,当电视关闭时,英特尔驱动程序不想设置模式,当我稍后打开电视时,我得到一个空白屏幕。 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服务器以root身份运行):
#!/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
小心禁用Kodi中的任何屏幕保护程序,因为它们会在您最终打开电视时永远保持激活状态。 另一方面,节能/ DPMS似乎工作正常。     
假设您正在运行X,脚本可以解析xrandr的输出以查看连接的监视器。这适用于任何图形卡。这是您可能用于在脚本中使用更改的工具。 它无法解决自动运行脚本的通知问题。虽然我没有很好的通用解决方案,但常见的情况是检测外部显示器何时存在,因为笔记本电脑连接到扩展坞。在这种情况下,您可以让脚本触发连接到扩展坞时触发的其他内容,例如添加或删除USB键盘或以太网。     

要回复问题请先登录注册