Ваша задача состоит из нескольких частей. Имейте в виду, что часть этого может быть очень специфичной для дистрибутива; но так как вы сказали Ubuntu, мы поговорим об Ubuntu!
Также вы пометили этот вопрос C, однако я начинаю с обычного шаблона Linux: нативного приложения с оболочкой сценария Bash. Возможно, как только вы все заработаете, вы можете сложить эту функциональность в C, если потребуется.
Определение, запущен ли X
Быть root может очень помочь. Некоторые вещи, которые работают.
pgrep Xorg
- Проверьте, существует ли
/var/lib/gdm/:0.Xauth
. Это произойдет, даже если никто не вошел в систему, но GDM работает.
ls -l /home/*/.Xauthority
(Даже если вы не root, вы можете хотя бы подтвердить, что у вас работает X.
Копирование существующего сеанса X
Вы специально не упомянули об этом, но если вы являетесь пользователем root на консоли или если вы хотите запустить приложение от имени того же пользователя, который уже вошел в систему, это довольно просто.
Вы должны правильно настроить переменные окружения DISPLAY
и XAUTHORITY
, и как только вы это сделаете, вы сможете использовать существующий дисплей X.
Для DISPLAY
вы можете просто предположить :0
или вы можете найти существующую программу X (x-session-manager
является стандартом GNOME) и прочитать ее окружение из / proc / PID / environment. Переменные имеют формат ключ = значение, разделенный нулевым байтом. Например, если его PID равен 12345:
cat /proc/12345/environ \
| ruby -ne 'puts $_.split("\0").select {|e| e.starts_with? "DISPLAY=" }'
Для XAUTHORITY
вы можете получить его таким же образом. Или, если вы предпочитаете угадывать, это почти всегда /home/whoever/.Xauthority
Если у вас есть эти две переменные, запустить код X просто, например:
env DISPLAY=:0 XAUTHORITY=/home/brian/.Xauthority ./visualdiagnostics
Остановка X
Это легко, если вы root: /etc/init.d/gdm stop
. killall Xorg
тоже будет работать.
Если вы пользователь, убейте свой собственный процесс Xorg
или x-session-manager
. (Я бы приветствовал мнение других людей о каноническом способе сделать это. Может быть, какое-нибудь сообщение dbus-send?)
Начиная с X
Я бы порекомендовал xinit
, цель которого в жизни - запустить X и запустить ровно одну программу.
Например: xinit ./visualdiagnostics
Вы также можете указать xinit, какое разрешение для запуска X может иметь или не быть важным для вас. (Это становится важным в полноэкранном разделе ниже.)
Проблема в том, что у вас не будет оконного менеджера & mdash; нет максимизировать и минимизировать кнопки. Это не просто косметика. Обычно приложение бесполезно, потому что всплывающее окно не может быть перемещено, или вы не можете сфокусироваться на правильном поле ввода. Однако, если у вас есть специальное приложение, этого может быть достаточно (см. Полный экран ниже).
Следующим шагом будет мой ответ на все вопросы: еще одна оболочка сценария оболочки ! Что-то простое, которое запускает оконный менеджер, а затем становится вашей программой, должно работать.
#!/bin/bash
#
# Start visualdiagnostics once xinit calls me.
/usr/bin/metacity& # Or ratpoison, or fluxbox, or compiz, etc.
exec ./visualdiagnostics
Важно выполнить (стать) основной программой, потому что, как только эта первая программа завершится, X завершит работу.
Запуск в полноэкранном режиме
Я не уверен на 100% в этом. Некоторые идеи:
- Попробуйте стандартные параметры X
-geometry
, чтобы установить 0,0 в качестве верхнего левого угла и + x + y для вашего горизонтального и вертикального размера. Как вы узнаете размер? Либо вы жестко запрограммировали его, когда запустили xinit
, либо вы могли бы спросить X-сервер. xwininfo -root
сообщит вам, и есть вызов API xlib, который тоже это сделает - проверьте источник xwininfo, я думаю.
- Ваше приложение может запросить максимизацию и / или изменение размера для заполнения экрана. Я не знаком, но это определенно в X API.
- Некоторые из более настраиваемых оконных менеджеров могут быть предварительно сконфигурированы для работы в развернутом виде. Это, наверное, то, что я лично проверю в первую очередь. Ваш скрипт-обертка может создать
$HOME/.fluxboxrc
, просто повторяя некоторые жестко запрограммированные конфиги> файла.
Краткое описание
Остальные правы. X не является обязательным условием, так как OpenGL может работать против кадрового буфера. Однако, учитывая, насколько вездесущим является X и сколько работы ушло на его автоматизацию для дистрибутивов, я бы, вероятно, вложил свои усилия в маршрут X, поскольку он может быть проще в долгосрочной перспективе, даже если он немного запутан.
(Кстати, я искренне надеюсь когда вы говорите "терминал", вы имеете в виду, что вы находитесь в тексте консоль , а не gnome-терминал , что будь ужасным! :) 1098 *