grim/purple-signals

Parents 45edce1be72f
Children 8479c38beb30
a few more updates to get return values working, based off of sadrul's patch
  • +1 -1
    marshallers.list
  • +4 -4
    object.c
  • +15 -2
    signals.c
  • --- a/marshallers.list Fri Jul 10 07:41:13 2009 -0500
    +++ b/marshallers.list Fri Jul 10 08:06:50 2009 -0500
    @@ -1,2 +1,2 @@
    VOID:VOID
    -BOOLEAN:OBJECT
    +BOOLEAN:VOID
    --- a/object.c Fri Jul 10 07:41:13 2009 -0500
    +++ b/object.c Fri Jul 10 08:06:50 2009 -0500
    @@ -35,7 +35,7 @@
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET(PurpleObjectClass, boolean_ret_signal),
    NULL, NULL,
    - purple_marshal_BOOLEAN__OBJECT,
    + purple_marshal_BOOLEAN__VOID,
    G_TYPE_BOOLEAN,
    0);
    }
    @@ -54,10 +54,10 @@
    g_signal_emit(obj, signals[SIG_SIMPLE], 0);
    printf("emitted simple\n");
    -// g_signal_emit_by_name(obj, "boolean-return", &ret, NULL);
    -// printf("emitted boolean\n");
    + g_signal_emit_by_name(obj, "boolean-return", &ret, NULL);
    + printf("emitted boolean\n");
    -// printf("boolean return was '%s'\n", (ret) ? "True" : "False");
    + printf("boolean return was '%s'\n", (ret) ? "True" : "False");
    }
    --- a/signals.c Fri Jul 10 07:41:13 2009 -0500
    +++ b/signals.c Fri Jul 10 08:06:50 2009 -0500
    @@ -8,6 +8,7 @@
    gpointer user_data;
    GConnectFlags flags;
    GQuark detail;
    + GType return_type;
    } PurpleSignalData;
    static gboolean
    @@ -36,7 +37,16 @@
    closure = g_cclosure_new(sd->callback, sd->user_data, NULL);
    g_signal_connect_closure_by_id(obj, hint->signal_id, sd->detail, closure, after);
    - g_closure_invoke(closure, NULL, n_params, pvalues, hint);
    +
    + if(sd->return_type != G_TYPE_NONE) {
    + GValue ret = { 0, };
    +
    + g_value_init(&ret, sd->return_type);
    +
    + g_closure_invoke(closure, &ret, n_params, pvalues, hint);
    + } else {
    + g_closure_invoke(closure, NULL, n_params, pvalues, hint);
    + }
    return TRUE;
    }
    @@ -44,6 +54,7 @@
    gulong
    purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d) {
    PurpleSignalData *sd = NULL;
    + GSignalQuery query;
    GQuark detail = 0;
    guint sig_id = 0;
    gulong ret = 0;
    @@ -57,13 +68,15 @@
    return 0;
    }
    - printf("sig_id: %d; detail: %d\n", sig_id, detail);
    + g_signal_query(sig_id, &query);
    +
    sd = g_new0(PurpleSignalData, 1);
    sd->callback = cb;
    sd->user_data = d;
    sd->flags = 0;
    sd->detail = detail;
    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);