grim/purple-signals

Parents ccb48ffaf202
Children afde8599ee8c
moved everything to it's own files, fixed the build system for it, still failing miserably at actually making this work
  • +1 -0
    .hgignore
  • +20 -8
    Makefile
  • +63 -0
    object.c
  • +30 -0
    object.h
  • +3 -152
    purple_signals.c
  • +82 -0
    signals.c
  • +13 -0
    signals.h
  • --- a/.hgignore Thu Jul 09 21:56:37 2009 -0500
    +++ b/.hgignore Thu Jul 09 23:01:10 2009 -0500
    @@ -2,3 +2,4 @@
    marshallers.[ch]
    purple_signals
    .*.swp
    +*.o
    --- a/Makefile Thu Jul 09 21:56:37 2009 -0500
    +++ b/Makefile Thu Jul 09 23:01:10 2009 -0500
    @@ -1,21 +1,30 @@
    TARGET=purple_signals
    -SOURCES=purple_signals.c
    +SOURCES=purple_signals.c signals.c marshallers.c object.c
    -BUILT_SOURCES=marshallers.c marshallers.h
    +HEADERS=marshallers.h signals.h object.h
    GLIB_GENMARSHAL=`pkg-config --variable=glib_genmarshal glib-2.0`
    CC=gcc
    -ARGS=\
    - `pkg-config --libs --cflags glib-2.0` \
    - `pkg-config --libs --cflags gobject-2.0` \
    +CFLAGS=\
    + `pkg-config --cflags glib-2.0` \
    + `pkg-config --cflags gobject-2.0` \
    -g -g3 -Wall
    +LIBS=\
    + `pkg-config --libs glib-2.0` \
    + `pkg-config --libs gobject-2.0`
    +
    +OBJS=$(SOURCES:%.c=%.o) $(BUILT_SOURCES:%.c=%.o)
    +
    all: $(TARGET)
    -$(TARGET): $(SOURCES) $(BUILT_SOURCES)
    - $(CC) $(ARGS) $(SOURCES) $(BUILT_SOURCES) -o $(TARGET)
    +%.o: %.c
    + $(CC) $(CFLAGS) -c -o $@ $<
    +
    +$(TARGET): $(BUILT_SOURCES) $(OBJS) $(HEADERS)
    + $(CC) $(LIBS) $(OBJS) $(BUILT_SOURCES) -o $(TARGET)
    marshallers.h: marshallers.list
    $(GLIB_GENMARSHAL) --prefix=purple_marshal marshallers.list --header > marshallers.h
    @@ -24,5 +33,8 @@
    $(GLIB_GENMARSHAL) --prefix=purple_marshal marshallers.list --body > marshallers.c
    clean:
    - rm -f *.o $(TARGET) $(BUILT_SOURCES)
    + rm -f *.o $(TARGET) $(BUILT_SOURCES) $(OBJS)
    +info:
    + echo $(OBJS)
    +
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/object.c Thu Jul 09 23:01:10 2009 -0500
    @@ -0,0 +1,63 @@
    +#include "marshallers.h"
    +#include "object.h"
    +
    +#include <stdio.h>
    +
    +enum {
    + SIG_SIMPLE,
    + SIG_BOOLEAN_RETURN,
    + SIG_LAST
    +};
    +
    +static guint signals[SIG_LAST] = { 0, };
    +
    +G_DEFINE_TYPE(PurpleObject, purple_object, G_TYPE_OBJECT);
    +
    +static void
    +purple_object_init(PurpleObject *obj) {
    +}
    +
    +static void
    +purple_object_class_init(PurpleObjectClass *klass) {
    + signals[SIG_SIMPLE] =
    + g_signal_new("simple",
    + G_OBJECT_CLASS_TYPE(klass),
    + G_SIGNAL_RUN_LAST,
    + G_STRUCT_OFFSET(PurpleObjectClass, simple_signal),
    + NULL, NULL,
    + purple_marshal_VOID__OBJECT,
    + G_TYPE_NONE,
    + 1, PURPLE_TYPE_OBJECT);
    +
    + signals[SIG_BOOLEAN_RETURN] =
    + g_signal_new("boolean-return",
    + G_OBJECT_CLASS_TYPE(klass),
    + G_SIGNAL_RUN_LAST,
    + G_STRUCT_OFFSET(PurpleObjectClass, boolean_ret_signal),
    + NULL, NULL,
    + purple_marshal_BOOLEAN__OBJECT,
    + G_TYPE_BOOLEAN,
    + 1, PURPLE_TYPE_OBJECT);
    +}
    +
    +PurpleObject *
    +purple_object_new(void) {
    + return g_object_new(PURPLE_TYPE_OBJECT, NULL);
    +}
    +
    +void
    +purple_object_emit_signals(PurpleObject *obj) {
    + gboolean ret = FALSE;
    +
    + g_return_if_fail(G_TYPE_CHECK_INSTANCE_TYPE(obj, PURPLE_TYPE_OBJECT));
    + printf("passed error check\n");
    +
    + g_signal_emit(obj, signals[SIG_SIMPLE], 0, NULL);
    + printf("emitted simple\n");
    +// g_signal_emit_by_name(obj, "boolean-return", &ret);
    + printf("emitted boolean\n");
    +
    + printf("boolean return was '%s'\n", (ret) ? "True" : "False");
    +}
    +
    +
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/object.h Thu Jul 09 23:01:10 2009 -0500
    @@ -0,0 +1,30 @@
    +#ifndef PURPLE_OBJECT_H
    +#define PURPLE_OBJECT_H
    +
    +#include <glib.h>
    +#include <glib-object.h>
    +
    +#define PURPLE_TYPE_OBJECT (purple_object_get_type())
    +#define PURPLE_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_OBJECT))
    +
    +typedef struct {
    + GObject parent;
    +} PurpleObject;
    +
    +typedef struct {
    + GObjectClass parent;
    +
    + void (*simple_signal)(PurpleObject *obj);
    + gboolean (*boolean_ret_signal)(PurpleObject *obj);
    +} PurpleObjectClass;
    +
    +G_BEGIN_DECLS
    +
    +GType purple_object_get_type(void);
    +PurpleObject *purple_object_new(void);
    +
    +void purple_object_emit_signals(PurpleObject *obj);
    +
    +G_END_DECLS
    +
    +#endif /* PURPLE_OBJECT_H */
    --- a/purple_signals.c Thu Jul 09 21:56:37 2009 -0500
    +++ b/purple_signals.c Thu Jul 09 23:01:10 2009 -0500
    @@ -3,157 +3,8 @@
    #include <stdio.h>
    -#include "marshallers.h"
    -
    -/******************************************************************************
    - * Object Stuff
    - *****************************************************************************/
    -enum {
    - SIG_SIMPLE,
    - SIG_BOOLEAN_RETURN,
    - SIG_LAST
    -};
    -
    -static guint signals[SIG_LAST] = { 0, };
    -
    -typedef struct {
    - GObject parent;
    -} PurpleObject;
    -
    -typedef struct {
    - GObjectClass parent;
    -
    - void (*simple_signal)(PurpleObject *obj);
    - gboolean (*boolean_ret_signal)(PurpleObject *obj);
    -} PurpleObjectClass;
    -
    -#define PURPLE_TYPE_OBJECT (purple_object_get_type())
    -
    -G_DEFINE_TYPE(PurpleObject, purple_object, G_TYPE_OBJECT);
    -
    -static void
    -purple_object_init(PurpleObject *obj) {
    -}
    -
    -static void
    -purple_object_class_init(PurpleObjectClass *klass) {
    - GObjectClass *obj_class = G_OBJECT_CLASS(klass);
    -
    - signals[SIG_SIMPLE] =
    - g_signal_new("simple",
    - G_OBJECT_CLASS_TYPE(klass),
    - G_SIGNAL_RUN_LAST,
    - G_STRUCT_OFFSET(PurpleObjectClass, simple_signal),
    - NULL, NULL,
    - purple_marshal_VOID__OBJECT,
    - G_TYPE_NONE,
    - 1, PURPLE_TYPE_OBJECT);
    -
    - signals[SIG_BOOLEAN_RETURN] =
    - g_signal_new("boolean-return",
    - G_OBJECT_CLASS_TYPE(klass),
    - G_SIGNAL_RUN_LAST,
    - G_STRUCT_OFFSET(PurpleObjectClass, boolean_ret_signal),
    - NULL, NULL,
    - purple_marshal_BOOLEAN__OBJECT,
    - G_TYPE_BOOLEAN,
    - 1, PURPLE_TYPE_OBJECT);
    -}
    -
    -static void
    -purple_object_emit_signals(PurpleObject *obj) {
    - gboolean ret = FALSE;
    -
    - g_return_if_fail(G_TYPE_CHECK_INSTANCE_TYPE(obj, PURPLE_TYPE_OBJECT));
    - printf("passed error check\n");
    -
    - g_signal_emit_by_name(obj, "simple");
    - printf("emitted simple\n\n");
    -// g_signal_emit_by_name(obj, "boolean-return", &ret);
    - printf("emitted boolean\n");
    -
    - printf("boolean return was '%s'\n", (ret) ? "True" : "False");
    -}
    -
    -/******************************************************************************
    - * Purple Signal Stuff
    - *****************************************************************************/
    -typedef struct {
    - GType type;
    - GCallback callback;
    - gpointer user_data;
    - GConnectFlags flags;
    - GQuark detail;
    -} PurpleSignalData;
    -
    -static gboolean
    -purple_signal_emission_hook(GSignalInvocationHint *hint, guint n_params,
    - const GValue *pvalues, gpointer data)
    -{
    - PurpleSignalData *sd = data;
    - PurpleObject *obj = NULL;
    - gint flags = G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC;
    -
    - printf("emission_hook\n");
    - obj = g_value_get_object(pvalues + 0);
    -
    - if(!G_TYPE_CHECK_INSTANCE_TYPE(obj, sd->type))
    - return TRUE;
    -
    - if(g_signal_handler_find(obj, flags, hint->signal_id, sd->detail, NULL,
    - sd->callback, sd->user_data) != 0)
    - {
    - gboolean swap = FALSE, after = FALSE;
    - GClosure *closure = NULL;
    -
    - printf("found handler\n");
    -
    - swap = (sd->flags & G_CONNECT_SWAPPED);
    - after = (sd->flags & G_CONNECT_AFTER);
    -
    - if(swap)
    - closure = g_cclosure_new_swap(sd->callback, sd->user_data, NULL);
    - else
    - 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);
    - }
    -
    - return TRUE;
    -}
    -
    -gulong
    -purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d) {
    - PurpleSignalData *sd = NULL;
    - GQuark detail = 0;
    - guint sig_id = 0;
    - gulong ret = 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));
    -
    - return 0;
    - }
    -
    - printf("sig_id: %d; detail: %d\n", sig_id, detail);
    - sd = g_new0(PurpleSignalData, 1);
    - sd->callback = cb;
    - sd->user_data = d;
    - sd->flags = 0;
    - sd->detail = detail;
    - sd->type = t;
    -
    - ret = g_signal_add_emission_hook(sig_id, detail,
    - purple_signal_emission_hook, sd, g_free);
    -
    - g_type_class_unref(klass);
    -
    - return ret;
    -}
    +#include "object.h"
    +#include "signals.h"
    /******************************************************************************
    * callbacks
    @@ -193,7 +44,7 @@
    printf("timeout_cb\n");
    - obj = g_object_new(PURPLE_TYPE_OBJECT, NULL);
    + obj = purple_object_new();
    printf("created obj\n");
    purple_object_emit_signals(obj);
    printf("emitted signals\n");
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/signals.c Thu Jul 09 23:01:10 2009 -0500
    @@ -0,0 +1,82 @@
    +#include "signals.h"
    +
    +#include <stdio.h>
    +
    +typedef struct {
    + GType type;
    + GCallback callback;
    + gpointer user_data;
    + GConnectFlags flags;
    + GQuark detail;
    +} PurpleSignalData;
    +
    +static gboolean
    +purple_signal_emission_hook(GSignalInvocationHint *hint, guint n_params,
    + const GValue *pvalues, gpointer data)
    +{
    + PurpleSignalData *sd = data;
    + GObject *obj = NULL;
    + gint flags = G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC;
    +
    + printf("emission_hook\n");
    + obj = g_value_get_object(pvalues + 0);
    +
    + if(!G_TYPE_CHECK_INSTANCE_TYPE(obj, sd->type))
    + return TRUE;
    +
    + if(g_signal_handler_find(obj, flags, hint->signal_id, sd->detail, NULL,
    + sd->callback, sd->user_data) != 0)
    + {
    + gboolean swap = FALSE, after = FALSE;
    + GClosure *closure = NULL;
    +
    + printf("found handler\n");
    +
    + swap = (sd->flags & G_CONNECT_SWAPPED);
    + after = (sd->flags & G_CONNECT_AFTER);
    +
    + if(swap)
    + closure = g_cclosure_new_swap(sd->callback, sd->user_data, NULL);
    + else
    + 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);
    + }
    +
    + return TRUE;
    +}
    +
    +gulong
    +purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d) {
    + PurpleSignalData *sd = NULL;
    + GQuark detail = 0;
    + guint sig_id = 0;
    + gulong ret = 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));
    +
    + return 0;
    + }
    +
    + printf("sig_id: %d; detail: %d\n", sig_id, detail);
    + sd = g_new0(PurpleSignalData, 1);
    + sd->callback = cb;
    + sd->user_data = d;
    + sd->flags = 0;
    + sd->detail = detail;
    + sd->type = t;
    +
    + ret = g_signal_add_emission_hook(sig_id, detail,
    + purple_signal_emission_hook, sd, g_free);
    +
    + g_type_class_unref(klass);
    +
    + return ret;
    +}
    +
    +
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/signals.h Thu Jul 09 23:01:10 2009 -0500
    @@ -0,0 +1,13 @@
    +#ifndef PURPLE_SIGNALS_H
    +#define PURPLE_SIGNALS_H
    +
    +#include <glib.h>
    +#include <glib-object.h>
    +
    +G_BEGIN_DECLS
    +
    +gulong purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d);
    +
    +G_END_DECLS
    +
    +#endif /* PURPLE_SIGNALS_H */