Re: Plotting, text drawing, etc.
- From: James Frye <frye cs unr edu>
- To: Ben Johnson <ben blarg net>
- Cc: gtk-list gnome org
- Subject: Re: Plotting, text drawing, etc.
- Date: Wed, 9 Feb 2005 19:00:43 -0800 (PST)
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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]