--- a/signals.c Fri Jul 10 08:06:50 2009 -0500
+++ b/signals.c Fri Jul 10 17:52:18 2009 -0500
@@ -9,13 +9,13 @@
-purple_signal_emission_hook(GSignalInvocationHint *hint, guint n_params,
- const GValue *pvalues, gpointer data)
+purple_g_signal_emission_hook(GSignalInvocationHint *hint, guint n_params, + const GValue *pvalues, gpointer data) - PurpleSignalData *sd = data;
+ PurpleGSignalData *sd = data; gboolean swap = FALSE, after = FALSE;
GClosure *closure = NULL;
@@ -51,26 +51,24 @@
purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d) {
- PurpleSignalData *sd = NULL;
+ PurpleGSignalData *sd = NULL; + PurpleGSignalHandle *handle = NULL;
klass = g_type_class_ref(t);
- if(!g_signal_parse_name(n, t, &sig_id, &detail, TRUE)) {
- printf("failed to find signal '%s' for object '%s'!\n", n, g_type_name(t));
+ if(!g_signal_parse_name(n, t, &signal_id, &detail, TRUE))
- g_signal_query(sig_id, &query);
+ g_signal_query(signal_id, &query); - sd = g_new0(PurpleSignalData, 1);
+ sd = g_new(PurpleGSignalData, 1); @@ -78,12 +76,60 @@
sd->return_type = query.return_type;
- ret = g_signal_add_emission_hook(sig_id, detail,
- purple_signal_emission_hook, sd, g_free);
+ hook_id = g_signal_add_emission_hook(signal_id, detail, + purple_g_signal_emission_hook, g_type_class_unref(klass);
+ handle = purple_g_signal_handle_new(signal_id, hook_id); +/****************************************************************************** + * PurpleSignalHandle API + *****************************************************************************/ +purple_g_signal_handle_get_type(void) { + if(G_UNLIKELY(type == 0)) { + g_boxed_type_register_static("PurpleSignalHandle", + (GBoxedCopyFunc)purple_g_signal_handle_copy, + (GBoxedFreeFunc)purple_g_signal_handle_free); +purple_g_signal_handle_new(guint signal_id, gulong hook_id) { + PurpleGSignalHandle *handle = NULL; + handle = g_new(PurpleGSignalHandle, 1); + handle->signal_id = signal_id; + handle->hook_id = hook_id; +purple_g_signal_handle_copy(const PurpleGSignalHandle *handle) { + PurpleGSignalHandle *copy = NULL; + g_return_val_if_fail(handle, NULL); + copy = purple_g_signal_handle_new(handle->signal_id, handle->hook_id); +purple_g_signal_handle_free(PurpleGSignalHandle *handle) {