Author: abock
Date: 2006-07-05 23:56:18 -0400 (Wed, 05 Jul 2006)
New Revision: 62291
Added:
branches/abock/dynamicsignals/
branches/abock/dynamicsignals/DynamicSignal.cs
branches/abock/dynamicsignals/GstTest.cs
branches/abock/dynamicsignals/Makefile
branches/abock/dynamicsignals/SignalTest.cs
branches/abock/dynamicsignals/dynamicsignal.c
branches/abock/dynamicsignals/signal-test-marshal.list
branches/abock/dynamicsignals/signal-test.c
branches/abock/dynamicsignals/signal-test.h
Log:
Initial import of dynamicsignals; would like to work on this outside
gstreamer-sharp context for now
Added: branches/abock/dynamicsignals/DynamicSignal.cs
===================================================================
--- branches/abock/dynamicsignals/DynamicSignal.cs 2006-07-06 02:41:21 UTC
(rev 62290)
+++ branches/abock/dynamicsignals/DynamicSignal.cs 2006-07-06 03:56:18 UTC
(rev 62291)
@@ -0,0 +1,135 @@
+//
+// DynamicSignal.cs: C# bindings to g_dynamic_signal to provide
+// dynamic runtime signal binding for GObject
+//
+// Authors:
+// Aaron Bockover ([EMAIL PROTECTED])
+//
+// (C) 2006 Novell, Inc.
+//
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace GLib
+{
+ public delegate void DynamicSignalHandler(object o, DynamicSignalArgs
args);
+
+ public class DynamicSignalArgs : EventArgs
+ {
+ private GLib.Object sender;
+ private object [] args;
+
+ internal DynamicSignalArgs(GLib.Object sender, object [] args)
+ {
+ this.sender = sender;
+ this.args = args;
+ }
+
+ public GLib.Object Sender {
+ get { return sender; }
+ }
+
+ public object [] Args {
+ get { return args; }
+ }
+ }
+
+ public static class DynamicSignal
+ {
+ private delegate void DynamicSignalNativeHandler(IntPtr objectPtr,
uint argc,
+ IntPtr argsPtr, IntPtr userdata);
+
+ private static DynamicSignalNativeHandler dynamic_signal_handler =
+ new DynamicSignalNativeHandler(OnDynamicSignalRaised);
+
+ private static readonly int gvalue_struct_size =
Marshal.SizeOf(typeof(GLib.Value));
+
+ public static void Connect(GLib.Object o, string name,
DynamicSignalHandler handler)
+ {
+ Connect(o, name, false, handler);
+ }
+
+ public static void Connect(GLib.Object o, string name, bool after,
+ DynamicSignalHandler handler)
+ {
+ IntPtr entry_ptr = FindRegisteredEntry(o, name);
+ if(entry_ptr == IntPtr.Zero) {
+ g_dynamic_signal_connect(o.Handle, name,
dynamic_signal_handler,
+ after, (IntPtr)GCHandle.Alloc(handler));
+ return;
+ }
+
+ Delegate registered_handler = GetEntryHandler(entry_ptr);
+ if(registered_handler != null) {
+ Delegate new_handler = Delegate.Combine(registered_handler,
handler);
+ if(new_handler != registered_handler) {
+ g_dynamic_signal_update_entry_userdata(entry_ptr,
+ (IntPtr)GCHandle.Alloc(new_handler));
+ }
+ }
+ }
+
+ public static void Disconnect(GLib.Object o, string name,
DynamicSignalHandler handler)
+ {
+ IntPtr entry_ptr = FindRegisteredEntry(o, name);
+ if(entry_ptr == IntPtr.Zero) {
+ return;
+ }
+
+ Delegate registered_handler = GetEntryHandler(entry_ptr);
+ Delegate new_handler = Delegate.Remove(registered_handler,
handler);
+ if(new_handler == null || handler == null) {
+ g_dynamic_signal_disconnect(o.Handle, name);
+ return;
+ } else if(new_handler != null && registered_handler !=
new_handler) {
+ g_dynamic_signal_update_entry_userdata(entry_ptr,
+ (IntPtr)GCHandle.Alloc(new_handler));
+ }
+ }
+
+ private static IntPtr FindRegisteredEntry(GLib.Object o, string name)
+ {
+ return g_dynamic_signal_find_registration(o.Handle, name);
+ }
+
+ private static DynamicSignalHandler GetEntryHandler(IntPtr entryPtr)
+ {
+ IntPtr handler_ptr = Marshal.ReadIntPtr(entryPtr,
Marshal.SizeOf(typeof(IntPtr)));
+ return (DynamicSignalHandler)((GCHandle)handler_ptr).Target;
+ }
+
+ private static void OnDynamicSignalRaised(IntPtr objectPtr, uint argc,
+ IntPtr argsPtr, IntPtr userdata)
+ {
+ GLib.Object gobject = GLib.Object.GetObject(objectPtr, false);
+ object [] args = new object[argc];
+
+ for(int i = 0; i < argc; i++) {
+ IntPtr struct_ptr = (IntPtr)((long)argsPtr + (i *
gvalue_struct_size));
+ GLib.Value argument = (GLib.Value)Marshal.PtrToStructure(
+ struct_ptr, typeof(GLib.Value));
+ args[i] = argument.Val;
+ }
+
+ DynamicSignalHandler handler =
(DynamicSignalHandler)((GCHandle)userdata).Target;
+ if(handler != null) {
+ handler(gobject, new DynamicSignalArgs(gobject, args));
+ }
+ }
+
+ [DllImport("libgdynamicsignal")]
+ private static extern uint g_dynamic_signal_connect(IntPtr o, string
name,
+ DynamicSignalNativeHandler callback, bool swapped, IntPtr
userdata);
+
+ [DllImport("libgdynamicsignal")]
+ private static extern void g_dynamic_signal_disconnect(IntPtr o,
string name);
+
+ [DllImport("libgdynamicsignal")]
+ private static extern IntPtr g_dynamic_signal_find_registration(IntPtr
o, string name);
+
+ [DllImport("libgdynamicsignal")]
+ private static extern void
g_dynamic_signal_update_entry_userdata(IntPtr entry, IntPtr userdata);
+ }
+}
+
Added: branches/abock/dynamicsignals/GstTest.cs
===================================================================
Added: branches/abock/dynamicsignals/Makefile
===================================================================
--- branches/abock/dynamicsignals/Makefile 2006-07-06 02:41:21 UTC (rev
62290)
+++ branches/abock/dynamicsignals/Makefile 2006-07-06 03:56:18 UTC (rev
62291)
@@ -0,0 +1,29 @@
+C_SOURCES = signal-test.c signal-test.h dynamicsignal.c
+CS_SOURCES = DynamicSignal.cs SignalTest.cs
+GLUE = libgdynamicsignal.so
+ASSEMBLY = dynamicsignal.exe
+
+all: gobject-marshal $(GLUE) $(ASSEMBLY)
+
+gobject-marshal: signal-test-marshal.list
+ glib-genmarshal --header $< > signal-test-marshal.h
+ glib-genmarshal --body $< > signal-test-marshal.c
+
+$(GLUE): $(C_SOURCES)
+ gcc -ggdb3 -Wall -D_FORTIFY_SOURCE=2 -o $@ -shared `pkg-config --libs
--cflags gobject-2.0` $(C_SOURCES) signal-test-marshal.c
+
+$(ASSEMBLY): $(CS_SOURCES)
+ mcs -out:$@ -pkg:glib-sharp-2.0 $(CS_SOURCES)
+
+run:
+ mono $(ASSEMBLY)
+
+clean:
+ rm -f $(ASSEMBLY) $(GLUE) signal-test-marshal.[ch]
+
+dist:
+ mkdir dynamicsignals
+ cp -rf Makefile signal-test-marshal.list $(C_SOURCES) $(CS_SOURCES)
dynamicsignals
+ tar cfz dynamicsignals.tar.gz dynamicsignals
+ rm -rf dynamicsignals
+
Added: branches/abock/dynamicsignals/SignalTest.cs
===================================================================
--- branches/abock/dynamicsignals/SignalTest.cs 2006-07-06 02:41:21 UTC (rev
62290)
+++ branches/abock/dynamicsignals/SignalTest.cs 2006-07-06 03:56:18 UTC (rev
62291)
@@ -0,0 +1,109 @@
+//
+// SignalTest.cs: C# wrapper to GObject SignalTest class
+// and a small use-case that uses DynamicSignal for
+// handling signals
+//
+// Authors:
+// Aaron Bockover ([EMAIL PROTECTED])
+//
+// (C) 2006 Novell, Inc.
+//
+
+using System;
+using System.Runtime.InteropServices;
+
+public class SignalTest : GLib.Object
+{
+ [DllImport("libgdynamicsignal")]
+ private static extern IntPtr signal_test_new();
+
+ [DllImport("libgdynamicsignal")]
+ private static extern void signal_test_raise_all(IntPtr signaltest);
+
+ public SignalTest() : base(signal_test_new())
+ {
+ }
+
+ public void RaiseAll()
+ {
+ signal_test_raise_all(Raw);
+ }
+
+ public static void Main()
+ {
+ SignalTest test = new SignalTest();
+
+ GLib.DynamicSignal.Connect(test, "string-int64-pointer-int",
OnGObjectSignal);
+ GLib.DynamicSignal.Connect(test, "bool-object-uint64",
OnGObjectSignal);
+ test.RaiseAll();
+
+ GLib.DynamicSignal.Connect(test, "string-int64-pointer-int",
OnGObjectSignal2);
+ GLib.DynamicSignal.Disconnect(test, "bool-object-uint64",
OnGObjectSignal);
+ test.RaiseAll();
+
+ GLib.DynamicSignal.Connect(test, "string-int64-pointer-int",
OnGObjectSignal3);
+ test.RaiseAll();
+
+ GLib.DynamicSignal.Disconnect(test, "string-int64-pointer-int",
OnGObjectSignal);
+ GLib.DynamicSignal.Disconnect(test, "string-int64-pointer-int",
OnGObjectSignal2);
+ GLib.DynamicSignal.Disconnect(test, "string-int64-pointer-int",
OnGObjectSignal3);
+
+ GLib.DynamicSignal.Disconnect(test, "bool-object-uint64",
OnGObjectSignal);
+ GLib.DynamicSignal.Disconnect(test, "bool-object-uint64",
OnGObjectSignal2);
+ GLib.DynamicSignal.Disconnect(test, "bool-object-uint64",
OnGObjectSignal3);
+
+ test.RaiseAll();
+
+ Console.WriteLine("Nothign should raise here");
+
+ GLib.DynamicSignal.Connect(test, "bool-object-uint64",
OnGObjectSignal);
+
+ test.RaiseAll();
+
+ GLib.DynamicSignal.Connect(test, "bool-object-uint64",
OnGObjectSignal);
+ test.RaiseAll();
+ GLib.DynamicSignal.Disconnect(test, "bool-object-uint64",
OnGObjectSignal);
+ test.RaiseAll();
+ Console.WriteLine("----");
+
+ GLib.DynamicSignal.Connect(test, "bool-object-uint64",
OnGObjectSignal);
+ GLib.DynamicSignal.Connect(test, "bool-object-uint64",
OnGObjectSignal2);
+ test.RaiseAll();
+ GLib.DynamicSignal.Disconnect(test, "bool-object-uint64",
OnGObjectSignal);
+ GLib.DynamicSignal.Disconnect(test, "bool-object-uint64",
OnGObjectSignal2);
+ test.RaiseAll();
+ Console.WriteLine("----");
+
+ GLib.DynamicSignal.Connect(test, "bool-object-uint64",
OnGObjectSignal);
+ GLib.DynamicSignal.Connect(test, "bool-object-uint64",
OnGObjectSignal2);
+ GLib.DynamicSignal.Connect(test, "bool-object-uint64",
OnGObjectSignal3);
+ test.RaiseAll();
+ GLib.DynamicSignal.Disconnect(test, "bool-object-uint64",
OnGObjectSignal);
+ GLib.DynamicSignal.Disconnect(test, "bool-object-uint64",
OnGObjectSignal2);
+ GLib.DynamicSignal.Disconnect(test, "bool-object-uint64",
OnGObjectSignal3);
+ test.RaiseAll();
+ Console.WriteLine("----");
+
+ test.Dispose();
+ }
+
+ private static void OnGObjectSignal(object o, GLib.DynamicSignalArgs args)
+ {
+ Console.WriteLine("Sender: " + o);
+ Console.WriteLine("Args:");
+ foreach(object arg in args.Args) {
+ Console.WriteLine(" {0}, {1}", arg, arg.GetType());
+ }
+ Console.WriteLine("Call1");
+ }
+
+ private static void OnGObjectSignal2(object o, GLib.DynamicSignalArgs args)
+ {
+ Console.WriteLine("Call2");
+ }
+
+ private static void OnGObjectSignal3(object o, GLib.DynamicSignalArgs args)
+ {
+ Console.WriteLine("Call3");
+ }
+}
Added: branches/abock/dynamicsignals/dynamicsignal.c
===================================================================
--- branches/abock/dynamicsignals/dynamicsignal.c 2006-07-06 02:41:21 UTC
(rev 62290)
+++ branches/abock/dynamicsignals/dynamicsignal.c 2006-07-06 03:56:18 UTC
(rev 62291)
@@ -0,0 +1,178 @@
+//
+// dynamicsignal.c: new method of registering GObject signal
+// handlers that uses a default signal handler to read
+// callback argument stack and convert to an array of
+// GValues before running the "generic" signal handler
+//
+// Authors:
+// Aaron Bockover ([EMAIL PROTECTED])
+//
+// (C) 2006 Novell, Inc.
+//
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gobject/gvaluecollector.h>
+
+typedef void (* DynamicSignalHandler)(GObject *sender, guint argc,
+ GValue *argv, gpointer userdata);
+
+typedef struct {
+ GObject *object;
+ gpointer userdata;
+ DynamicSignalHandler callback;
+
+ guint id;
+
+ guint g_signal_id;
+ gulong handler_id;
+ GSignalQuery signal_details;
+} DynamicSignalEntry;
+
+static GList *dynamic_signal_table = NULL;
+static guint dynamic_signal_last_id = 1;
+
+static DynamicSignalEntry *
+find_entry(GObject *object, guint signal_id)
+{
+ GList *current = dynamic_signal_table;
+
+ while(current != NULL) {
+ DynamicSignalEntry *entry = (DynamicSignalEntry *)current->data;
+ if(entry->object == object && entry->g_signal_id == signal_id) {
+ return entry;
+ }
+
+ current = current->next;
+ }
+
+ return NULL;
+}
+
+static DynamicSignalEntry *
+find_entry_by_name(GObject *object, const gchar *signal_name, guint
*signal_id_out)
+{
+ guint signal_id;
+
+ signal_id = g_signal_lookup(signal_name, G_OBJECT_TYPE(object));
+ if(signal_id_out != NULL) {
+ *signal_id_out = signal_id;
+ }
+
+ if(signal_id <= 0) {
+ return NULL;
+ }
+
+ return find_entry(object, signal_id);
+}
+
+static void
+free_entry(DynamicSignalEntry *entry)
+{
+ memset(entry, 0, sizeof(DynamicSignalEntry));
+ g_free(entry);
+}
+
+static void
+dynamic_signal_handler(DynamicSignalEntry *entry, ...)
+{
+ va_list argp;
+ GValue *args = NULL;
+ guint i, n;
+
+ if(entry == NULL) {
+ return;
+ }
+
+ n = entry->signal_details.n_params;
+
+ if(n <= 0) {
+ entry->callback(entry->object, 0, NULL, entry->userdata);
+ return;
+ }
+
+ args = g_new0(GValue, n);
+ va_start(argp, entry);
+
+ for(i = 0; i < n; i++) {
+ GType type = entry->signal_details.param_types[i];
+ GValue *value = &args[i];
+ gchar *collect_error = NULL;
+
+ g_value_init(value, type);
+ G_VALUE_COLLECT(value, argp, 0, &collect_error);
+
+ if(collect_error != NULL) {
+ g_warning("Could not collect value: %s", collect_error);
+ g_free(collect_error);
+ break;
+ }
+ }
+
+ va_end(argp);
+ entry->callback(entry->object, n, args, entry->userdata);
+}
+
+DynamicSignalEntry *
+g_dynamic_signal_find_registration(GObject *object, const gchar *signal_name)
+{
+ return find_entry_by_name(object, signal_name, NULL);
+}
+
+guint
+g_dynamic_signal_connect(GObject *object, const gchar *signal_name,
+ DynamicSignalHandler callback, gboolean after, gpointer userdata)
+{
+ DynamicSignalEntry *entry;
+ guint signal_id;
+
+ entry = find_entry_by_name(object, signal_name, &signal_id);
+
+ if(entry != NULL) {
+ return entry->id;
+ }
+
+ entry = g_new0(DynamicSignalEntry, 1);
+ entry->id = dynamic_signal_last_id++;
+ entry->object = object;
+ entry->g_signal_id = signal_id;
+ entry->callback = callback;
+ entry->userdata = userdata;
+ g_signal_query(signal_id, &(entry->signal_details));
+
+ dynamic_signal_table = g_list_prepend(dynamic_signal_table, entry);
+
+ entry->handler_id = g_signal_connect_data(object, signal_name,
+ G_CALLBACK(dynamic_signal_handler), entry, NULL,
+ G_CONNECT_SWAPPED | (after ? G_CONNECT_AFTER : 0));
+
+ return entry->id;
+}
+
+void
+g_dynamic_signal_disconnect(GObject *object, const gchar *signal_name)
+{
+ DynamicSignalEntry *entry = find_entry_by_name(object, signal_name, NULL);
+
+ if(entry == NULL) {
+ return;
+ }
+
+ g_signal_handler_disconnect(object, entry->handler_id);
+
+ dynamic_signal_table = g_list_remove(dynamic_signal_table, entry);
+ free_entry(entry);
+
+ entry = NULL;
+}
+
+void
+g_dynamic_signal_update_entry_userdata(DynamicSignalEntry *entry, gpointer
userdata)
+{
+ if(entry != NULL) {
+ entry->userdata = userdata;
+ }
+}
Added: branches/abock/dynamicsignals/signal-test-marshal.list
===================================================================
--- branches/abock/dynamicsignals/signal-test-marshal.list 2006-07-06
02:41:21 UTC (rev 62290)
+++ branches/abock/dynamicsignals/signal-test-marshal.list 2006-07-06
03:56:18 UTC (rev 62291)
@@ -0,0 +1,2 @@
+VOID:STRING,INT64,POINTER,INT
+VOID:BOOL,OBJECT,UINT64
Added: branches/abock/dynamicsignals/signal-test.c
===================================================================
--- branches/abock/dynamicsignals/signal-test.c 2006-07-06 02:41:21 UTC (rev
62290)
+++ branches/abock/dynamicsignals/signal-test.c 2006-07-06 03:56:18 UTC (rev
62291)
@@ -0,0 +1,137 @@
+//
+// signal-test.c: simple GObject class that raises some test signals
+//
+// Authors:
+// Aaron Bockover ([EMAIL PROTECTED])
+//
+// (C) 2006 Novell, Inc.
+//
+
+#include <stdio.h>
+#include <string.h>
+
+#include "signal-test.h"
+#include "signal-test-marshal.h"
+
+static void signal_test_class_init(SignalTestClass *klass);
+static void signal_test_init(SignalTest *sp);
+static void signal_test_finalize(GObject *object);
+
+static void
+signal_test_string_int64_pointer_int(SignalTest *signal_test,
+ const gchar *a, gint64 b, gpointer c, gint d);
+
+static void
+signal_test_bool_object_uint64(SignalTest *signal_test,
+ gboolean a, GObject *b, guint64 c);
+
+struct SignalTestPrivate {
+};
+
+static GObjectClass *parent_class = NULL;
+static guint signal_test_signals[LAST_SIGNAL] = {0};
+
+GType
+signal_test_get_type()
+{
+ static GType type = 0;
+
+ if(type == 0) {
+ static const GTypeInfo our_info = {
+ sizeof (SignalTestClass),
+ NULL,
+ NULL,
+ (GClassInitFunc)signal_test_class_init,
+ NULL,
+ NULL,
+ sizeof (SignalTest),
+ 0,
+ (GInstanceInitFunc)signal_test_init,
+ };
+
+ type = g_type_register_static(G_TYPE_OBJECT,
+ "SignalTest", &our_info, 0);
+ }
+
+ return type;
+}
+
+static void
+signal_test_class_init(SignalTestClass *klass)
+{
+ GObjectClass *class = G_OBJECT_CLASS(klass);
+ parent_class = g_type_class_peek_parent(klass);
+
+ class->finalize = signal_test_finalize;
+
+ klass->string_int64_pointer_int = signal_test_string_int64_pointer_int;
+ klass->bool_object_uint64 = signal_test_bool_object_uint64;
+
+ signal_test_signals[STRING_INT64_POINTER_INT] =
+ g_signal_new("string-int64-pointer-int",
+ TYPE_SIGNAL_TEST,
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ G_STRUCT_OFFSET(SignalTestClass, string_int64_pointer_int),
+ NULL,
+ NULL,
+ g_cclosure_user_marshal_VOID__STRING_INT64_POINTER_INT,
+ G_TYPE_NONE,
+ 4, G_TYPE_STRING,
+ G_TYPE_INT64,
+ G_TYPE_POINTER,
+ G_TYPE_INT);
+
+ signal_test_signals[BOOL_OBJECT_UINT64] =
+ g_signal_new("bool-object-uint64",
+ TYPE_SIGNAL_TEST,
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ G_STRUCT_OFFSET(SignalTestClass, bool_object_uint64),
+ NULL,
+ NULL,
+ g_cclosure_user_marshal_VOID__BOOL_OBJECT_UINT64,
+ G_TYPE_NONE,
+ 3, G_TYPE_BOOLEAN,
+ G_TYPE_OBJECT,
+ G_TYPE_UINT64);
+}
+
+static void
+signal_test_init(SignalTest *signal_test)
+{
+ signal_test->priv = g_new0(SignalTestPrivate, 1);
+}
+
+static void
+signal_test_finalize(GObject *object)
+{
+ SignalTest *signal_test = SIGNAL_TEST(object);
+ g_free(signal_test->priv);
+ G_OBJECT_CLASS(parent_class)->finalize(object);
+}
+
+static void
+signal_test_string_int64_pointer_int(SignalTest *signal_test,
+ const gchar *a, gint64 b, gpointer c, gint d)
+{
+}
+
+static void
+signal_test_bool_object_uint64(SignalTest *signal_test,
+ gboolean a, GObject *b, guint64 c)
+{
+}
+
+SignalTest *
+signal_test_new()
+{
+ g_type_init();
+ return g_object_new(TYPE_SIGNAL_TEST, NULL);
+}
+
+void
+signal_test_raise_all(SignalTest *test)
+{
+ g_signal_emit_by_name(test, "string-int64-pointer-int", "Apples",
G_MAXINT64 - 1000, "Gong", -2228, NULL);
+ g_signal_emit_by_name(test, "bool-object-uint64", TRUE, test, G_MAXUINT64,
NULL);
+}
+
Added: branches/abock/dynamicsignals/signal-test.h
===================================================================
--- branches/abock/dynamicsignals/signal-test.h 2006-07-06 02:41:21 UTC (rev
62290)
+++ branches/abock/dynamicsignals/signal-test.h 2006-07-06 03:56:18 UTC (rev
62291)
@@ -0,0 +1,49 @@
+//
+// signal-test.h: simple GObject class that raises some test signals
+//
+// Authors:
+// Aaron Bockover ([EMAIL PROTECTED])
+//
+// (C) 2006 Novell, Inc.
+//
+
+#ifndef SIGNAL_TEST_H
+#define SIGNAL_TEST_H
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define TYPE_SIGNAL_TEST (signal_test_get_type ())
+#define SIGNAL_TEST(o) (G_TYPE_CHECK_INSTANCE_CAST ((o),
TYPE_SIGNAL_TEST, SignalTest))
+#define SIGNAL_TEST_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k),
TYPE_SIGNAL_TEST, SignalTestClass))
+#define IS_SIGNAL_TEST(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o),
TYPE_SIGNAL_TEST))
+#define IS_SIGNAL_TEST_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k),
TYPE_SIGNAL_TEST))
+#define SIGNAL_TEST_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
TYPE_SIGNAL_TEST, SignalTestClass))
+
+enum {
+ STRING_INT64_POINTER_INT,
+ BOOL_OBJECT_UINT64,
+ LAST_SIGNAL
+};
+
+typedef struct SignalTestPrivate SignalTestPrivate;
+
+typedef struct {
+ GObject parent;
+ SignalTestPrivate *priv;
+} SignalTest;
+
+typedef struct {
+ GObjectClass parent_class;
+ void (*string_int64_pointer_int)(SignalTest *signal_test, const gchar *a,
gint64 b, gpointer c, gint d);
+ void (*bool_object_uint64)(SignalTest *signal_test, gboolean a, GObject
*b, guint64 c);
+} SignalTestClass;
+
+
+GType signal_test_get_type();
+SignalTest *signal_test_new();
+void signal_test_raise_all(SignalTest *test);
+
+#endif /* SIGNAL_TEST_H */
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches