Mercurial > pidgin.yaz
diff src/signals.c @ 6564:800ef4a51096
[gaim-migrate @ 7086]
gaim_signal_register now takes a GaimValue return value and param types.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Thu, 21 Aug 2003 21:54:36 +0000 |
parents | 9e4fa4853cfe |
children | 7dba3e17cb21 |
line wrap: on
line diff
--- a/src/signals.c Thu Aug 21 21:21:21 2003 +0000 +++ b/src/signals.c Thu Aug 21 21:54:36 2003 +0000 @@ -24,6 +24,7 @@ #include "debug.h" #include "signals.h" +#include "value.h" typedef struct { @@ -42,6 +43,10 @@ GaimSignalMarshalFunc marshal; + int num_values; + GaimValue **values; + GaimValue *ret_value; + GList *handlers; size_t handler_count; @@ -84,15 +89,27 @@ g_list_free(signal_data->handlers); + if (signal_data->values != NULL) + { + int i; + + for (i = 0; i < signal_data->num_values; i++) + gaim_value_destroy((GaimValue *)signal_data->values[i]); + + g_free(signal_data->values); + } + g_free(signal_data); } gulong gaim_signal_register(void *instance, const char *signal, - GaimSignalMarshalFunc marshal) + GaimSignalMarshalFunc marshal, + GaimValue *ret_value, int num_values, ...) { GaimInstanceData *instance_data; GaimSignalData *signal_data; + va_list args; g_return_val_if_fail(instance != NULL, 0); g_return_val_if_fail(signal != NULL, 0); @@ -119,6 +136,22 @@ signal_data->id = instance_data->next_signal_id; signal_data->marshal = marshal; signal_data->next_handler_id = 1; + signal_data->ret_value = ret_value; + signal_data->num_values = num_values; + + if (num_values > 0) + { + int i; + + signal_data->values = g_new0(GaimValue *, num_values); + + va_start(args, num_values); + + for (i = 0; i < num_values; i++) + signal_data->values[i] = va_arg(args, GaimValue *); + + va_end(args); + } g_hash_table_insert(instance_data->signals, g_strdup(signal), signal_data); @@ -169,6 +202,38 @@ g_return_if_fail(found); } +void +gaim_signal_get_values(void *instance, const char *signal, + GaimValue **ret_value, + int *num_values, GaimValue ***values) +{ + GaimInstanceData *instance_data; + GaimSignalData *signal_data; + + g_return_if_fail(instance != NULL); + g_return_if_fail(signal != NULL); + g_return_if_fail(num_values != NULL); + g_return_if_fail(values != NULL); + + /* Get the instance data */ + instance_data = + (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); + + g_return_if_fail(instance_data != NULL); + + /* Get the signal data */ + signal_data = + (GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal); + + g_return_if_fail(signal_data != NULL); + + *num_values = signal_data->num_values; + *values = signal_data->values; + + if (ret_value != NULL) + *ret_value = signal_data->ret_value; +} + static gulong signal_connect_common(void *instance, const char *signal, void *handle, GaimCallback func, void *data, gboolean use_vargs)