2010-12-09 7 views
0

Ich versuche, den X-Display zu öffnen, wie so:XOpenDisplay nicht von udev Ereignisse

disp = XOpenDisplay(NULL); 

Wenn ich laufe aus meinen Benutzern Shell es funktioniert gut, aber wenn es von einem udev Ereignisse ausgeführt (Ubuntu 10.10) Der Funktionsaufruf gibt NULL zurück. Ich habe mich gefragt, ob das etwas mit der abweichenden Umgebung zu tun hat, also habe ich XOpenDisplay (": 0.0") auch mal ausprobiert.

Weiß jemand, warum das passiert?

+0

Eigentlich rate ich es ist, weil X ein Multiuser-Server ist und ein Display-Handle im Kontext eines aktuellen X-Benutzers erworben werden muss, aber wenn jemand mich auf die Details von all dem hinweisen könnte, die hilfreich wären. – djp

Antwort

1

XOpenDisplay(NULL) würde die Umgebungsvariable DISPLAY untersuchen, die normalerweise nicht im Kontext von udev festgelegt ist. Um XOpenDisplay(something) (einschließlich something=NULL) verwenden zu können, benötigen Sie den Zugriffsschlüssel für die X-Server-Instanz.

Die Umgebungsvariable XAUTHORITY muss auf den Speicherort der Schlüsseldatei gesetzt werden, wenn Sie XOpenDisplay oder ein grafisches Programm verwenden möchten, das davon Gebrauch macht. Wenn diese env var leer ist, wird ~/.Xauthority als Fallback verwendet.

Der Versuch, ein grafisches Programm von udev zu starten, ist eine schlechte Idee (lies: etwas ist falsch in Ihrem Ansatz und Design): Sie kennen die X-Display-Nummer nicht. Sie können es auch nicht erraten, da es sehr wohl mehr als einen aktiven X-Server gibt. Und dann müssen Sie seine Schlüsseldatei haben, die nicht immer zu bestimmen oder zu erhalten ist. udev kann als root ausgeführt werden, aber es gibt Dinge wie NFS mounts mit root_squash, und die XAUTHORITY Variable, mit der Leute ihre Schlüsseldatei verschieben können.

Grafische Probleme funktionieren heutzutage so, dass der Benutzer oder die Desktopumgebung, die er benutzt, ein Hintergrundprogramm starten muss, das gezielt auf bestimmte Ereignisse wartet. Nur damit Sie nicht einfach in die Bildschirme der Leute eindringen können, sondern sich an ihr Ereignisbenachrichtigungssystem halten müssen.