[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