25

Intelグラフィックスを搭載したeeepcを持っています。VGA経由で接続されたモニターのイベントにスクリプトをフックしたいと思います。どうやってするか?

4

5 に答える 5

29

大まかな解決策として、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"

udevhotplug.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"、起動時にいくつかのイベントが発生するので、スクリプトでそれを何らかの形で考慮に入れることをお勧めします。

于 2011-04-19T05:07:30.930 に答える
6

この他の答えは正しい道にあります:あなたはからのDRMイベントを聞きたいですudev

USBデバイスまたは外部ディスプレイのいずれかが(接続されていない)ときにコードを実行する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()

参照:

于 2018-10-01T16:39:11.667 に答える
4

3つのオプションがあります。

  1. sysfsの特定のエントリをポーリングします。
  2. inotifyを使用してsysfsの変更を検出します。
  3. NETLINK_KOBJECT_UEVENTでnetlinkソケットを使用し、change必要なデバイスのueventをリッスンします。

上記のいずれの方法でも、何らかの方法でポーリングする必要があるため、最初のオプションを選択します。

于 2011-04-19T19:36:47.693 に答える
3

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はうまく機能しているようです。

于 2015-06-21T14:06:15.620 に答える
2

Xを実行していると仮定すると、スクリプトはxrandrの出力を解析して、接続されているモニターを確認できます。これは、どのグラフィックカードでも機能するはずです。これは、スクリプトの変更を利用するためにおそらく使用するツールと同じです。

スクリプトを自動的に実行する通知の問題は解決されません。私には優れた一般的な解決策はありませんが、ラップトップがドッキングステーションに接続されているために、外部モニターが存在することを検出するのが一般的なケースです。この場合、USBキーボードやイーサネットの追加や削除など、ドッキングステーションに接続するときにトリガーされる他の何かからスクリプトをトリガーすることができます。

于 2013-11-11T03:14:13.743 に答える