XOpenDisplay терпит неудачу из события udev - PullRequest
0 голосов
/ 09 декабря 2010

Я пытаюсь открыть X дисплей так:

disp = XOpenDisplay(NULL);

Когда я запускаю это из своей пользовательской оболочки, она работает нормально, но если она запускается из события udev (Ubuntu 10.10), вызов функции возвращает NULL. Интересно, это как-то связано с другой средой, поэтому я попробовал XOpenDisplay (": 0.0"), но безрезультатно.

Кто-нибудь знает, почему это происходит?

1 Ответ

1 голос
/ 09 декабря 2010

XOpenDisplay(NULL) будет проверять переменную окружения DISPLAY, которая обычно не устанавливается в контексте udev.Чтобы иметь возможность использовать XOpenDisplay(something) (включая something=NULL), вам необходим ключ доступа к экземпляру X-сервера.

Переменная среды XAUTHORITY должна быть указана в месте расположения файла ключа, еслиВы хотите использовать XOpenDisplay или любую графическую программу, которая его использует.Если этот env var пустой, ~/.Xauthority используется как запасной вариант.

Попытка запустить некоторую графическую программу из udev - плохая идея (читай: что-то не так в вашем подходе и дизайне): вы нене знаю номер дисплея XВы также не можете догадаться, потому что может быть более одного активного X-сервера.И тогда вам нужен файл ключа, который не всегда можно определить или получить.udev может работать как root, но есть такие вещи, как монтирование NFS с root_squash и переменная XAUTHORITY, с помощью которой люди могут перемещать свой ключевой файл.

В наши дни графические проблемы работают так, что пользовательили используемая им среда рабочего стола должна запустить фоновую программу, специально прослушивающую определенные события.Просто для того, чтобы вы не могли просто вторгаться на чужие экраны, но должны соблюдать их систему уведомлений о событиях.

...