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
残念ながら、一致するものは多くありませんが、写真にビデオカードが1つしかない限り、それほど重要ではありません。 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"
をフィルタリングしても、起動時にいくつかのイベントが発生するため、スクリプトでそれを考慮に入れることをお勧めします。
3つのオプションがあります。
change
ueventをリッスンします。上記のいずれの方法でも、何らかの方法でポーリングする必要があるため、最初のオプションを選択します。
この他の答え は正しい道にあります:あなたはudev
からDRMイベントを聞きたいです。
SBデバイスまたは外部ディスプレイのいずれかが(接続されていない)ときにコードを実行するPythonスクリプト を実装しました。その最小バージョンを以下に含めます。スクリプト(未テスト):
#!/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()
参照:
Sebastianwagnerに感謝します!
この情報により、テレビをオフにしてKodiメディアセンターを正常に起動することができました。実際、テレビの電源がオフのとき、Intelドライバーはモードを設定したくなく、後でテレビの電源を入れたときに空白の画面が表示されました。
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キーボードやイーサネットの追加や削除など、ドッキングステーションに接続するときにトリガーされる他の何かからスクリプトをトリガーすることができます。