直接从无窗口的Linuxterminal启动OpenGL应用程序

如何才能让OpenGL应用程序直接从terminal(Ubuntu Server 9.04)全屏运行? 我已经开发了一个在我的服务器上进行可视化诊断的应用程序,但是,我不完全确定让它在无窗口环境中运行的最佳方法。


理想情况下,我会运行我的程序:

./visualdiagnostics 

并启动了OpenGL应用程序。 然后,通过一个简单的Ctrl+X键绑定,我会杀了应用程序,并返回到terminal。


我是否需要安装X11,然后以某种方式从程序中启动它? 什么是检测它是否已经运行的最好方法,并在必要时启动/停止它?

而且,仅供参考:不,我不是试图让这个跑过腻子或任何东西…我有一个直接连接到服务器的监视器。 服务器安装了适当的video驱动程序。

Solutions Collecting From Web of "直接从无窗口的Linuxterminal启动OpenGL应用程序"

有几个部分给你的任务。 请记住,其中的一些可以是特定于发行版的。 但是既然你说过Ubuntu,我们会说Ubuntu!

此外,您标记了这个问题C,但是我从一个普通的Linux模式开始:一个本地应用程序与Bash shell脚本包装。 也许一旦你把事情做好,你可能会把这个功能折叠到C中,如果你必须的话。

检测X是否正在运行

作为根可以帮助很多。 有些事情是有效的。

  1. pgrep Xorg
  2. 检查/var/lib/gdm/:0.Xauth是否存在。 即使没有人登录,但GDM正在运行,这将在那里。
  3. ls -l /home/*/.Xauthority (即使你不是root,你至少可以确认是否在运行X.

捎带现有的X会话

你没有具体提到它,但是如果你是在控制台的根,或者如果你想运行应用程序作为已经登录的同一用户,这很容易。

您必须正确使用DISPLAYXAUTHORITY环境变量,一旦您完成,您可以使用现有的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 stopkillall Xorg也会工作。

如果你是一个用户,就杀掉你自己的Xorgx-session-manager进程。 (我欢迎其他人提供这样的规范方法,也许有些dbus-send消息?)

启动X

我会推荐xinit他的目标是发射X并运行一个程序。

例如: xinit ./visualdiagnostics

你也可以告诉xinit运行X的分辨率是多少对你来说可能是重要的。 (这在下面的全屏部分变得重要。)

这个问题是你将没有窗口管理器 – 没有最大化和最小化按钮。 这不只是美容。 通常一个应用程序是无用的,因为一个弹出窗口不能移动,或者你不能专注于正确的输入字段。 但是,如果您有一个特殊的应用程序可能就足够了(请参阅下面的全屏幕)。

下一步将是我对所有事情的回答: 另一个shell脚本包装器 ! 一些简单的启动窗口管理器,然后成为你的程序应该工作。

 #!/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会告诉你,还有一个xlib API调用,也会这样做 – 检查xwininfo源我猜。
  • 您的应用程序本身可以请求最大化和/或调整大小来填充屏幕。 我不熟悉,但绝对是在X API。
  • 一些更具可配置性的窗口管理器可以预先配置为已经最大化运行。 这可能是我个人首先要检查的。 你的包装脚本可以创建一个$HOME/.fluxboxrc只需要回显一些硬编码的配置>文件。

概要

其他人是对的。 X不是严格必要的正弦OpenGL可以运行在帧缓冲区。 然而,考虑X是多么普遍,以及为了分发而自动化了多少工作,我可能会将我的努力投入X路由,因为它可能更容易长期,尽管它有点复杂。

(顺便说一句,我真诚希望当你说“终端”,你的意思是你在文本控制台 ,而不是gnome-terminal这将是可怕的!:)

那么我显然不确定我的答案可能会帮助你。

很久以前,当我是学生的时候,我设法通过安装帧缓冲区来完成这个任务(从一个只有linux的终端启动一个openGL应用程序)。 只要我记得我需要重新编译我的内核(因为framebuffer是/是一个内核模块)。

这可能是5年前的debian distrib,我不知道现在它是如何工作的最新debian distrib作为Ubuntu。 也许framebuffer是静态编译在Ubuntu默认提供的二进制内核中的。 也许不会。 也许framebuffer现在是不相关的…或者我可能是完全错误的,并不记得5年前我自己的冒险的每一个细节。

看看Google! 😉

希望它会帮助…

**

更新:

**
什么是帧缓冲区?
如何安装? 在这里或那里

正如yves所指出的,如果你使用framebuffer,你可以避免运行X服务器。 实际上,framebuffer模块通常是可用的(例如,它们在内核启动时使用tux徽标,或在后台使用带有花式图像的文本终端),这取决于您使用的分配和设置。

内核方面是相当原始的,所以我建议使用一些更高级别的库,如DirectFB 。 framebuffer可以没有问题地使用,但不要期望与完整的X服务器相同的成熟度级别。

您是否试图将视频直接连接到计算机上?

X在服务器上运行?

如果X正在运行,你可以这样做

  export DISPLAY=:0.0 

它告诉X应用程序连接到本地主机上的X服务器,而不是来自哪里。

如果你真的在本地登录(从直接终端)…是的,你需要安装并运行X.