如何让OpenGL应用程序直接从终端(Ubuntu Server 9.04)运行全屏?我在我的服务器上开发了一个可视化诊断应用程序,但是,我并不完全确定在无窗口环境中运行它的最佳方法。
理想情况下,我会运行我的程序:
./visualdiagnostics
并启动OpenGL应用程序。然后,通过一个简单的Ctrl+X
键绑定,我将杀死该应用程序并返回终端。
我是否需要安装X11然后以某种方式从程序中启动它?什么是检测它是否已经运行的最佳方法,并在必要时启动/停止它?
和FYI:不,我不试图让它在Putty或任何东西上运行......我有一台显示器直接连接到服务器。服务器安装了正确的视频驱动程序。
答案 0 :(得分:12)
您的任务有几个部分。请记住,其中一些可能非常特定于发行版;但既然你说Ubuntu我们会说Ubuntu!
你也标记了这个问题C但是我开始使用一个常见的Linux模式:一个带有Bash shell脚本包装器的本机应用程序。也许一旦你把事情搞好了,你就可以将这个功能折叠成C语言。
成为root可以提供很多帮助。一些有用的东西。
pgrep Xorg
/var/lib/gdm/:0.Xauth
是否存在。即使没有人登录但GDM正在运行,这也会存在。ls -l /home/*/.Xauthority
(即使你不是root用户,你至少可以确认你是否正在运行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
如果您是root用户,那么这个很容易:/etc/init.d/gdm stop
。 killall Xorg
也会有用。
如果您是用户,请终止自己的Xorg
或x-session-manager
进程。 (我欢迎其他人以规范的方式来做这个。也许有些dbus-send消息?)
我建议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%肯定。一些想法:
-geometry
参数将0,0设置为左上角,将+ x + y设置为水平和垂直尺寸。你怎么知道它的大小?您可以在启动xinit
时对其进行硬编码,也可以向X服务器询问。 xwininfo -root
将告诉您,并且还有一个xlib API调用也会这样做 - 我猜测检查xwininfo源。$HOME/.fluxboxrc
>文件。其他人是对的。 X不是必需的正弦OpenGL可以对帧缓冲区运行。然而,考虑到无处不在的X以及自动化分配的工作量,我可能会将我的努力投入X路线,因为即使它有点复杂也可能更容易长期使用。
(顺便说一句,我真诚地希望当你说“终端”时你的意思是你在文本控制台,而不是 gnome-terminal 那太可怕了!:)
答案 1 :(得分:2)
嗯,我显然不确定我的回答可能会帮助你。
很久以前,当我还是学生时,我设法通过安装帧缓冲区来实现(从终端只有Linux安装启动一个openGL应用程序)。只要我记得我需要重新编译我的内核(因为framebuffer是/是一个内核模块)。
这可能是5年前的一个debian发行版,我不知道它现在如何用于最新的debian发行版作为Ubuntu。也许framebuffer是在默认使用Ubuntu提供的二进制内核中静态编译的。也许不吧。也许现在帧缓冲是无关紧要的...或者我可能完全错了,而且在5年前我也不记得自己冒险的每一个细节......
了解Google吧! ; - )
希望它会有所帮助...
**
**
What is frame buffer ?
怎么安装呢? Here或there
答案 2 :(得分:1)
正如yves指出的那样,如果使用帧缓冲,则可以避免运行X服务器。实际上,帧缓冲模块通常是可用的(例如,它们用于在内核启动时具有tux徽标或在背景中具有花哨图像的文本终端),这无论如何取决于您使用的分布和设置。
内核方面非常原始,所以我建议使用一些更高级别的库,例如DirectFB。帧缓冲可以毫无问题地使用,但不要期望与完整的X服务器相同的成熟度级别。
答案 3 :(得分:0)
您是否尝试将视频直接连接到计算机?
X是否在服务器上运行?
如果X正在运行,您可以执行
export DISPLAY=:0.0
告诉X应用程序连接到localhost上的X服务器,而不是“你来自哪里。”
如果您实际在本地登录(从直接终端)...是的,您需要安装X并运行。