代码之家  ›  专栏  ›  技术社区  ›  brianreavis

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

  •  11
  • brianreavis  · 技术社区  · 16 年前

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


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

    ./visualdiagnostics
    

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


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

    仅供参考:不,我是 试着让它在油灰或其他东西上碾过…我有一台显示器直接连接到服务器上。服务器安装了正确的视频驱动程序。

    4 回复  |  直到 16 年前
        1
  •  12
  •   JasonSmith    16 年前

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

    另外,您还标记了这个问题C,不过我从一个常见的Linux模式开始:一个带有bash shell脚本包装器的本机应用程序。如果必须的话,也许一旦你把事情做好,你就可以把这个功能折叠成C。

    正在检测x是否正在运行

    生根有很大帮助。一些有用的东西。

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

    利用现有的X会话

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

    你必须得到 DISPLAY XAUTHORITY 环境变量正确,一旦这样做,就可以使用现有的X显示。

    为了 显示 你可以假设 :0 或者你可以找到一个现有的X程序( x-session-manager 是GNOME标准),并从/proc/pid/environ读取其环境。变量采用键=值格式,由空字节分隔。例如,如果其PID为12345:

    cat /proc/12345/environ \
      | ruby -ne 'puts $_.split("\0").select {|e| e.starts_with? "DISPLAY=" }'
    

    为了 XSub 你也可以用同样的方法得到它。或者如果你喜欢猜测,那几乎总是 /home/whoever/.Xauthority

    一旦有了这两个变量,运行X代码就很容易了,例如:

    env DISPLAY=:0 XAUTHORITY=/home/brian/.Xauthority ./visualdiagnostics
    

    停止X

    如果你是根,这个很容易: /etc/init.d/gdm stop . killall Xorg 也会工作。

    如果你是一个用户,杀了你自己的 Xorg X-会话管理器 过程。(我欢迎其他人的意见,以规范的方式来做这件事。也许是一些数据库发送消息?)

    开始X

    我建议你 xinit 他的人生目标是发射X并运行一个程序。

    例如: xinit ./visualdiagnostics

    您还可以告诉xinit运行x的分辨率,x对您来说可能重要,也可能不重要。(这在下面的全屏部分很重要。)

    问题是,您将没有窗口管理器-没有最大化和最小化按钮。这不仅仅是化妆品。通常一个应用程序是无用的,因为弹出窗口不能被移动,或者你不能集中在正确的输入框上。但是,如果你有一个特殊的应用程序,它就足够了(见下面的全屏)。

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

    #!/bin/bash
    #
    # Start visualdiagnostics once xinit calls me.
    
    /usr/bin/metacity& # Or ratpoison, or fluxbox, or compiz, etc.
    exec ./visualdiagnostics
    

    执行(成为)主程序很重要,因为一旦第一个程序退出,X将关闭。

    全屏运行

    我对此不是百分之百肯定。一些想法:

    • 试用标准X -geometry 参数设置为左上角为0,0,水平和垂直大小为+X+Y。你怎么知道尺寸的?或者你在启动时硬编码 新信息技术 或者你可以问X服务器。 xwininfo -root 会告诉你,有一个XLIBAPI调用也会这样做,请检查xwininfo源代码。
    • 您的应用程序本身可以请求最大化和/或调整大小以填充屏幕。我不熟悉,但它肯定在X API中。
    • 一些更可配置的窗口管理器可以预先配置为已经最大化地运行。这可能是我个人首先要检查的。包装脚本可以创建 $HOME/.fluxboxrc 只需回显一些硬编码配置文件即可。

    总结

    其他人是对的。X不是严格必要的sine opengl可以在framebuffer上运行。然而,考虑到X的普及程度以及自动化它用于分发的工作量,我可能会将精力投入到X路径上,因为它可能更容易长期使用,即使有点复杂。

    (顺便说一下,我 真诚希望 当你说“终端机”时,你的意思是你在文本中。 慰问 不是 终端 那太糟糕了!:)

        2
  •  2
  •   yves Baumes    16 年前

    我不确定我的回答是否能帮到你。

    很久以前,当我还是学生的时候,我就通过安装帧缓冲区(frame buffer)来做到这一点(从一个只有终端的Linux安装中启动OpenGL应用程序)。只要我还记得,我需要重新编译内核(因为framebuffer是/是内核模块)。

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

    看看谷歌!;-)

    希望能有帮助…

    **

    更新:

    **
    What is frame buffer ?
    如何安装? Here there

        3
  •  1
  •   ntd    16 年前

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

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

        4
  •  0
  •   Reverend Gonzo    16 年前

    您想让监视器上的视频直接连接到计算机上吗?

    X是否在服务器上运行?

    如果x正在运行,可以

      export DISPLAY=:0.0
    

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

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