From: Juerg Billeter Date: Fri, 30 May 2008 14:29:39 +0000 (+0000) Subject: Add support for dynamic signals of GObjects X-Git-Tag: VALA_0_3_3~62 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3f237249503979b0bb9bb1dc4a8d7421cccaa412;p=platform%2Fupstream%2Fvala.git Add support for dynamic signals of GObjects 2008-05-30 Juerg Billeter * gobject/valaccodedynamicsignalbinding.vala: Add support for dynamic signals of GObjects svn path=/trunk/; revision=1496 --- diff --git a/ChangeLog b/ChangeLog index 9ecd2f9..b2f14d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-05-30 Jürg Billeter + + * gobject/valaccodedynamicsignalbinding.vala: + + Add support for dynamic signals of GObjects + 2008-05-30 Ali Sabil * vapi/packages/gstreamer-0.10/: fix Gst.Pad.push_event diff --git a/gobject/valaccodedynamicsignalbinding.vala b/gobject/valaccodedynamicsignalbinding.vala index a2ce613..3c8ce3c 100644 --- a/gobject/valaccodedynamicsignalbinding.vala +++ b/gobject/valaccodedynamicsignalbinding.vala @@ -59,7 +59,9 @@ public class Vala.CCodeDynamicSignalBinding : CCodeBinding { func.add_parameter (new CCodeFormalParameter ("handler", "GCallback")); func.add_parameter (new CCodeFormalParameter ("data", "gpointer")); var block = new CCodeBlock (); - if (dynamic_signal.dynamic_type.data_type == codegen.dbus_object_type) { + if (dynamic_signal.dynamic_type.data_type == codegen.gobject_type) { + generate_gobject_connect_wrapper (block); + } else if (dynamic_signal.dynamic_type.data_type == codegen.dbus_object_type) { generate_dbus_connect_wrapper (block); } else { Report.error (node.source_reference, "dynamic signals are not supported for `%s'".printf (dynamic_signal.dynamic_type.to_string ())); @@ -102,6 +104,31 @@ public class Vala.CCodeDynamicSignalBinding : CCodeBinding { return disconnect_wrapper_name; } + void generate_gobject_connect_wrapper (CCodeBlock block) { + var dynamic_signal = (DynamicSignal) node; + + var m = (Method) dynamic_signal.handler.symbol_reference; + + node.accept (codegen); + + string connect_func = "g_signal_connect_object"; + if (m.binding != MemberBinding.INSTANCE) { + connect_func = "g_signal_connect"; + } + + var call = new CCodeFunctionCall (new CCodeIdentifier (connect_func)); + call.add_argument (new CCodeIdentifier ("obj")); + call.add_argument (new CCodeIdentifier ("signal_name")); + call.add_argument (new CCodeIdentifier ("handler")); + call.add_argument (new CCodeIdentifier ("data")); + + if (m.binding == MemberBinding.INSTANCE) { + call.add_argument (new CCodeConstant ("0")); + } + + block.add_statement (new CCodeExpressionStatement (call)); + } + void generate_dbus_connect_wrapper (CCodeBlock block) { var dynamic_signal = (DynamicSignal) node;