vala r1496 - in trunk: . gobject



Author: juergbi
Date: Fri May 30 14:29:39 2008
New Revision: 1496
URL: http://svn.gnome.org/viewvc/vala?rev=1496&view=rev

Log:
2008-05-30  Juerg Billeter  <j bitron ch>

	* gobject/valaccodedynamicsignalbinding.vala:

	Add support for dynamic signals of GObjects


Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodedynamicsignalbinding.vala

Modified: trunk/gobject/valaccodedynamicsignalbinding.vala
==============================================================================
--- trunk/gobject/valaccodedynamicsignalbinding.vala	(original)
+++ trunk/gobject/valaccodedynamicsignalbinding.vala	Fri May 30 14:29:39 2008
@@ -59,7 +59,9 @@
 			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 @@
 		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;
 



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