summaryrefslogtreecommitdiff
path: root/gobject
diff options
context:
space:
mode:
authorJuerg Billeter <j@bitron.ch>2007-10-09 16:36:43 +0000
committerJürg Billeter <juergbi@src.gnome.org>2007-10-09 16:36:43 +0000
commit18a6f78033c31037887ac6be3639e355a545c9a8 (patch)
tree10fd4a85db55b1a356f4564b9d094d4d0a8574ee /gobject
parent1595675593a32c5508d8eff18321f23a4684d267 (diff)
downloadvala-18a6f78033c31037887ac6be3639e355a545c9a8.tar.gz
fix support for static methods as GObject signal handlers
2007-10-09 Juerg Billeter <j@bitron.ch> * gobject/valaccodeassignmentbinding.vala: fix support for static methods as GObject signal handlers svn path=/trunk/; revision=645
Diffstat (limited to 'gobject')
-rw-r--r--gobject/valaccodeassignmentbinding.vala40
1 files changed, 34 insertions, 6 deletions
diff --git a/gobject/valaccodeassignmentbinding.vala b/gobject/valaccodeassignmentbinding.vala
index 7754fac49..13fb5991f 100644
--- a/gobject/valaccodeassignmentbinding.vala
+++ b/gobject/valaccodeassignmentbinding.vala
@@ -147,7 +147,8 @@ public class Vala.CCodeAssignmentBinding : CCodeExpressionBinding {
}
var ccall = new CCodeFunctionCall (new CCodeIdentifier (connect_func));
-
+
+ // first argument: instance of sender
if (ma.inner != null) {
ccall.add_argument ((CCodeExpression) ma.inner.ccodenode);
} else {
@@ -155,10 +156,17 @@ public class Vala.CCodeAssignmentBinding : CCodeExpressionBinding {
}
if (!disconnect || sig is DBusSignal) {
+ // g_signal_connect_object or g_signal_connect
+ // or dbus_g_proxy_connect_signal or dbus_g_proxy_disconnect_signal
+
+ // second argument: signal name
ccall.add_argument (sig.get_canonical_cconstant ());
} else {
+ // g_signal_handlers_disconnect_matched
+
+ // second argument: mask
ccall.add_argument (new CCodeConstant ("G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA"));
-
+
// get signal id
var ccomma = new CCodeCommaExpression ();
var temp_decl = codegen.get_temp_variable_declarator (codegen.uint_type);
@@ -172,16 +180,24 @@ public class Vala.CCodeAssignmentBinding : CCodeExpressionBinding {
parse_call.add_argument (new CCodeConstant ("FALSE"));
ccomma.append_expression (parse_call);
ccomma.append_expression (new CCodeIdentifier (temp_decl.name));
-
+
+ // third argument: signal_id
ccall.add_argument (ccomma);
+ // fourth argument: detail
ccall.add_argument (new CCodeConstant ("0"));
+ // fifth argument: closure
ccall.add_argument (new CCodeConstant ("NULL"));
}
+ // third resp. sixth argument: handler
ccall.add_argument (new CCodeCastExpression (new CCodeIdentifier (m.get_cname ()), "GCallback"));
if (m.instance) {
+ // g_signal_connect_object or g_signal_handlers_disconnect_matched
+ // or dbus_g_proxy_connect_signal or dbus_g_proxy_disconnect_signal
+
+ // fourth resp. seventh argument: object/user_data
if (assignment.right is MemberAccess) {
var right_ma = (MemberAccess) assignment.right;
if (right_ma.inner != null) {
@@ -194,16 +210,28 @@ public class Vala.CCodeAssignmentBinding : CCodeExpressionBinding {
}
if (!disconnect) {
if (sig is DBusSignal) {
- // free_data_func
+ // dbus_g_proxy_connect_signal
+
+ // fifth argument: free_data_func
ccall.add_argument (new CCodeConstant ("NULL"));
} else {
- // connect_flags
+ // g_signal_connect_object
+
+ // fifth argument: connect_flags
ccall.add_argument (new CCodeConstant ("0"));
}
}
} else {
+ // g_signal_connect or g_signal_handlers_disconnect_matched
+ // or dbus_g_proxy_connect_signal or dbus_g_proxy_disconnect_signal
+
+ // fourth resp. seventh argument: user_data
ccall.add_argument (new CCodeConstant ("NULL"));
- ccall.add_argument (new CCodeConstant ("NULL"));
+
+ if (sig is DBusSignal && !disconnect) {
+ // fifth argument: free_data_func
+ ccall.add_argument (new CCodeConstant ("NULL"));
+ }
}
codenode = ccall;