grim/purple-signals

8479c38beb30
Parents 183bf277b88a
Children 1097c103e468
re-namespacing and creation of PurpleGSignalHandle
  • +64 -18
    signals.c
  • +16 -1
    signals.h
  • --- 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 @@
    GConnectFlags flags;
    GQuark detail;
    GType return_type;
    -} PurpleSignalData;
    +} PurpleGSignalData;
    static gboolean
    -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;
    GObject *obj = NULL;
    gboolean swap = FALSE, after = FALSE;
    GClosure *closure = NULL;
    @@ -51,26 +51,24 @@
    return TRUE;
    }
    -gulong
    +PurpleGSignalHandle *
    purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d) {
    - PurpleSignalData *sd = NULL;
    + PurpleGSignalData *sd = NULL;
    + PurpleGSignalHandle *handle = NULL;
    + GQuark detail = 0;
    GSignalQuery query;
    - GQuark detail = 0;
    - guint sig_id = 0;
    - gulong ret = 0;
    + guint signal_id = 0;
    + gulong hook_id = 0;
    gpointer *klass = 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))
    return 0;
    - }
    - g_signal_query(sig_id, &query);
    + g_signal_query(signal_id, &query);
    - sd = g_new0(PurpleSignalData, 1);
    + sd = g_new(PurpleGSignalData, 1);
    sd->callback = cb;
    sd->user_data = d;
    sd->flags = 0;
    @@ -78,12 +76,60 @@
    sd->type = t;
    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,
    + sd, g_free);
    g_type_class_unref(klass);
    - return ret;
    + handle = purple_g_signal_handle_new(signal_id, hook_id);
    +
    + return handle;
    +}
    +
    +/******************************************************************************
    + * PurpleSignalHandle API
    + *****************************************************************************/
    +GType
    +purple_g_signal_handle_get_type(void) {
    + static GType type = 0;
    +
    + if(G_UNLIKELY(type == 0)) {
    + type =
    + g_boxed_type_register_static("PurpleSignalHandle",
    + (GBoxedCopyFunc)purple_g_signal_handle_copy,
    + (GBoxedFreeFunc)purple_g_signal_handle_free);
    +
    + }
    +
    + return type;
    }
    +PurpleGSignalHandle *
    +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;
    +
    + return handle;
    +}
    +
    +PurpleGSignalHandle *
    +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);
    +
    + return copy;
    +}
    +
    +void
    +purple_g_signal_handle_free(PurpleGSignalHandle *handle) {
    + g_free(handle);
    +}
    +
    --- a/signals.h Fri Jul 10 08:06:50 2009 -0500
    +++ b/signals.h Fri Jul 10 17:52:18 2009 -0500
    @@ -4,9 +4,24 @@
    #include <glib.h>
    #include <glib-object.h>
    +#define PURPLE_TYPE_SIGNAL_HANDLE (purple_signal_handle_get_type())
    +
    +typedef struct _PurpleGSignalHandle PurpleGSignalHandle;
    +
    +struct _PurpleGSignalHandle {
    + guint signal_id;
    + gulong hook_id;
    +};
    +
    G_BEGIN_DECLS
    -gulong purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d);
    +PurpleGSignalHandle *purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d);
    +gboolean purple_g_signal_disconnect(PurpleGSignalHandle *handle);
    +
    +GType purple_g_signal_handle_get_gtype(void);
    +PurpleGSignalHandle *purple_g_signal_handle_new(guint signal_id, gulong hook_id);
    +PurpleGSignalHandle *purple_g_signal_handle_copy(const PurpleGSignalHandle *handle);
    +void purple_g_signal_handle_free(PurpleGSignalHandle *handle);
    G_END_DECLS