直接从无窗口Linux终端启动OpenGL应用程序

时间:2009-10-11 23:06:15

标签: c linux opengl

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


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

./visualdiagnostics

并启动OpenGL应用程序。然后,通过一个简单的Ctrl+X键绑定,我将杀死该应用程序并返回终端。


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

和FYI:不,我试图让它在Putty或任何东西上运行......我有一台显示器直接连接到服务器。服务器安装了正确的视频驱动程序。

4 个答案:

答案 0 :(得分:12)

您的任务有几个部分。请记住,其中一些可能非常特定于发行版;但既然你说Ubuntu我们会说Ubuntu!

你也标记了这个问题C但是我开始使用一个常见的Linux模式:一个带有Bash shell脚本包装器的本机应用程序。也许一旦你把事情搞好了,你就可以将这个功能折叠成C语言。

检测X是否正在运行

成为root可以提供很多帮助。一些有用的东西。

  1. pgrep Xorg
  2. 检查/var/lib/gdm/:0.Xauth是否存在。即使没有人登录但GDM正在运行,这也会存在。
  3. ls -l /home/*/.Xauthority(即使你不是root用户,你至少可以确认是否正在运行X.
  4. 捎带现有的X会话

    您没有特别提及它,但如果您是控制台的root用户,或者如果您想以已登录的同一用户身份运行应用程序,则非常简单。

    您必须正确获取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 那太可怕了!:)

答案 1 :(得分:2)

嗯,我显然不确定我的回答可能会帮助你。

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

这可能是5年前的一个debian发行版,我不知道它现在如何用于最新的debian发行版作为Ubuntu。也许framebuffer是在默认使用Ubuntu提供的二进制内核中静态编译的。也许不吧。也许现在帧缓冲是无关紧要的...或者我可能完全错了,而且在5年前我也不记得自己冒险的每一个细节......

了解Google吧! ; - )

希望它会有所帮助...

**

更新

**
What is frame buffer ?
怎么安装呢? Herethere

答案 2 :(得分:1)

正如yves指出的那样,如果使用帧缓冲,则可以避免运行X服务器。实际上,帧缓冲模块通常是可用的(例如,它们用于在内核启动时具有tux徽标或在背景中具有花哨图像的文本终端),这无论如何取决于您使用的分布和设置。

内核方面非常原始,所以我建议使用一些更高级别的库,例如DirectFB。帧缓冲可以毫无问题地使用,但不要期望与完整的X服务器相同的成熟度级别。

答案 3 :(得分:0)

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

X是否在服务器上运行?

如果X正在运行,您可以执行

  export DISPLAY=:0.0

告诉X应用程序连接到localhost上的X服务器,而不是“你来自哪里。”

如果您实际在本地登录(从直接终端)...是的,您需要安装X并运行。

相关问题