我试图像这样打开X显示器:
disp = XOpenDisplay(NULL);
当我从我的用户shell运行它时它工作正常,但如果它是从udev事件(Ubuntu 10.10)运行,则函数调用返回NULL。我想知道这是否与不同的环境有关,所以尝试了XOpenDisplay(“:0.0”)也没有用。
有谁知道为什么会这样?
答案 0 :(得分:1)
XOpenDisplay(NULL)
将检查DISPLAY
环境变量,该变量通常不在udev上下文中设置。为了能够使用XOpenDisplay(something)
(包括something=NULL
),您需要访问X服务器实例的访问密钥。
如果要使用XAUTHORITY
或任何使用它的图形程序,XOpenDisplay
环境变量将设置为密钥文件的位置。如果此env var为空,则~/.Xauthority
将用作后备。
尝试从udev启动一些图形程序是一个坏主意(阅读:你的方法和设计出了问题):你不知道X显示数字。您也无法猜测,因为可能有多个X服务器处于活动状态。然后你需要有它的密钥文件,这个文件并不总是可以确定或获得。 udev可以以root用户身份运行,但有一些事情,例如带有root_squash
的NFS挂载,以及人们可以重定位其密钥文件的XAUTHORITY
变量。
现在,图形问题的工作方式是用户或他/她正在使用的桌面环境必须启动专门监听某些事件的后台程序。这样你就不能简单地侵入人们的屏幕,而必须遵守他们的事件通知系统。