您的任务有几个部分。请记住,其中一些可能是特定于发行版的;但是既然你说的是 Ubuntu,我们就说 Ubuntu!
您还标记了这个问题 C 但是我从一个常见的 Linux 模式开始:一个带有 Bash shell 脚本包装器的本机应用程序。也许一旦你把事情做好了,如果你必须的话,你可能会将该功能折叠到 C 中。
检测X是否在运行
成为 root 可以帮助很多。一些有用的东西。
pgrep Xorg
- 检查
/var/lib/gdm/:0.Xauth是否存在。即使没有人登录但 GDM 正在运行,它也会存在。
-
ls -l /home/*/.Xauthority(即使您不是 root,您至少可以确认 您 是否正在运行 X。
捎带现有的 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
停止 X
如果您是 root,这很容易:/etc/init.d/gdm stop。 killall Xorg 也可以。
如果您是用户,请终止您自己的 Xorg 或 x-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 路线上,因为从长远来看它可能会更容易,即使它有点复杂。
(顺便说一句,我真诚地希望当你说“终端”时,你的意思是你在文本 console,而不是 gnome-terminal 那太糟糕了!:)