私は次のようにXディスプレイを開こうとしています:
disp = XOpenDisplay(NULL);
これをユーザーシェルから実行すると正常に動作しますが、udevイベント(Ubuntu 10.10)から実行すると、関数呼び出しはNULLを返します。これは環境の違いと関係があるのではないかと思ったので、XOpenDisplay( ":0.0")も試してみましたが、役に立ちませんでした。
なぜこれが起こるのか誰かが知っていますか?
XOpenDisplay(NULL)
DISPLAY
通常はudevコンテキストで設定されない環境変数を検査します。XOpenDisplay(something)
(を含む)を使用できるようにするsomething=NULL
には、Xサーバーインスタンスへのアクセスキーが必要です。
XAUTHORITY
環境変数は、キーファイルXOpenDisplay
またはそれを使用するグラフィカルプログラムを使用する場合は、その場所に設定する必要があります。このenvvarが空の場合~/.Xauthority
、フォールバックとして使用されます。
udevからグラフィカルプログラムを起動しようとするのは悪い考えです(読んでください:アプローチとデザインに何か問題があります):Xディスプレイ番号がわかりません。複数のXサーバーがアクティブになっている可能性があるため、推測することもできません。そして、あなたはそのキーファイルを持っている必要があります、それはどちらかを決定または取得することが常に可能であるとは限りません。udevはrootとして実行できますが、NFSマウントのようなものroot_squash
や、XAUTHORITY
ユーザーがキーファイルを再配置できる変数などがあります。
最近のグラフィカルな問題の仕組みは、ユーザーまたはユーザーが使用しているデスクトップ環境で、特定のイベントを特にリッスンするバックグラウンドプログラムを開始する必要があることです。単に人々の画面に侵入することはできませんが、彼らのイベント通知システムに従わなければならないためです。