Запустите приложение OpenGL прямо из терминала Linux без окон - PullRequest
11 голосов
/ 12 октября 2009

Как именно можно заставить приложение OpenGL запускать полноэкранный режим прямо из терминала (Ubuntu Server 9.04)? Я разработал приложение для визуальной диагностики на своем сервере, но я не совсем уверен, что это лучший способ запустить его в среде без окон.


В идеале я бы запустил свою программу:

./visualdiagnostics

и запустите приложение OpenGL. Затем с помощью простой привязки ключа Ctrl+X я убью приложение и вернусь к терминалу.


Нужно ли устанавливать X11 и как-то запускать его изнутри программы? Как лучше всего определить, запущен ли он, и, если необходимо, запустить / остановить его?

И, к вашему сведению: нет, я не пытаюсь заставить это работать поверх Putty или чего-то еще ... У меня монитор подключен прямо к серверу. На сервере установлены правильные видеодрайверы.

Ответы [ 4 ]

12 голосов
/ 16 октября 2009

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

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

Определение, запущен ли X

Быть root может очень помочь. Некоторые вещи, которые работают.

  1. pgrep Xorg
  2. Проверьте, существует ли /var/lib/gdm/:0.Xauth. Это произойдет, даже если никто не вошел в систему, но GDM работает.
  3. 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 *

2 голосов
/ 12 октября 2009

Ну, я явно не уверен, что мой ответ может вам помочь.

Давным-давно, когда я был студентом, мне удалось это сделать (запустить приложение openGL из установки Linux только с терминала), установив фрейм-буфер. Насколько я помню, мне нужно было перекомпилировать ядро ​​(так как фреймбуфер был / является модулем ядра).

Это было возможно 5 лет назад на дистрибутиве Debian, и я не знаю, как это работает сейчас для современного дистрибутива Debian под Ubuntu. Возможно, framebuffer статически скомпилирован в бинарном ядре, предоставляемом по умолчанию в Ubuntu. Возможно, нет. Может быть, фреймбуфер сейчас не имеет значения ... Или я могу быть совершенно не прав и не вспоминаю все детали моего собственного приключения 5 лет назад ..

Посмотрите на Google! ; -)

Надеюсь, это поможет ...

**

Обновление:

**
Что такое буфер кадров?
Как это установить? Здесь или там

1 голос
/ 12 октября 2009

Как указал Ив, вы можете избежать запуска X-сервера, если используете кадровый буфер. На самом деле, модули фрейм-буфера часто еще доступны (например, они используются, чтобы иметь логотип tux при запуске ядра или текстовый терминал с причудливыми изображениями на заднем плане), это в любом случае зависит от дистрибутива и используемых вами настроек.

Сторона ядра довольно примитивна, поэтому я бы предложил использовать библиотеку более высокого уровня, такую ​​как DirectFB . Кадровый буфер можно использовать без проблем, но не ожидайте того же уровня зрелости, что и у полноценного X-сервера.

0 голосов
/ 12 октября 2009

Вы пытаетесь подключить видео к монитору, подключенному напрямую к компьютеру?

X работает на сервере?

Если X запущен, вы можете сделать

  export DISPLAY=:0.0

, который указывает X-приложениям подключаться к X-серверу на локальном хосте, а не откуда «вы пришли».

Если вы на самом деле входите в систему локально (с прямого терминала) ... да, вам нужно установить и запустить X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...