grim/purple-signals
moved everything to it's own files, fixed the build system for it, still failing miserably at actually making this work
--- a/.hgignore Thu Jul 09 21:56:37 2009 -0500
+++ b/.hgignore Thu Jul 09 23:01:10 2009 -0500
@@ -2,3 +2,4 @@
--- a/Makefile Thu Jul 09 21:56:37 2009 -0500
+++ b/Makefile Thu Jul 09 23:01:10 2009 -0500
@@ -1,21 +1,30 @@
-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`
- `pkg-config --libs --cflags glib-2.0` \
- `pkg-config --libs --cflags gobject-2.0` \
+ `pkg-config --cflags glib-2.0` \ + `pkg-config --cflags gobject-2.0` \ + `pkg-config --libs glib-2.0` \ + `pkg-config --libs gobject-2.0` +OBJS=$(SOURCES:%.c=%.o) $(BUILT_SOURCES:%.c=%.o) -$(TARGET): $(SOURCES) $(BUILT_SOURCES)
- $(CC) $(ARGS) $(SOURCES) $(BUILT_SOURCES) -o $(TARGET)
+ $(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
- rm -f *.o $(TARGET) $(BUILT_SOURCES)
+ rm -f *.o $(TARGET) $(BUILT_SOURCES) $(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" +static guint signals[SIG_LAST] = { 0, }; +G_DEFINE_TYPE(PurpleObject, purple_object, G_TYPE_OBJECT); +purple_object_init(PurpleObject *obj) { +purple_object_class_init(PurpleObjectClass *klass) { + G_OBJECT_CLASS_TYPE(klass), + G_STRUCT_OFFSET(PurpleObjectClass, simple_signal), + purple_marshal_VOID__OBJECT, + 1, PURPLE_TYPE_OBJECT); + signals[SIG_BOOLEAN_RETURN] = + g_signal_new("boolean-return", + G_OBJECT_CLASS_TYPE(klass), + G_STRUCT_OFFSET(PurpleObjectClass, boolean_ret_signal), + purple_marshal_BOOLEAN__OBJECT, + 1, PURPLE_TYPE_OBJECT); +purple_object_new(void) { + return g_object_new(PURPLE_TYPE_OBJECT, NULL); +purple_object_emit_signals(PurpleObject *obj) { + 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 @@
+#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)) + void (*simple_signal)(PurpleObject *obj); + gboolean (*boolean_ret_signal)(PurpleObject *obj); +GType purple_object_get_type(void); +PurpleObject *purple_object_new(void); +void purple_object_emit_signals(PurpleObject *obj); +#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 "marshallers.h"
-/******************************************************************************
- *****************************************************************************/
-static guint signals[SIG_LAST] = { 0, };
- void (*simple_signal)(PurpleObject *obj);
- gboolean (*boolean_ret_signal)(PurpleObject *obj);
-#define PURPLE_TYPE_OBJECT (purple_object_get_type())
-G_DEFINE_TYPE(PurpleObject, purple_object, G_TYPE_OBJECT);
-purple_object_init(PurpleObject *obj) {
-purple_object_class_init(PurpleObjectClass *klass) {
- GObjectClass *obj_class = G_OBJECT_CLASS(klass);
- G_OBJECT_CLASS_TYPE(klass),
- G_STRUCT_OFFSET(PurpleObjectClass, simple_signal),
- purple_marshal_VOID__OBJECT,
- 1, PURPLE_TYPE_OBJECT);
- signals[SIG_BOOLEAN_RETURN] =
- g_signal_new("boolean-return",
- G_OBJECT_CLASS_TYPE(klass),
- G_STRUCT_OFFSET(PurpleObjectClass, boolean_ret_signal),
- purple_marshal_BOOLEAN__OBJECT,
- 1, PURPLE_TYPE_OBJECT);
-purple_object_emit_signals(PurpleObject *obj) {
- 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_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))
- 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);
- closure = g_cclosure_new_swap(sd->callback, sd->user_data, NULL);
- 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);
-purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d) {
- PurpleSignalData *sd = NULL;
- 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));
- printf("sig_id: %d; detail: %d\n", sig_id, detail);
- sd = g_new0(PurpleSignalData, 1);
- ret = g_signal_add_emission_hook(sig_id, detail,
- purple_signal_emission_hook, sd, g_free);
- g_type_class_unref(klass);
/******************************************************************************
@@ -193,7 +44,7 @@
- obj = g_object_new(PURPLE_TYPE_OBJECT, NULL);
+ obj = purple_object_new(); 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 @@
+purple_signal_emission_hook(GSignalInvocationHint *hint, guint n_params, + const GValue *pvalues, gpointer data) + PurpleSignalData *sd = data; + 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)) + 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); + closure = g_cclosure_new_swap(sd->callback, sd->user_data, NULL); + 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); +purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d) { + PurpleSignalData *sd = NULL; + 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)); + printf("sig_id: %d; detail: %d\n", sig_id, detail); + sd = g_new0(PurpleSignalData, 1); + ret = g_signal_add_emission_hook(sig_id, detail, + purple_signal_emission_hook, sd, g_free); + g_type_class_unref(klass); --- /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-object.h> +gulong purple_g_signal_connect(GType t, const gchar *n, GCallback cb, gpointer d); +#endif /* PURPLE_SIGNALS_H */