[Gtk2] Gtk callbacks connected directly to TObject
Andrew Haines
AndrewD207 at aol.com
Mon Mar 17 22:53:57 CET 2008
If the gtk2 widgetset is split and reworked, please keep in mind it is
possible to have methods of object called directly without the need for
a plain c function to be called first.
to call a method of an object now we would do something like this:
g_signal_connect(widget, 'signal-name', @mycallback, pointer(MyObject));
mydata can be an object.
which when triggers calls this:
procedure mycallback(widget: PGtkWdget; data: gpointer); cdecl;
var
AObject: TFooObject;
begin
AObject := TFooObject(data);
AObject.SomeMethod(widget);
end;
using
g_signal_connect_data we can make this simpler:
procedure ConnectGtkSignalToObject(SignalWidget: PGtkWidget; TheSignal:
String; TheCallback: Pointer;
var
AMethod: TMethod;
begin
AMethod := TMethod(TheCallback);
g_signal_connect_data(widget, 'signal-name', AMethod.code,
AMethod.data, nil, G_CONNECT_SWAPPED {or G_CONNECT_AFTER});
end;
ConnectGtkSignalToObject(MyGtkButton, 'some-signal',
@MyFooObjectInstance.SomeMethod);
TFooObject.SomeMethod(widget: PGtkWidget); cdecl;
begin
// dosomething
end;
Doing it this way means that AMethod can be a virtual method which if
overridden will call the decendant's method as expected.
If there are multiple parameters in the callback such as a mouse event
it would look like this:
TFooObject.MousePress(Button: gint; X, Y: gint; widget: PGtkWidget); cdecl;
as you can see the normally first parameter(the widget) has become the
last parameter on all callbacks.
g_signal_connect_data must be used as opposed to
g_signal_connect_swapped because g_signal_connect_swapped does not give
us the freedom to connect before or after the event.
http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect-data
Regards,
Andrew
More information about the Gtk2
mailing list