views:

89

answers:

2

I have written some GTK programs using the gtkD bindings for the D programming language that are otherwise console apps, but are capable of displaying plots on the screen and saving them to a file. I'd like to run these on a machine that I only have console-based SSH access to, which means that the plots wouldn't be displayed on the screen, but would still be written to files.

When I call Main.init(), I get a Gtk-WARNING **: cannot open display, as expected. When I call Main.initCheck() instead and ignore the errors, I simply get more errors later in execution related to the lack of a screen.

Is there some easy way to make my program ignore the fact that there's no screen available, do all its on-screen drawing to some dummy device (the graphics equivalent of /dev/null) and still actually draw to Pixmaps and Pixbufs (necessary for saving plots to files) and run the non-GUI-based parts of the app?

Edits: In cases where the app launches a window and blocks on an event loop, the ideal thing to do would be to close the window immediately (or not succeed in opening it in the first place) and continue running the non-GUI based parts of the program. If this is impossible I can work around it by making sure I don't launch any windows.

Also, it appears that Pixbufs and Pixmaps don't work without a screen present. I tried drawing to a Pixmap, creating a Pixbuf out of that, and saving the results to a file, either after calling Main.checkInit() and ignoring the errors or without an init statement and either way GTK complains about lack of a screen.

+1  A: 

I believe the simplest solution is to use only GdkPixbufs for processing your plots; as far as I know, the gdk-pixbuf library only deals with pixbufs in memory and doesn't need a window system. Keep the processing and display parts of your code strictly separated. If you do that, it shouldn't matter that there is no screen. You could even make a command-line option to disable drawing to the screen.

You could also use GtkOffscreenWindow but this has only been available since GTK 2.20 and as far as I can tell the D bindings only cover up to 2.18.

Alternatively, you could use X forwarding in your SSH session; use -X or -Y on your SSH command line. See your SSH manual for more information. If you are running an X server on the machine you are SSH'ing from, then the plots can be displayed on your local machine's screen.

ptomato
A: 

Pixmaps won't work without server - they are, by definition (in X terminology), image resources stored on X server. Pixbufs, however, are stored in client application, and they should work without X.

If you need Pixmaps but don't want to graphics, you have two choices:

  1. Enable SSH X tunneling by passing -X flag. In this case, your app will be able to use local X server.
  2. Use Xvfb - it's dummy X server that does no output at all, and all graphics are stored in memory.
el.pescado
I need a Pixmap to draw on, but Pixbuf is what's needed for saving. Is there a Drawable of some kind somewhere that is client side and doesn't require a screen that I can use instead of Pixmap?
dsimcha
Is switching to graphics library such as Cairo an option?
el.pescado
@el.pescado: Eventually the plotting lib may be ported to a pure graphics lib, but even so it seems silly that this shouldn't "just work" using GTK, and in the short run switching to a pure graphics lib is not an option purely because I don't have time to do it.
dsimcha
Then try Xvfb...
el.pescado