> > i have a function defined by
> > void window_createMatrix(int rows, int colums, float **pointerMatrix, );
> > and a button "WhatSoEver", is there a way to use the function by
> > clicking the button?  i try to use the
> > g_connect_event(G_OBJECT(WhatSoEver), "clicked",
> > window_createMatrix, Parameters List); but the g_connect_event
> > only takes 4 parameters, and my function requires 3 more.

> You can create atrbitrary complex structure and pass a pointer to
> it as user_data. The signal handler then unpacks it and calls your
> function with the appropriate arguments. 

A short example would be nice.....  How about (just off the top of
my head):

struct window_createMatrix_args {
  gint something;
  gchar *something_else;
  guint handler;  // just to demonstrate
};

...
struct window_createMatrix_args *ea;
ea = gnew0(struct window_createMatrix_args, 1);
ea->hander = g_connect_event(G_OBJECT(WhatSoEver), "clicked",
  (GCallback) window_createMatrix_cb, ea, (GClosureNotify) gfree, 0);
ea->something = 1234;
...

void window_createMatrix_cb(GtkButton *button, gpointer data) {
  struct window_createMatrix_args *ea = data;
  window_createMatrix(ea->something, ea->somethine_else);
}


Note that if the callback is going to exist for the length of the programs 
life, and the window will only be instantiated once, it may be easier to make 
the struct a global and pass NULL in the callback (also avoids allocating the 
memory and setting up the DestroyNotify).  But you still need an intermediate 
function to re-write the signal arguments (window_createMatrix_cb).


> This is probably the
> single most frequently asked question ever -- competing with `I
> installed GLib to /somewhere, but forgot to add
> /somewhere/lib/pkgconfig to PKG_CONFIG_PATH.'  Maybe it could be
> added to the FAQ, even though it has nothing to do with Gtk+, just
> with general programming in C.

Well, it is a feature of GTK that this concept is needed.  If GTK provided a 
means to reach callbacks with arbitrary arguments (I think I read that gtkmm 
supports this?), then such things wouldn't be needed.  However, I'm not 
suggesting we go and write a g_signal_connect_with_arbitrary_arguments 
function, the overhead would probably be quite nasty for using it on a regular 
basis.  And the solution, though a little hackish, is quite easy and flexible.  
(It wouldn't even be hard to go to the extent of boxing the structure so it 
could be passed to several callbacks, and having g_unref as their destroy 
notify function)

On the other hand, a general solution may not be too bad an idea, if someone 
knows how to attach the contents of a varargs to the end of a function call.  
(I think some versions of gcc can do it...)


Fredderic

_______________________________________________
Join Excite! - http://www.excite.com
The most personalized portal on the Web!
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to