]> cgit.babelmonkeys.de Git - jubjub.git/blob - src/gui/gtk/OFObject+GLibThread.m
Retain parameters for delayed calls within the GLib mainloop
[jubjub.git] / src / gui / gtk / OFObject+GLibThread.m
1 #include <gtk/gtk.h>
2
3 #import "OFObject+GLibThread.h"
4
5 int _OFObject_JubGlibThread_reference;
6
7 struct params0 {
8         id object;
9         SEL selector;
10 };
11
12 struct params1 {
13         id object;
14         SEL selector;
15         id param;
16 };
17
18 struct params2 {
19         id object;
20         SEL selector;
21         id param1;
22         id param2;
23 };
24
25 static gboolean callback0(gpointer object)
26 {
27         struct params0 *parm = object;
28         [parm->object performSelector: parm->selector];
29         [parm->object freeMemory: parm];
30         return FALSE;
31 }
32
33 static gboolean callback1(gpointer object)
34 {
35         struct params1 *parm = object;
36         [parm->object performSelector: parm->selector
37                            withObject: parm->param];
38         [parm->param release];
39         [parm->object freeMemory: parm];
40         return FALSE;
41 }
42
43 static gboolean callback2(gpointer object)
44 {
45         struct params2 *parm = object;
46         [parm->object performSelector: parm->selector
47                            withObject: parm->param1
48                            withObject: parm->param2];
49         [parm->param1 release];
50         [parm->param2 release];
51         [parm->object freeMemory: parm];
52         return FALSE;
53 }
54
55 @implementation OFObject (JubGlibThread)
56 - (void)performSelectorOnGLibThread: (SEL)selector
57 {
58         struct params0 *parm = [self allocMemoryWithSize: sizeof(*parm)];
59         parm->object = self;
60         parm->selector = selector;
61         g_idle_add(callback0, parm);
62 }
63
64 - (void)performSelectorOnGLibThread: (SEL)selector
65                          withObject: (id)object
66 {
67         struct params1 *parm = [self allocMemoryWithSize: sizeof(*parm)];
68         parm->object = self;
69         parm->selector = selector;
70         parm->param = [object retain];
71         g_idle_add(callback1, parm);
72 }
73
74 - (void)performSelectorOnGLibThread: (SEL)selector
75                          withObject: (id)object1
76                          withObject: (id)object2
77 {
78         struct params2 *parm = [self allocMemoryWithSize: sizeof(*parm)];
79         parm->object = self;
80         parm->selector = selector;
81         parm->param1 = [object1 retain];
82         parm->param2 = [object2 retain];
83         g_idle_add(callback2, parm);
84 }
85 @end