comparison src/signals.c @ 10656:9b223bf37ca0

[gaim-migrate @ 12186] sf patch #1154788, from Will Gorman I added two new functions to signal_handler.h which allows one to specify priority when registering a signal callback. the functions are: gulong gaim_signal_connect_priority(void *instance, const char *signal, void *handle, GaimCallback func, void *data, int priority); and gulong gaim_signal_connect_priority_vargs(void *instance, const char *signal, void *handle, GaimCallback func, void *data, int priority); (thanks Gary for the suggestion) This allows plugins to specify in what order their callbacks get called. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sun, 06 Mar 2005 01:27:39 +0000
parents def1c69ae8af
children c80a609bd747
comparison
equal deleted inserted replaced
10655:9699787f1c55 10656:9b223bf37ca0
64 gulong id; 64 gulong id;
65 GaimCallback cb; 65 GaimCallback cb;
66 void *handle; 66 void *handle;
67 void *data; 67 void *data;
68 gboolean use_vargs; 68 gboolean use_vargs;
69 int priority;
69 70
70 } GaimSignalHandlerData; 71 } GaimSignalHandlerData;
71 72
72 static GHashTable *instance_table = NULL; 73 static GHashTable *instance_table = NULL;
73 74
239 240
240 if (ret_value != NULL) 241 if (ret_value != NULL)
241 *ret_value = signal_data->ret_value; 242 *ret_value = signal_data->ret_value;
242 } 243 }
243 244
245 static gint handler_priority(void * a, void * b) {
246 GaimSignalHandlerData *ah = (GaimSignalHandlerData*)a;
247 GaimSignalHandlerData *bh = (GaimSignalHandlerData*)b;
248 if (ah->priority > bh->priority) return 1;
249 if (ah->priority < bh->priority) return -1;
250 return 0;
251 }
252
244 static gulong 253 static gulong
245 signal_connect_common(void *instance, const char *signal, void *handle, 254 signal_connect_common(void *instance, const char *signal, void *handle,
246 GaimCallback func, void *data, gboolean use_vargs) 255 GaimCallback func, void *data, int priority, gboolean use_vargs)
247 { 256 {
248 GaimInstanceData *instance_data; 257 GaimInstanceData *instance_data;
249 GaimSignalData *signal_data; 258 GaimSignalData *signal_data;
250 GaimSignalHandlerData *handler_data; 259 GaimSignalHandlerData *handler_data;
251 260
276 handler_data->id = signal_data->next_handler_id; 285 handler_data->id = signal_data->next_handler_id;
277 handler_data->cb = func; 286 handler_data->cb = func;
278 handler_data->handle = handle; 287 handler_data->handle = handle;
279 handler_data->data = data; 288 handler_data->data = data;
280 handler_data->use_vargs = use_vargs; 289 handler_data->use_vargs = use_vargs;
281 290 handler_data->priority = priority;
282 signal_data->handlers = g_list_append(signal_data->handlers, handler_data); 291
292 signal_data->handlers = g_list_insert_sorted(signal_data->handlers, handler_data, (GCompareFunc)handler_priority);
283 signal_data->handler_count++; 293 signal_data->handler_count++;
284 signal_data->next_handler_id++; 294 signal_data->next_handler_id++;
285 295
286 return handler_data->id; 296 return handler_data->id;
297 }
298
299 gulong
300 gaim_signal_connect_priority(void *instance, const char *signal, void *handle,
301 GaimCallback func, void *data, int priority)
302 {
303 return signal_connect_common(instance, signal, handle, func, data, priority, FALSE);
287 } 304 }
288 305
289 gulong 306 gulong
290 gaim_signal_connect(void *instance, const char *signal, void *handle, 307 gaim_signal_connect(void *instance, const char *signal, void *handle,
291 GaimCallback func, void *data) 308 GaimCallback func, void *data)
292 { 309 {
293 return signal_connect_common(instance, signal, handle, func, data, FALSE); 310 return signal_connect_common(instance, signal, handle, func, data, GAIM_SIGNAL_PRIORITY_DEFAULT, FALSE);
311 }
312
313 gulong
314 gaim_signal_connect_priority_vargs(void *instance, const char *signal, void *handle,
315 GaimCallback func, void *data, int priority)
316 {
317 return signal_connect_common(instance, signal, handle, func, data, priority, TRUE);
294 } 318 }
295 319
296 gulong 320 gulong
297 gaim_signal_connect_vargs(void *instance, const char *signal, void *handle, 321 gaim_signal_connect_vargs(void *instance, const char *signal, void *handle,
298 GaimCallback func, void *data) 322 GaimCallback func, void *data)
299 { 323 {
300 return signal_connect_common(instance, signal, handle, func, data, TRUE); 324 return signal_connect_common(instance, signal, handle, func, data, GAIM_SIGNAL_PRIORITY_DEFAULT, TRUE);
301 } 325 }
302 326
303 void 327 void
304 gaim_signal_disconnect(void *instance, const char *signal, 328 gaim_signal_disconnect(void *instance, const char *signal,
305 void *handle, GaimCallback func) 329 void *handle, GaimCallback func)