1

我已经使用 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 都会抱怨缺少屏幕。

4

2 回答 2

1

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

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

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

于 2010-07-19T13:33:38.017 回答
0

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

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

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