Thank you! That solved the problem and everything works like a charm. And you're right I'm not using the user data.
Also thanks for the link. I've found it a nice to read into understanding how this stuff works. On Wednesday 16 March 2005 13:21, Melvin Hadasht wrote: > Eelco Schijf a écrit : > > Hi, > > > > I'm stuck with the gdk_input_add() function and could use a hint to solve > > the problem. So here goes; > > > > The callback function I want to call is a member of a class, but g++ > > won't compile this. Placing the function outside the class works, but > > this is not the solution I'm looking for. > > > > The code: > > > > InputLirc :: InputLirc() > > { > > ... > > > > tag = gdk_input_add( sock, > > GDK_INPUT_READ, > > &InputLirc::ProcessLircInput, > > NULL ); > > > > ... > > } > > > > void InputLirc :: ProcessLircInput( gpointer data, gint source, > > GdkInputCondition condition ) > > { > > ... > > } > > In C++, pointer to (class) methods are not equal to pointer to functions. > > Class methods has an invisible additional argument which is the pointer > to the instance. Thus, the "signature" of a method is not the same as > the "signature" of a function (i.e: void (InputLirc::*)(...) is not > equal to void(*)(...)). So, when calling a method of an object, the > compiler needs two informations: the object and the method. > > gdk_input_add expects a pointer to a function and a user data. > So you must create a dispatch function that calls the object method. It > looks from your code that you don't need the user data, so you can use > it to pass the instance of your object. The dispatch function can also > be a static method of your class, as static methods are handled as > normal functions (they do not apply to instances of the class, so they > do not use the invisible argument described previously). So one solution > would be: > > class InputLirc > { > public: > static void DispatchProcessLircInput (gpointer aInputLirc, gint source, > GdkInputCondition condition) > { > InputLirc *obj = static_cast<InputLirc*>(aInputLirc); > return obj->ProcessLircInput (NULL, source, condition); > } > > InputLirc :: InputLirc() > { > ... > > tag = gdk_input_add( sock, > GDK_INPUT_READ, > DispatchProcessLircInput, > this ); > > ... > } > > > See http://www.newty.de/fpt/functor.html for more information. _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list