On Mon, 7 Feb 2005, Ben Johnson wrote: > On Mon, Feb 07, 2005 at 07:28:12PM -0800, James Frye wrote: > > Ali, > > > > Thanks. I'll have a look for future reference, but I figured out a quick > > & dirty hack that does what I need. I have the GTK menu program start > > gnuplot as a pipe, then re-parent gnuplot's plot window into a GTK widget. > > So I stuff gnuplot commands & data into the pipe, and the resulting plot > > shows up where I want it. > > > > Constructive laziness :-) > > That sounds like a perfect solution to me. I'd been reading about the > OLE-like Gnome stuff and how it's really so incredibly easy to embed > features of one program in another. I think this is extremely cool and > I would love to read more about what you did, and see a brief example if > you don't mind sharing. :) Thanks. Ben, It's not really OLE, but XWindow reparenting, which was around long before :-) I could put the whole thing somewhere if people are interested, otherwise here's a quick outline. You need a package named "gnuplot_i" (written by N. Devillard). It's a few hundred lines of C code that handles all the details of running gnuplot in a pipe, and encapsulates gnuplot commands for e.g. an xy plot into a function call. I've improved on it a little, since I've used it regularly for doing simple plots within a program. but the original should work. Do the necessary gnuplot_i setup, giving it a unique title: sprintf (cmd, "-geometry 800x600 -title '%s%d'", argv [0], getpid ()); h1 = gnuplot_init (cmd); and use GTK to make your GUI. Create your plotting area as a socket, set its size, add it to the gui, and eventually call gtk_main (). sock = gtk_socket_new (); gtk_widget_set_size_request (GTK_WIDGET (sock), 600, 300); gtk_box_pack_start (GTK_BOX (main_vbox), sock, TRUE, TRUE, 0); In your "redraw" function (the one that actually does plotting, create your plot from data, and call one of the gnuplot_i functions to draw it. This will pop up an X window. Now you need a function that uses XQueryTree and XFetchName to scan the window list for the gnuplot window (which will have the unique name you created). This returns an X Window ID. Then you just call gtk_socket_steal and the plot window gets sucked into the GUI app. Note that you do the search only once, and (at least on my system) have to sleep for a bit before looking for the new window. So the code looks like this: ...make plot... if (first) { sleep (1); xid = GetXWinID (title); } if (xid != 0) gtk_socket_steal (GTK_SOCKET (sock), xid); first = FALSE; _______________________________________________ gtk-list@xxxxxxxxx http://mail.gnome.org/mailman/listinfo/gtk-list