diff options
Diffstat (limited to 'src/codegen.py')
-rw-r--r-- | src/codegen.py | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/codegen.py b/src/codegen.py index 050ef4a..ecd9bbe 100644 --- a/src/codegen.py +++ b/src/codegen.py @@ -268,6 +268,38 @@ class CodeGenerator: self.h.write('\n') self.h.write('\n') + # macros for typesafe callbacks - TODO: use G_DEFINE_CALLBACK() as proposed here + # + # https://mail.gnome.org/archives/gtk-devel-list/2011-March/msg00069.html + # + if len(i.methods) > 0: + self.h.write('\n') + self.h.write('/* Type-safe signal callbacks */\n') + self.h.write('#if __GNUC__ >= 4\n') + for m in i.methods: + self.h.write('#define %s%s_HANDLE_%s_CALLBACK(f, user_type) (__builtin_choose_expr (__builtin_types_compatible_p (typeof (&f), ' + %(i.ns_upper, i.name_upper, m.name_lower.upper())) + self.h.write('gboolean (*) (%s*, GDBusMethodInvocation*, '%(i.camel_name)) + for a in m.in_args: + self.h.write('%s, '%(a.ctype_in)) + self.h.write('user_type)), G_CALLBACK (f), f))\n') + for s in i.signals: + self.h.write('#define %s%s_%s_CALLBACK(f, user_type) (__builtin_choose_expr (__builtin_types_compatible_p (typeof (&f), ' + %(i.ns_upper, i.name_upper, s.name_lower.upper())) + self.h.write('void (*) (%s*, '%(i.camel_name)) + for a in s.args: + self.h.write('%s, '%(a.ctype_in)) + self.h.write('user_type)), G_CALLBACK (f), f))\n') + self.h.write('#else /* __GNUC__ >= 4 */\n') + for m in i.methods: + self.h.write('#define %s%s_HANDLE_%s_CALLBACK(f, user_type) (G_CALLBACK (f))\n' + %(i.ns_upper, i.name_upper, m.name_lower.upper())) + for s in i.signals: + self.h.write('#define %s%s_%s_CALLBACK(f, user_type) (G_CALLBACK (f))\n' + %(i.ns_upper, i.name_upper, s.name_lower.upper())) + self.h.write('#endif /* __GNUC__ >= 4 */\n') + self.h.write('\n') + # Then method call declarations if len(i.methods) > 0: self.h.write('\n') |