【问题标题】:GTK: How to ignore "can't open display" errors?GTK:如何忽略“无法打开显示”错误?
【发布时间】:2010-07-19 13:17:33
【问题描述】:

我已经为 D 编程语言编写了一些使用 gtkD 绑定的 GTK 程序,这些程序原本是控制台应用程序,但能够在屏幕上显示绘图并将它们保存到文件中。我想在我只有基于控制台的 SSH 访问权限的机器上运行这些,这意味着这些图不会显示在屏幕上,但仍会写入文件。

当我调用 Main.init() 时,我得到一个 Gtk-WARNING **: cannot open display,如预期的那样。当我改为调用 Main.initCheck() 并忽略错误时,我只是在稍后的执行中遇到更多与缺少屏幕相关的错误。

是否有一些简单的方法可以让我的程序忽略没有可用屏幕的事实,将其所有的屏幕绘制到某个虚拟设备(相当于 /dev/null 的图形)并仍然实际绘制到 Pixmaps 和 Pixbufs (将绘图保存到文件所必需的)并运行应用程序的非基于 GUI 的部分?

编辑:如果应用程序启动一个窗口并阻塞事件循环,理想的做法是立即关闭窗口(或一开始就没有成功打开它)并继续运行非程序的基于 GUI 的部分。如果这是不可能的,我可以通过确保不启动任何窗口来解决它。

此外,Pixbufs 和 Pixmaps 似乎在没有屏幕的情况下无法工作。我尝试绘制到 Pixmap,从中创建一个 Pixbuf,然后在调用 Main.checkInit() 并忽略错误或没有 init 语句之后将结果保存到文件中,无论哪种方式 GTK 都会抱怨缺少屏幕。

【问题讨论】:

  • 我可以很容易地看到 GUI 工具包的开发人员甚至从未考虑过有人想要在没有 GUI 的情况下运行 GUI 应用程序。通常,这没有任何意义。事实上,如果有可能,我会比没有可能更惊讶。这就像尝试在没有标准输入、标准输出或标准错误的情况下运行控制台应用程序。事情不是那样的。我明白为什么在这种情况下你会想要它,但你正在做一些非常不正常的事情。如果没有 GUI(无论是通过命令行标志还是通过检测它),将您的应用程序更改为仅跳过图形内容似乎更合理。
  • @Johnathan:我想更改我的应用程序,但似乎不可能将我的绘图库移植到完全不同的图形后端(最终可能会发生,但我不觉得喜欢在短期内做)。

标签: user-interface gtk d gtkd dev-null


【解决方案1】:

我相信最简单的解决方案是仅使用GdkPixbufs 来处理您的绘图;据我所知,gdk-pixbuf 库只处理内存中的 pixbufs,不需要窗口系统。保持代码的处理和显示部分严格分开。如果你这样做,那么没有屏幕应该没关系。您甚至可以创建一个命令行选项来禁用在屏幕上绘图。

您也可以使用GtkOffscreenWindow,但这仅在 GTK 2.20 之后才可用,据我所知,D 绑定最多只能覆盖 2.18。

或者,您可以在 SSH 会话中使用 X 转发;在 SSH 命令行上使用 -X 或 -Y。有关详细信息,请参阅您的 SSH 手册。如果您在通过 SSH 连接的机器上运行 X 服务器,则绘图可以显示在本地机器的屏幕上。

【讨论】:

    【解决方案2】:

    如果没有服务器,像素图将无法工作 - 根据定义(在 X 术语中),它们是存储在 X 服务器上的图像资源。但是,Pixbuf 存储在客户端应用程序中,它们应该可以在没有 X 的情况下工作。

    如果您需要像素图但不想绘制图形,您有两种选择:

    1. 通过传递-X 标志启用SSH X 隧道。在这种情况下,您的应用将能够使用本地 X 服务器。
    2. 使用 Xvfb - 它是一个完全不输出的虚拟 X 服务器,所有图形都存储在内存中。

    【讨论】:

    • 我需要一个 Pixmap 来绘制,但 Pixbuf 是保存所需要的。在客户端的某个地方是否有某种 Drawable 并且不需要我可以使用的屏幕来代替 Pixmap?
    • 是否可以选择切换到 Cairo 等图形库?
    • 最终绘图库可能会被移植到纯图形库,但即便如此,使用 GTK 不应该“正常工作”并在短期内切换到纯图形库似乎很愚蠢不是一个选择,纯粹是因为我没有时间去做。
    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多