Подтвердить что ты не робот

Запустите приложение OpenGL прямо из оконного терминала Linux

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


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

./visualdiagnostics

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


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

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

4b9b3361

Ответ 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, что было бы ужасно!: )

Ответ 2

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

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

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

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

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

**

Обновление:

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

Ответ 3

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

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

Ответ 4

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

Работает ли X на сервере?

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

  export DISPLAY=:0.0

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

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