Re: [gtk-list] Re: casting func.



> So the buttonpress type callbacks (that take GdkEvent *) should return a
> true or a false depending on whether or not I want the default actions to
> take place, correct?

Correct.

> By the way, how does the marshalling function know what my function
> returns? Some sort of a pre-processor trick?

It's not a pre-processor trick, but rather an instance of polymorphism.
There are different marshalling functions for each signal.  Some expect
the return value, others don't.  I.e., some cast your callback to
	typedef int (*SomeCallbackTypeWithReturn)(GtkWidget *, GdkEvent *,
		gpointer data);
and others cast it to
	typedef void (*SomeVoidCallbackType)(GtkWidget *, gpointer data);

The marshalling function used is determined at runtime during the
gtk_signal_connect() call, which depending on the signal, registers your
callback with the proper marshalling function.

--josh

p.s.  I won't be offended if someone corrects me.  My knowledge of this
subject is limited.

----------------------------------------------------------------
                       Joshua Richardson
Dept. Cognitive and Neural Systems / Center for Adaptive Systems
                       Boston University
----------------------------------------------------------------

> On Wed, 16 Jun 1999, Joshua Richardson wrote:
> 
> > > This is part C part GTK question.
> > > How can bot, f(GtkWidget *, gpointer) and g(GtkWidget *, GdkEvent *,
> > > gpointer) be cast to GdkSignalFunc which is typedefed to look like neither
> > > of the above but f()? Is that even legal from the point of view of C?
> > 
> > >From C's point of view, a function is a pointer (to a piece of code.)
> > In C you can explicitly cast any pointer to any other pointer type, but
> > the onus is on you to make sure that such wild casting doesn't get you
> > into trouble.  This is one of the main reasons some people hate C.
> > 
> > > Also, how are GtkSignalFunc's made use of internally? Also, it lookes like
> > > the latter kind is expected by GTK to return and int, but I define mine as
> > > void. Yet, nothing crashes. So how does all this work?
> > 
> > Each widget "knows" about its signals, and what kind of callbacks will be
> > attached to them.  This was accomplished in Gtk by associating each signal
> > with a "marshalling" function, which is the function that actually calls
> > your callback, and will do so with an appropriate set of arguments. It's
> > your job to make sure that your function (that you always cast to the
> > generic GtkSignalFunc type) will handle the arguments delivered by the
> > marshalling function.  The event related marshalling functions check for a
> > return value from your callback, as explained in the tutorial.  So, if
> > your function isn't returning a value (as a void function won't), then the
> > marshalling function is getting a random value "returned".  This, of
> > course, may or may not cause problems, depending on context, but obviously
> > should be avoided. :-)
> > 
> > > Pavel
> > 
> > Hope that helps (and is correct ;-)),  --josh
> > 
> > ----------------------------------------------------------------
> >                        Joshua Richardson
> > Dept. Cognitive and Neural Systems / Center for Adaptive Systems
> >                        Boston University
> > ----------------------------------------------------------------
> > 
> > 
> > 
> > -- 
> > To unsubscribe: mail -s unsubscribe gtk-list-request@redhat.com < /dev/null
> > 
> 
> -- 
> To unsubscribe: mail -s unsubscribe gtk-list-request@redhat.com < /dev/null
> 
> 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]