Mercurial > pidgin.yaz
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) |