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

Reply via email to