]> cgit.babelmonkeys.de Git - jubjub.git/blobdiff - src/gui/gtk/OFObject+GLibThread.m
Add and use -[OFObject performSelectorOnGLibThread:]
[jubjub.git] / src / gui / gtk / OFObject+GLibThread.m
diff --git a/src/gui/gtk/OFObject+GLibThread.m b/src/gui/gtk/OFObject+GLibThread.m
new file mode 100644 (file)
index 0000000..4fe6bce
--- /dev/null
@@ -0,0 +1,82 @@
+#include <gtk/gtk.h>
+
+#import "OFObject+GLibThread.h"
+
+int _OFObject_JubGlibThread_reference;
+
+struct params0 {
+       id object;
+       SEL selector;
+};
+
+struct params1 {
+       id object;
+       SEL selector;
+       id param;
+};
+
+struct params2 {
+       id object;
+       SEL selector;
+       id param1;
+       id param2;
+};
+
+static gboolean callback0(gpointer object)
+{
+       struct params0 *parm = object;
+       [parm->object performSelector: parm->selector];
+       [parm->object freeMemory: parm];
+       return FALSE;
+}
+
+static gboolean callback1(gpointer object)
+{
+       struct params1 *parm = object;
+       [parm->object performSelector: parm->selector
+                          withObject: parm->param];
+       [parm->object freeMemory: parm];
+       return FALSE;
+}
+
+static gboolean callback2(gpointer object)
+{
+       struct params2 *parm = object;
+       [parm->object performSelector: parm->selector
+                          withObject: parm->param1
+                          withObject: parm->param2];
+       [parm->object freeMemory: parm];
+       return FALSE;
+}
+
+@implementation OFObject (JubGlibThread)
+- (void)performSelectorOnGLibThread: (SEL)selector
+{
+       struct params0 *parm = [self allocMemoryWithSize: sizeof(*parm)];
+       parm->object = self;
+       parm->selector = selector;
+       g_idle_add(callback0, parm);
+}
+
+- (void)performSelectorOnGLibThread: (SEL)selector
+                        withObject: (id)object
+{
+       struct params1 *parm = [self allocMemoryWithSize: sizeof(*parm)];
+       parm->object = self;
+       parm->selector = selector;
+       parm->param = object;
+       g_idle_add(callback1, parm);
+}
+
+- (void)performSelectorOnGLibThread: (SEL)selector
+                        withObject: (id)object1
+                        withObject: (id)object2
+{
+       struct params2 *parm = [self allocMemoryWithSize: sizeof(*parm)];
+       parm->object = self;
+       parm->selector = selector;
+       parm->param1 = object1;
+       parm->param2 = object2;
+       g_idle_add(callback2, parm);
+}
+@end