Mon, 20 Oct 2003 04:08:13 +0000
[gaim-migrate @ 7888]
This is fun. I got silly and decided to add some drop shadows to the buddy
list tooltip. It looks totally awesome. It will be reverted before the next
release though. It's just far too hacky.
| 6485 | 1 | /** |
|
6488
6a47a95e4dbb
[gaim-migrate @ 7002]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
2 | * @file signals.c Signal API |
| 6485 | 3 | * @ingroup core |
| 4 | * | |
| 5 | * gaim | |
| 6 | * | |
| 7 | * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> | |
| 8 | * | |
| 9 | * This program is free software; you can redistribute it and/or modify | |
| 10 | * it under the terms of the GNU General Public License as published by | |
| 11 | * the Free Software Foundation; either version 2 of the License, or | |
| 12 | * (at your option) any later version. | |
| 13 | * | |
| 14 | * This program is distributed in the hope that it will be useful, | |
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 17 | * GNU General Public License for more details. | |
| 18 | * | |
| 19 | * You should have received a copy of the GNU General Public License | |
| 20 | * along with this program; if not, write to the Free Software | |
| 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 22 | */ | |
| 23 | #include "internal.h" | |
| 24 | ||
| 25 | #include "debug.h" | |
| 26 | #include "signals.h" | |
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
27 | #include "value.h" |
| 6485 | 28 | |
| 29 | typedef struct | |
| 30 | { | |
| 31 | void *instance; | |
| 32 | ||
| 33 | GHashTable *signals; | |
| 34 | size_t signal_count; | |
| 35 | ||
| 36 | gulong next_signal_id; | |
| 37 | ||
| 38 | } GaimInstanceData; | |
| 39 | ||
| 40 | typedef struct | |
| 41 | { | |
| 42 | gulong id; | |
| 43 | ||
| 44 | GaimSignalMarshalFunc marshal; | |
| 45 | ||
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
46 | int num_values; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
47 | GaimValue **values; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
48 | GaimValue *ret_value; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
49 | |
| 6485 | 50 | GList *handlers; |
| 51 | size_t handler_count; | |
| 52 | ||
| 53 | gulong next_handler_id; | |
| 54 | ||
| 55 | } GaimSignalData; | |
| 56 | ||
| 57 | typedef struct | |
| 58 | { | |
| 59 | gulong id; | |
| 60 | GaimCallback cb; | |
| 61 | void *handle; | |
| 62 | void *data; | |
|
6547
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
63 | gboolean use_vargs; |
| 6485 | 64 | |
| 65 | } GaimSignalHandlerData; | |
| 66 | ||
| 67 | static GHashTable *instance_table = NULL; | |
| 68 | ||
| 69 | static void | |
| 70 | destroy_instance_data(GaimInstanceData *instance_data) | |
| 71 | { | |
| 72 | g_hash_table_destroy(instance_data->signals); | |
| 73 | ||
| 74 | g_free(instance_data); | |
| 75 | } | |
| 76 | ||
| 77 | static void | |
| 78 | destroy_signal_data(GaimSignalData *signal_data) | |
| 79 | { | |
| 80 | GaimSignalHandlerData *handler_data; | |
| 81 | GList *l; | |
| 82 | ||
| 83 | for (l = signal_data->handlers; l != NULL; l = l->next) | |
| 84 | { | |
| 85 | handler_data = (GaimSignalHandlerData *)l->data; | |
| 86 | ||
| 87 | g_free(l->data); | |
| 88 | } | |
| 89 | ||
| 90 | g_list_free(signal_data->handlers); | |
| 91 | ||
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
92 | if (signal_data->values != NULL) |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
93 | { |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
94 | int i; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
95 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
96 | for (i = 0; i < signal_data->num_values; i++) |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
97 | gaim_value_destroy((GaimValue *)signal_data->values[i]); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
98 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
99 | g_free(signal_data->values); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
100 | } |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
101 | |
| 6485 | 102 | g_free(signal_data); |
| 103 | } | |
| 104 | ||
| 105 | gulong | |
| 106 | gaim_signal_register(void *instance, const char *signal, | |
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
107 | GaimSignalMarshalFunc marshal, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
108 | GaimValue *ret_value, int num_values, ...) |
| 6485 | 109 | { |
| 110 | GaimInstanceData *instance_data; | |
| 111 | GaimSignalData *signal_data; | |
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
112 | va_list args; |
| 6485 | 113 | |
| 114 | g_return_val_if_fail(instance != NULL, 0); | |
| 115 | g_return_val_if_fail(signal != NULL, 0); | |
| 116 | g_return_val_if_fail(marshal != NULL, 0); | |
| 117 | ||
| 118 | instance_data = | |
| 119 | (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
| 120 | ||
| 121 | if (instance_data == NULL) | |
| 122 | { | |
| 123 | instance_data = g_new0(GaimInstanceData, 1); | |
| 124 | ||
| 125 | instance_data->instance = instance; | |
| 126 | instance_data->next_signal_id = 1; | |
| 127 | ||
| 128 | instance_data->signals = | |
| 129 | g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
| 130 | (GDestroyNotify)destroy_signal_data); | |
| 131 | ||
| 132 | g_hash_table_insert(instance_table, instance, instance_data); | |
| 133 | } | |
| 134 | ||
| 135 | signal_data = g_new0(GaimSignalData, 1); | |
| 136 | signal_data->id = instance_data->next_signal_id; | |
| 137 | signal_data->marshal = marshal; | |
| 138 | signal_data->next_handler_id = 1; | |
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
139 | signal_data->ret_value = ret_value; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
140 | signal_data->num_values = num_values; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
141 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
142 | if (num_values > 0) |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
143 | { |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
144 | int i; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
145 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
146 | signal_data->values = g_new0(GaimValue *, num_values); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
147 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
148 | va_start(args, num_values); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
149 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
150 | for (i = 0; i < num_values; i++) |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
151 | signal_data->values[i] = va_arg(args, GaimValue *); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
152 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
153 | va_end(args); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
154 | } |
| 6485 | 155 | |
| 156 | g_hash_table_insert(instance_data->signals, | |
| 157 | g_strdup(signal), signal_data); | |
| 158 | ||
| 159 | instance_data->next_signal_id++; | |
| 160 | instance_data->signal_count++; | |
| 161 | ||
| 162 | return signal_data->id; | |
| 163 | } | |
| 164 | ||
| 165 | void | |
| 166 | gaim_signal_unregister(void *instance, const char *signal) | |
| 167 | { | |
| 168 | GaimInstanceData *instance_data; | |
| 169 | ||
| 170 | g_return_if_fail(instance != NULL); | |
| 171 | g_return_if_fail(signal != NULL); | |
| 172 | ||
| 173 | instance_data = | |
| 174 | (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
| 175 | ||
| 176 | g_return_if_fail(instance_data != NULL); | |
| 177 | ||
| 178 | g_hash_table_remove(instance_data->signals, signal); | |
| 179 | ||
| 180 | instance_data->signal_count--; | |
| 181 | ||
| 182 | if (instance_data->signal_count == 0) | |
| 183 | { | |
| 184 | /* Unregister the instance. */ | |
| 185 | g_hash_table_remove(instance_table, instance); | |
| 186 | } | |
| 187 | } | |
| 188 | ||
| 189 | void | |
| 190 | gaim_signals_unregister_by_instance(void *instance) | |
| 191 | { | |
| 192 | gboolean found; | |
| 193 | ||
| 194 | g_return_if_fail(instance != NULL); | |
| 195 | ||
| 196 | found = g_hash_table_remove(instance_table, instance); | |
| 197 | ||
| 198 | /* | |
| 199 | * Makes things easier (more annoying?) for developers who don't have | |
| 200 | * things registering and unregistering in the right order :) | |
| 201 | */ | |
| 202 | g_return_if_fail(found); | |
| 203 | } | |
| 204 | ||
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
205 | void |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
206 | gaim_signal_get_values(void *instance, const char *signal, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
207 | GaimValue **ret_value, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
208 | int *num_values, GaimValue ***values) |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
209 | { |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
210 | GaimInstanceData *instance_data; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
211 | GaimSignalData *signal_data; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
212 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
213 | g_return_if_fail(instance != NULL); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
214 | g_return_if_fail(signal != NULL); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
215 | g_return_if_fail(num_values != NULL); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
216 | g_return_if_fail(values != NULL); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
217 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
218 | /* Get the instance data */ |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
219 | instance_data = |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
220 | (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
221 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
222 | g_return_if_fail(instance_data != NULL); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
223 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
224 | /* Get the signal data */ |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
225 | signal_data = |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
226 | (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
227 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
228 | g_return_if_fail(signal_data != NULL); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
229 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
230 | *num_values = signal_data->num_values; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
231 | *values = signal_data->values; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
232 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
233 | if (ret_value != NULL) |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
234 | *ret_value = signal_data->ret_value; |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
235 | } |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6553
diff
changeset
|
236 | |
|
6547
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
237 | static gulong |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
238 | signal_connect_common(void *instance, const char *signal, void *handle, |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
239 | GaimCallback func, void *data, gboolean use_vargs) |
| 6485 | 240 | { |
| 241 | GaimInstanceData *instance_data; | |
| 242 | GaimSignalData *signal_data; | |
| 243 | GaimSignalHandlerData *handler_data; | |
| 244 | ||
| 245 | g_return_val_if_fail(instance != NULL, 0); | |
| 246 | g_return_val_if_fail(signal != NULL, 0); | |
| 247 | g_return_val_if_fail(handle != NULL, 0); | |
| 248 | g_return_val_if_fail(func != NULL, 0); | |
| 249 | ||
| 250 | /* Get the instance data */ | |
| 251 | instance_data = | |
| 252 | (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
| 253 | ||
| 254 | g_return_val_if_fail(instance_data != NULL, 0); | |
| 255 | ||
| 256 | /* Get the signal data */ | |
| 257 | signal_data = | |
| 258 | (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
| 259 | ||
| 260 | if (signal_data == NULL) | |
| 261 | { | |
| 262 | gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
| 263 | "Signal data for %s not found!\n", signal); | |
| 264 | return 0; | |
| 265 | } | |
| 266 | ||
| 267 | /* Create the signal handler data */ | |
| 268 | handler_data = g_new0(GaimSignalHandlerData, 1); | |
|
6547
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
269 | handler_data->id = signal_data->next_handler_id; |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
270 | handler_data->cb = func; |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
271 | handler_data->handle = handle; |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
272 | handler_data->data = data; |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
273 | handler_data->use_vargs = use_vargs; |
| 6485 | 274 | |
| 275 | signal_data->handlers = g_list_append(signal_data->handlers, handler_data); | |
| 276 | signal_data->handler_count++; | |
| 277 | signal_data->next_handler_id++; | |
| 278 | ||
| 279 | return handler_data->id; | |
| 280 | } | |
|
6553
83467711007f
[gaim-migrate @ 7075]
Christian Hammond <chipx86@chipx86.com>
parents:
6547
diff
changeset
|
281 | |
|
6547
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
282 | gulong |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
283 | gaim_signal_connect(void *instance, const char *signal, void *handle, |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
284 | GaimCallback func, void *data) |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
285 | { |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
286 | return signal_connect_common(instance, signal, handle, func, data, FALSE); |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
287 | } |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
288 | |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
289 | gulong |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
290 | gaim_signal_connect_vargs(void *instance, const char *signal, void *handle, |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
291 | GaimCallback func, void *data) |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
292 | { |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
293 | return signal_connect_common(instance, signal, handle, func, data, TRUE); |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
294 | } |
| 6485 | 295 | |
| 296 | void | |
| 297 | gaim_signal_disconnect(void *instance, const char *signal, | |
| 298 | void *handle, GaimCallback func) | |
| 299 | { | |
| 300 | GaimInstanceData *instance_data; | |
| 301 | GaimSignalData *signal_data; | |
| 302 | GaimSignalHandlerData *handler_data; | |
| 303 | GList *l; | |
| 304 | gboolean found = FALSE; | |
| 305 | ||
| 306 | g_return_if_fail(instance != NULL); | |
| 307 | g_return_if_fail(signal != NULL); | |
| 308 | g_return_if_fail(handle != NULL); | |
| 309 | g_return_if_fail(func != NULL); | |
| 310 | ||
| 311 | /* Get the instance data */ | |
| 312 | instance_data = | |
| 313 | (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
| 314 | ||
| 315 | g_return_if_fail(instance_data != NULL); | |
| 316 | ||
| 317 | /* Get the signal data */ | |
| 318 | signal_data = | |
| 319 | (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
| 320 | ||
| 321 | if (signal_data == NULL) | |
| 322 | { | |
| 323 | gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
| 324 | "Signal data for %s not found!\n", signal); | |
| 325 | return; | |
| 326 | } | |
| 327 | ||
| 328 | /* Find the handler data. */ | |
| 329 | for (l = signal_data->handlers; l != NULL; l = l->next) | |
| 330 | { | |
| 331 | handler_data = (GaimSignalHandlerData *)l->data; | |
| 332 | ||
| 333 | if (handler_data->handle == handle && handler_data->cb == func) | |
| 334 | { | |
| 335 | g_free(handler_data); | |
| 336 | ||
| 337 | signal_data->handlers = g_list_remove(signal_data->handlers, | |
| 338 | handler_data); | |
| 339 | signal_data->handler_count--; | |
| 340 | ||
| 341 | found = TRUE; | |
| 342 | ||
| 343 | break; | |
| 344 | } | |
| 345 | } | |
| 346 | ||
| 347 | /* See note somewhere about this actually helping developers.. */ | |
| 348 | g_return_if_fail(found); | |
| 349 | } | |
| 350 | ||
| 351 | /* | |
| 352 | * TODO: Make this all more efficient by storing a list of handlers, keyed | |
| 353 | * to a handle. | |
| 354 | */ | |
| 355 | static void | |
| 356 | disconnect_handle_from_signals(const char *signal, | |
| 357 | GaimSignalData *signal_data, void *handle) | |
| 358 | { | |
| 359 | GList *l, *l_next; | |
| 360 | GaimSignalHandlerData *handler_data; | |
| 361 | ||
| 362 | for (l = signal_data->handlers; l != NULL; l = l_next) | |
| 363 | { | |
| 364 | handler_data = (GaimSignalHandlerData *)l->data; | |
| 365 | l_next = l->next; | |
| 366 | ||
| 367 | if (handler_data->handle == handle) | |
| 368 | { | |
| 369 | g_free(handler_data); | |
| 370 | ||
| 371 | signal_data->handler_count--; | |
| 372 | signal_data->handlers = g_list_remove(signal_data->handlers, | |
| 373 | handler_data); | |
| 374 | } | |
| 375 | } | |
| 376 | } | |
| 377 | ||
| 378 | static void | |
| 379 | disconnect_handle_from_instance(void *instance, | |
| 380 | GaimInstanceData *instance_data, | |
| 381 | void *handle) | |
| 382 | { | |
| 383 | g_hash_table_foreach(instance_data->signals, | |
| 384 | (GHFunc)disconnect_handle_from_signals, handle); | |
| 385 | } | |
| 386 | ||
| 387 | void | |
| 388 | gaim_signals_disconnect_by_handle(void *handle) | |
| 389 | { | |
| 390 | g_return_if_fail(handle != NULL); | |
| 391 | ||
| 392 | g_hash_table_foreach(instance_table, | |
| 393 | (GHFunc)disconnect_handle_from_instance, handle); | |
| 394 | } | |
| 395 | ||
| 396 | void | |
| 397 | gaim_signal_emit(void *instance, const char *signal, ...) | |
| 398 | { | |
| 399 | va_list args; | |
| 400 | ||
| 401 | va_start(args, signal); | |
| 402 | gaim_signal_emit_vargs(instance, signal, args); | |
| 403 | va_end(args); | |
| 404 | } | |
| 405 | ||
| 406 | void | |
| 407 | gaim_signal_emit_vargs(void *instance, const char *signal, va_list args) | |
| 408 | { | |
| 409 | GaimInstanceData *instance_data; | |
| 410 | GaimSignalData *signal_data; | |
| 411 | GaimSignalHandlerData *handler_data; | |
| 412 | GList *l; | |
| 413 | ||
| 414 | g_return_if_fail(instance != NULL); | |
| 415 | g_return_if_fail(signal != NULL); | |
| 416 | ||
| 417 | instance_data = | |
| 418 | (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
| 419 | ||
| 420 | g_return_if_fail(instance_data != NULL); | |
| 421 | ||
| 422 | signal_data = | |
| 423 | (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
| 424 | ||
| 425 | if (signal_data == NULL) | |
| 426 | { | |
| 427 | gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
| 428 | "Signal data for %s not found!\n", signal); | |
| 429 | return; | |
| 430 | } | |
| 431 | ||
| 432 | for (l = signal_data->handlers; l != NULL; l = l->next) | |
| 433 | { | |
| 434 | handler_data = (GaimSignalHandlerData *)l->data; | |
| 435 | ||
|
6547
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
436 | if (handler_data->use_vargs) |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
437 | { |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
438 | ((void (*)(va_list, void *))handler_data->cb)(args, |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
439 | handler_data->data); |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
440 | } |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
441 | else |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
442 | { |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
443 | signal_data->marshal(handler_data->cb, args, |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
444 | handler_data->data, NULL); |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
445 | } |
| 6485 | 446 | } |
| 447 | } | |
| 448 | ||
| 449 | void * | |
| 450 | gaim_signal_emit_return_1(void *instance, const char *signal, ...) | |
| 451 | { | |
| 452 | void *ret_val; | |
| 453 | va_list args; | |
| 454 | ||
| 455 | va_start(args, signal); | |
| 456 | ret_val = gaim_signal_emit_vargs_return_1(instance, signal, args); | |
| 457 | va_end(args); | |
| 458 | ||
| 459 | return ret_val; | |
| 460 | } | |
| 461 | ||
| 462 | void * | |
| 463 | gaim_signal_emit_vargs_return_1(void *instance, const char *signal, | |
| 464 | va_list args) | |
| 465 | { | |
| 466 | GaimInstanceData *instance_data; | |
| 467 | GaimSignalData *signal_data; | |
| 468 | GaimSignalHandlerData *handler_data; | |
| 469 | void *ret_val = NULL; | |
| 470 | GList *l; | |
| 471 | ||
| 472 | g_return_val_if_fail(instance != NULL, NULL); | |
| 473 | g_return_val_if_fail(signal != NULL, NULL); | |
| 474 | ||
| 475 | instance_data = | |
| 476 | (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); | |
| 477 | ||
| 478 | g_return_val_if_fail(instance_data != NULL, NULL); | |
| 479 | ||
| 480 | signal_data = | |
| 481 | (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); | |
| 482 | ||
| 483 | if (signal_data == NULL) | |
| 484 | { | |
| 485 | gaim_debug(GAIM_DEBUG_ERROR, "signals", | |
| 486 | "Signal data for %s not found!\n", signal); | |
| 487 | return 0; | |
| 488 | } | |
| 489 | ||
| 490 | for (l = signal_data->handlers; l != NULL; l = l->next) | |
| 491 | { | |
| 492 | handler_data = (GaimSignalHandlerData *)l->data; | |
| 493 | ||
|
6547
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
494 | if (handler_data->use_vargs) |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
495 | { |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
496 | ret_val = ((void *(*)(va_list, void *))handler_data->cb)( |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
497 | args, handler_data->data); |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
498 | } |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
499 | else |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
500 | { |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
501 | signal_data->marshal(handler_data->cb, args, |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
502 | handler_data->data, &ret_val); |
|
ffc0e15d291b
[gaim-migrate @ 7069]
Christian Hammond <chipx86@chipx86.com>
parents:
6509
diff
changeset
|
503 | } |
| 6485 | 504 | } |
| 505 | ||
| 506 | return ret_val; | |
| 507 | } | |
| 508 | ||
| 509 | void | |
| 510 | gaim_signals_init() | |
| 511 | { | |
| 512 | g_return_if_fail(instance_table == NULL); | |
| 513 | ||
| 514 | instance_table = | |
| 515 | g_hash_table_new_full(g_direct_hash, g_direct_equal, | |
| 516 | NULL, (GDestroyNotify)destroy_instance_data); | |
| 517 | } | |
| 518 | ||
| 519 | void | |
| 520 | gaim_signals_uninit() | |
| 521 | { | |
| 522 | g_return_if_fail(instance_table != NULL); | |
| 523 | ||
| 524 | g_hash_table_destroy(instance_table); | |
| 525 | instance_table = NULL; | |
| 526 | } | |
| 527 | ||
| 528 | /************************************************************************** | |
| 529 | * Marshallers | |
| 530 | **************************************************************************/ | |
| 531 | void | |
| 532 | gaim_marshal_VOID(GaimCallback cb, va_list args, void *data, | |
| 533 | void **return_val) | |
| 534 | { | |
| 535 | ((void (*)(void *))cb)(data); | |
| 536 | } | |
| 537 | ||
| 538 | void | |
|
6822
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
539 | gaim_marshal_VOID__INT(GaimCallback cb, va_list args, void *data, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
540 | void **return_val) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
541 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
542 | gint arg1 = va_arg(args, gint); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
543 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
544 | ((void (*)(gint, void *))cb)(arg1, data); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
545 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
546 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
547 | void |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
548 | gaim_marshal_VOID__INT_INT(GaimCallback cb, va_list args, void *data, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
549 | void **return_val) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
550 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
551 | gint arg1 = va_arg(args, gint); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
552 | gint arg2 = va_arg(args, gint); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
553 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
554 | ((void (*)(gint, gint, void *))cb)(arg1, arg2, data); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
555 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
556 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
557 | void |
| 6485 | 558 | gaim_marshal_VOID__POINTER(GaimCallback cb, va_list args, void *data, |
| 559 | void **return_val) | |
| 560 | { | |
| 6505 | 561 | void *arg1 = va_arg(args, void *); |
| 562 | ||
| 563 | ((void (*)(void *, void *))cb)(arg1, data); | |
| 6485 | 564 | } |
| 565 | ||
| 566 | void | |
| 567 | gaim_marshal_VOID__POINTER_POINTER(GaimCallback cb, va_list args, | |
| 568 | void *data, void **return_val) | |
| 569 | { | |
| 6505 | 570 | void *arg1 = va_arg(args, void *); |
| 571 | void *arg2 = va_arg(args, void *); | |
| 572 | ||
| 573 | ((void (*)(void *, void *, void *))cb)(arg1, arg2, data); | |
| 6485 | 574 | } |
| 575 | ||
| 576 | void | |
| 577 | gaim_marshal_VOID__POINTER_POINTER_UINT(GaimCallback cb, va_list args, | |
| 578 | void *data, void **return_val) | |
| 579 | { | |
| 6505 | 580 | void *arg1 = va_arg(args, void *); |
| 581 | void *arg2 = va_arg(args, void *); | |
| 582 | guint arg3 = va_arg(args, guint); | |
| 583 | ||
| 584 | ((void (*)(void *, void *, guint, void *))cb)(arg1, arg2, arg3, data); | |
| 6485 | 585 | } |
| 586 | ||
| 587 | void | |
| 588 | gaim_marshal_VOID__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, | |
| 589 | void *data, void **return_val) | |
| 590 | { | |
| 6505 | 591 | void *arg1 = va_arg(args, void *); |
| 592 | void *arg2 = va_arg(args, void *); | |
| 593 | void *arg3 = va_arg(args, void *); | |
| 594 | ||
| 595 | ((void (*)(void *, void *, void *, void *))cb)(arg1, arg2, arg3, data); | |
| 6485 | 596 | } |
| 597 | ||
| 598 | void | |
| 599 | gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, | |
| 600 | va_list args, | |
| 601 | void *data, | |
| 602 | void **return_val) | |
| 603 | { | |
| 6505 | 604 | void *arg1 = va_arg(args, void *); |
| 605 | void *arg2 = va_arg(args, void *); | |
| 606 | void *arg3 = va_arg(args, void *); | |
| 607 | void *arg4 = va_arg(args, void *); | |
| 608 | ||
| 609 | ((void (*)(void *, void *, void *, void *, void *))cb)(arg1, arg2, arg3, arg4, data); | |
| 6485 | 610 | } |
| 6509 | 611 | |
| 612 | void | |
| 613 | gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT(GaimCallback cb, | |
| 614 | va_list args, | |
| 615 | void *data, | |
| 616 | void **return_val) | |
| 617 | { | |
| 618 | void *arg1 = va_arg(args, void *); | |
| 619 | void *arg2 = va_arg(args, void *); | |
| 620 | void *arg3 = va_arg(args, void *); | |
| 621 | guint arg4 = va_arg(args, guint); | |
| 622 | ||
| 623 | ((void (*)(void *, void *, void *, guint, void *))cb)(arg1, arg2, arg3, arg4, data); | |
| 624 | } | |
| 625 | ||
| 6485 | 626 | void |
| 627 | gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT(GaimCallback cb, | |
| 628 | va_list args, | |
| 629 | void *data, | |
| 630 | void **return_val) | |
| 631 | { | |
| 6505 | 632 | void *arg1 = va_arg(args, void *); |
| 633 | void *arg2 = va_arg(args, void *); | |
| 634 | void *arg3 = va_arg(args, void *); | |
| 635 | guint arg4 = va_arg(args, guint); | |
| 636 | guint arg5 = va_arg(args, guint); | |
| 637 | ||
| 6485 | 638 | ((void (*)(void *, void *, void *, guint, guint, void *))cb)( |
| 6505 | 639 | arg1, arg2, arg3, arg4, arg5, data); |
| 6485 | 640 | } |
| 641 | ||
| 642 | void | |
|
6822
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
643 | gaim_marshal_INT__INT(GaimCallback cb, va_list args, void *data, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
644 | void **return_val) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
645 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
646 | gint ret_val; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
647 | gint arg1 = va_arg(args, gint); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
648 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
649 | ret_val = ((gint (*)(gint, void *))cb)(arg1, data); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
650 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
651 | if (return_val != NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
652 | *return_val = GINT_TO_POINTER(ret_val); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
653 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
654 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
655 | void |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
656 | gaim_marshal_INT__INT_INT(GaimCallback cb, va_list args, void *data, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
657 | void **return_val) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
658 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
659 | gint ret_val; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
660 | gint arg1 = va_arg(args, gint); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
661 | gint arg2 = va_arg(args, gint); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
662 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
663 | ret_val = ((gint (*)(gint, gint, void *))cb)(arg1, arg2, data); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
664 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
665 | if (return_val != NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
666 | *return_val = GINT_TO_POINTER(ret_val); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
667 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
668 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
669 | void |
| 6485 | 670 | gaim_marshal_BOOLEAN__POINTER(GaimCallback cb, va_list args, void *data, |
| 671 | void **return_val) | |
| 672 | { | |
| 673 | gboolean ret_val; | |
| 6505 | 674 | void *arg1 = va_arg(args, void *); |
| 6485 | 675 | |
| 6505 | 676 | ret_val = ((gboolean (*)(void *, void *))cb)(arg1, data); |
| 6485 | 677 | |
| 678 | if (return_val != NULL) | |
| 679 | *return_val = GINT_TO_POINTER(ret_val); | |
| 680 | } | |
| 681 | ||
| 682 | void | |
| 683 | gaim_marshal_BOOLEAN__POINTER_POINTER(GaimCallback cb, va_list args, | |
| 684 | void *data, void **return_val) | |
| 685 | { | |
| 686 | gboolean ret_val; | |
| 6505 | 687 | void *arg1 = va_arg(args, void *); |
| 688 | void *arg2 = va_arg(args, void *); | |
| 6485 | 689 | |
| 6505 | 690 | ret_val = ((gboolean (*)(void *, void *, void *))cb)(arg1, arg2, data); |
| 6485 | 691 | |
| 692 | if (return_val != NULL) | |
| 693 | *return_val = GINT_TO_POINTER(ret_val); | |
| 694 | } | |
| 695 | ||
| 696 | void | |
| 6509 | 697 | gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER(GaimCallback cb, va_list args, |
| 698 | void *data, void **return_val) | |
| 699 | { | |
| 700 | gboolean ret_val; | |
| 701 | void *arg1 = va_arg(args, void *); | |
| 702 | void *arg2 = va_arg(args, void *); | |
| 703 | void *arg3 = va_arg(args, void *); | |
| 704 | ||
| 705 | ret_val = ((gboolean (*)(void *, void *, void *, void *))cb)(arg1, arg2, | |
| 706 | arg3, data); | |
| 707 | ||
| 708 | if (return_val != NULL) | |
| 709 | *return_val = GINT_TO_POINTER(ret_val); | |
| 710 | } | |
| 711 | ||
| 712 | void | |
| 713 | gaim_marshal_BOOLEAN__POINTER_POINTER_UINT(GaimCallback cb, | |
| 714 | va_list args, | |
| 715 | void *data, | |
| 716 | void **return_val) | |
| 717 | { | |
| 718 | gboolean ret_val; | |
| 719 | void *arg1 = va_arg(args, void *); | |
| 720 | void *arg2 = va_arg(args, void *); | |
| 721 | guint arg3 = va_arg(args, guint); | |
| 722 | ||
| 723 | ret_val = ((gboolean (*)(void *, void *, guint, void *))cb)( | |
| 724 | arg1, arg2, arg3, data); | |
| 725 | ||
| 726 | if (return_val != NULL) | |
| 727 | *return_val = GINT_TO_POINTER(ret_val); | |
| 728 | } | |
| 729 | ||
| 730 | void | |
| 6485 | 731 | gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT(GaimCallback cb, |
| 732 | va_list args, | |
| 733 | void *data, | |
| 734 | void **return_val) | |
| 735 | { | |
| 736 | gboolean ret_val; | |
| 6505 | 737 | void *arg1 = va_arg(args, void *); |
| 738 | void *arg2 = va_arg(args, void *); | |
| 739 | void *arg3 = va_arg(args, void *); | |
| 740 | guint arg4 = va_arg(args, guint); | |
| 6485 | 741 | |
| 742 | ret_val = ((gboolean (*)(void *, void *, void *, guint, void *))cb)( | |
| 6505 | 743 | arg1, arg2, arg3, arg4, data); |
| 6485 | 744 | |
| 745 | if (return_val != NULL) | |
| 746 | *return_val = GINT_TO_POINTER(ret_val); | |
| 747 | } | |
| 748 | ||
| 749 | void | |
| 750 | gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER(GaimCallback cb, | |
| 751 | va_list args, | |
| 752 | void *data, | |
| 753 | void **return_val) | |
| 754 | { | |
| 755 | gboolean ret_val; | |
| 6505 | 756 | void *arg1 = va_arg(args, void *); |
| 757 | void *arg2 = va_arg(args, void *); | |
| 758 | void *arg3 = va_arg(args, void *); | |
| 759 | void *arg4 = va_arg(args, void *); | |
| 6485 | 760 | |
| 761 | ret_val = ((gboolean (*)(void *, void *, void *, void *, void *))cb)( | |
| 6505 | 762 | arg1, arg2, arg3, arg4, data); |
| 6485 | 763 | |
| 764 | if (return_val != NULL) | |
| 765 | *return_val = GINT_TO_POINTER(ret_val); | |
| 766 | } | |
| 767 | ||
| 768 | void | |
| 769 | gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER( | |
| 770 | GaimCallback cb, va_list args, void *data, void **return_val) | |
| 771 | { | |
| 772 | gboolean ret_val; | |
| 6505 | 773 | void *arg1 = va_arg(args, void *); |
| 774 | void *arg2 = va_arg(args, void *); | |
| 775 | void *arg3 = va_arg(args, void *); | |
| 776 | void *arg4 = va_arg(args, void *); | |
| 777 | void *arg5 = va_arg(args, void *); | |
| 6485 | 778 | |
| 779 | ret_val = | |
| 780 | ((gboolean (*)(void *, void *, void *, void *, void *, void *))cb)( | |
| 6505 | 781 | arg1, arg2, arg3, arg4, arg5, data); |
| 6485 | 782 | |
| 783 | if (return_val != NULL) | |
| 784 | *return_val = GINT_TO_POINTER(ret_val); | |
| 785 | } |