gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:59:28 27 4
gpt4 key购买 nike

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

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

./visualdiagnostics

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

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

仅供引用:不,我不想让它运行在 Putty 或任何东西上......我有一个直接连接到服务器的显示器。服务器安装了正确的视频驱动程序。

最佳答案

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

你也标记了这个问题 C 但是我从一个常见的 Linux 模式开始:一个带有 Bash shell 脚本包装器的 native 应用程序。也许一旦你让事情运行良好,你可能会在必要时将该功能折叠到 C 中。

检测 X 是否正在运行

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

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

  • 搭载现有的 X session

    您没有特别提及它,但如果您是控制台的 root 用户,或者您想以已经登录的同一用户身份运行应用程序,这很容易。

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

    对于 DISPLAY你可能只是假设 :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=" }'

    对于 XAUTHORITY你可以用同样的方式得到它。或者,如果您更喜欢猜测,几乎总是 /home/whoever/.Xauthority
    一旦你有了这两个变量,运行 X 代码就很容易了,例如:
    env DISPLAY=:0 XAUTHORITY=/home/brian/.Xauthority ./visualdiagnostics

    停止 X

    如果你是 root,这个很容易: /etc/init.d/gdm stop . killall 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 那会很糟糕!:)

    关于c - 直接从无窗口的 Linux 终端启动 OpenGL 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1552043/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com