summaryrefslogtreecommitdiff
path: root/src/codegen.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.py')
-rw-r--r--src/codegen.py32
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')