Ответ 1
В вашей задаче есть несколько частей. Имейте в виду, что некоторые из них могут быть очень специфичными для дистрибутива; но, поскольку вы сказали Ubuntu, мы поговорим об Ubuntu!
Также вы отметили этот вопрос C, но я начинаю с общего шаблона Linux: собственное приложение с оболочкой Bash shell script. Возможно, после того, как вы добьетесь хороших результатов, вы можете сбросить эту функциональность на 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/environ. Переменные находятся в формате key = value, ограниченном нулевым байтом. Например, если его 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, которое может или не может быть важно для вас. (Это становится важным в полноэкранном разделе ниже.)
Проблема с этим - у вас не будет оконного менеджера — не увеличивайте и не уменьшайте кнопки. Это не просто косметика. Обычно приложение бесполезно, потому что всплывающее окно не может быть перемещено или вы не можете сосредоточиться на правильном поле ввода. Однако, если у вас есть специальное приложение, этого может быть достаточно (см. Полный экран ниже).
Следующим шагом будет мой ответ на все: оболочка script. Что-то простое, которое запускает диспетчер окон, а затем становится вашей программой, должно работать.
#!/bin/bash
#
# Start visualdiagnostics once xinit calls me.
/usr/bin/metacity& # Or ratpoison, or fluxbox, or compiz, etc.
exec ./visualdiagnostics
Важно, чтобы exec (стать) основной программой, потому что, как только эта первая программа выйдет, X выключится.
Запуск полноэкранного режима
Я не уверен на 100%. Некоторые идеи:
- Попробуйте стандартные параметры X
-geometry
, чтобы установить 0,0 в качестве верхнего левого угла и + x + y для горизонтального и вертикального размера. Откуда вы знаете размер? Либо вы жестко закодировали его при запускеxinit
, либо вы могли спросить X-сервер.xwininfo -root
расскажет вам, и есть API-интерфейс xlib API, который тоже сделает это. Посмотрите источник xwininfo, который я предполагаю. - Ваше приложение может запросить максимизацию и/или изменение размера, чтобы заполнить экран. Я не знаком, но это определенно в X API.
- Некоторые из более конфигурируемых оконных менеджеров могут быть предварительно настроены для того, чтобы вы уже максимизировали. Вероятно, это то, что я лично проверил бы в первую очередь. Ваша обертка script может создать
$HOME/.fluxboxrc
, просто повторяя некоторые жестко закодированные конфиги > файл.
Резюме
Другие правы. X не является строго необходимым синусом OpenGL может работать против фреймбуфера. Однако, учитывая, насколько вездесущим является X, и как много работы было посвящено автоматизации его для дистрибутивов, я, вероятно, инвестирую свои усилия в маршрут X, поскольку это может быть проще долгосрочного, хотя и немного запутанного.
(Кстати, я искренне надеюсь, что когда вы скажете "терминал", вы имеете в виду, что вы находитесь в текстовой консоли, а не gnome-terminal, что было бы ужасно!: )