diff --git a/ChangeLog b/ChangeLog index 8463c1c36..3dec16beb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2002-08-17 Duncan Mak + + * glue/canvas-proxy.c: + * glue/canvas-proxy.h: New files. Glue for subclassing CanvasItem + from C#. + + * glue/canvas-proxy-marshal.c: + * glue/canvas-proxy-marshal.h: + * glue/canvas-proxy-marshal.list: Added to handle marshaling + signals used by CanvasProxy. + 2002-08-15 Mike Kestner * sample/Makefile.in : add some art-sharp refs diff --git a/glue/Makefile.am b/glue/Makefile.am index 61cb5740c..1c0ca62fa 100644 --- a/glue/Makefile.am +++ b/glue/Makefile.am @@ -12,7 +12,9 @@ BASESOURCES = \ paned.c \ style.c \ type.c \ - widget.c + widget.c \ + canvas-proxy.c \ + canvas-proxy.h GNOMESOURCES = \ canvasitem.c \ diff --git a/glue/canvas-proxy-marshal.c b/glue/canvas-proxy-marshal.c new file mode 100644 index 000000000..5ae2ca300 --- /dev/null +++ b/glue/canvas-proxy-marshal.c @@ -0,0 +1,225 @@ + +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_int +#define g_marshal_value_peek_flags(v) (v)->data[0].v_uint +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:OBJECT,DOUBLE,POINTER,INT (canvas-proxy-marshal.list:1) */ +void +g_cclosure_user_marshal_VOID__OBJECT_DOUBLE_POINTER_INT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__OBJECT_DOUBLE_POINTER_INT) (gpointer data1, + gpointer arg_1, + gdouble arg_2, + gpointer arg_3, + gint arg_4, + gpointer data2); + register GMarshalFunc_VOID__OBJECT_DOUBLE_POINTER_INT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__OBJECT_DOUBLE_POINTER_INT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_object (param_values + 1), + g_marshal_value_peek_double (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + g_marshal_value_peek_int (param_values + 4), + data2); +} + +/* DOUBLE:OBJECT,DOUBLE,DOUBLE,INT,INT,POINTER (canvas-proxy-marshal.list:2) */ +void +g_cclosure_user_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_INT_INT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gdouble (*GMarshalFunc_DOUBLE__OBJECT_DOUBLE_DOUBLE_INT_INT_POINTER) (gpointer data1, + gpointer arg_1, + gdouble arg_2, + gdouble arg_3, + gint arg_4, + gint arg_5, + gpointer arg_6, + gpointer data2); + register GMarshalFunc_DOUBLE__OBJECT_DOUBLE_DOUBLE_INT_INT_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gdouble v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 7); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_DOUBLE__OBJECT_DOUBLE_DOUBLE_INT_INT_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_object (param_values + 1), + g_marshal_value_peek_double (param_values + 2), + g_marshal_value_peek_double (param_values + 3), + g_marshal_value_peek_int (param_values + 4), + g_marshal_value_peek_int (param_values + 5), + g_marshal_value_peek_pointer (param_values + 6), + data2); + + g_value_set_double (return_value, v_return); +} + +/* VOID:OBJECT,POINTER,POINTER,POINTER,POINTER (canvas-proxy-marshal.list:3) */ +void +g_cclosure_user_marshal_VOID__OBJECT_POINTER_POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__OBJECT_POINTER_POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer arg_5, + gpointer data2); + register GMarshalFunc_VOID__OBJECT_POINTER_POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 6); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__OBJECT_POINTER_POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_object (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + g_marshal_value_peek_pointer (param_values + 4), + g_marshal_value_peek_pointer (param_values + 5), + data2); +} + +/* VOID:OBJECT,INT,INT,INT,INT (canvas-proxy-marshal.list:4) */ +void +g_cclosure_user_marshal_VOID__OBJECT_INT_INT_INT_INT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__OBJECT_INT_INT_INT_INT) (gpointer data1, + gpointer arg_1, + gint arg_2, + gint arg_3, + gint arg_4, + gint arg_5, + gpointer data2); + register GMarshalFunc_VOID__OBJECT_INT_INT_INT_INT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 6); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__OBJECT_INT_INT_INT_INT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_object (param_values + 1), + g_marshal_value_peek_int (param_values + 2), + g_marshal_value_peek_int (param_values + 3), + g_marshal_value_peek_int (param_values + 4), + g_marshal_value_peek_int (param_values + 5), + data2); +} + diff --git a/glue/canvas-proxy-marshal.h b/glue/canvas-proxy-marshal.h new file mode 100644 index 000000000..94f055828 --- /dev/null +++ b/glue/canvas-proxy-marshal.h @@ -0,0 +1,44 @@ + +#ifndef __g_cclosure_user_marshal_MARSHAL_H__ +#define __g_cclosure_user_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:OBJECT,DOUBLE,POINTER,INT (canvas-proxy-marshal.list:1) */ +extern void g_cclosure_user_marshal_VOID__OBJECT_DOUBLE_POINTER_INT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* DOUBLE:OBJECT,DOUBLE,DOUBLE,INT,INT,POINTER (canvas-proxy-marshal.list:2) */ +extern void g_cclosure_user_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_INT_INT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:OBJECT,POINTER,POINTER,POINTER,POINTER (canvas-proxy-marshal.list:3) */ +extern void g_cclosure_user_marshal_VOID__OBJECT_POINTER_POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:OBJECT,INT,INT,INT,INT (canvas-proxy-marshal.list:4) */ +extern void g_cclosure_user_marshal_VOID__OBJECT_INT_INT_INT_INT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __g_cclosure_user_marshal_MARSHAL_H__ */ + diff --git a/glue/canvas-proxy-marshal.list b/glue/canvas-proxy-marshal.list new file mode 100644 index 000000000..070e17e5e --- /dev/null +++ b/glue/canvas-proxy-marshal.list @@ -0,0 +1,4 @@ +VOID:OBJECT,DOUBLE,POINTER,INT +DOUBLE:OBJECT,DOUBLE,DOUBLE,INT,INT,POINTER +VOID:OBJECT,POINTER,POINTER,POINTER,POINTER +VOID:OBJECT,INT,INT,INT,INT diff --git a/glue/canvas-proxy.c b/glue/canvas-proxy.c new file mode 100644 index 000000000..78ee39889 --- /dev/null +++ b/glue/canvas-proxy.c @@ -0,0 +1,133 @@ +/* + * canvasproxy.c - glue functions for creating C# CanvasItems + * + * Author: Duncan Mak (duncan@ximian.com) + * + * Copyright (C), 2002. Ximian, Inc. + * + */ + +#include + +#include "canvas-proxy.h" +#include "canvas-proxy-marshal.h" + +enum { + UPDATE, + REALIZE, + UNREALIZE, + MAP, + UNMAP, + COVERAGE, + DRAW, + RENDER, + POINT, + BOUNDS, + LAST_SIGNAL, +}; + +static GnomeCanvasItemClass *parent_class; + +static guint proxy_signals [LAST_SIGNAL]; + +/* Class initialization */ +static void +gtksharp_canvas_proxy_class_init (CanvasProxyClass *class) +{ + GObjectClass *gobject_class; + GtkObjectClass *object_class; + GnomeCanvasItemClass *item_class; + + gobject_class = (GObjectClass *) class; + object_class = (GtkObjectClass *) class; + item_class = (GnomeCanvasItemClass *) class; + + parent_class = g_type_class_peek_parent (class); + + /* void (* update) (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags); */ + proxy_signals [UPDATE] = g_signal_new ("update", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GnomeCanvasItemClass, update), + NULL, NULL, + g_cclosure_user_marshal_VOID__OBJECT_DOUBLE_POINTER_INT, + G_TYPE_NONE, 3, G_TYPE_DOUBLE, + G_TYPE_POINTER, G_TYPE_INT); + + /* void (* realize) (GnomeCanvasItem *item); */ + proxy_signals [REALIZE] = g_signal_new ("realize", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GnomeCanvasItemClass, realize), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 0); + + /* void (* unrealize) (GnomeCanvasItem *item); */ + proxy_signals [UNREALIZE] = g_signal_new ("unrealize", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GnomeCanvasItemClass, unrealize), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 0); + + /* void (* map) (GnomeCanvasItem *item); */ + proxy_signals [MAP] = g_signal_new ("map", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GnomeCanvasItemClass, map), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 0); + + /* void (* unmap) (GnomeCanvasItem *item); */ + proxy_signals [UNMAP] = g_signal_new ("unmap", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GnomeCanvasItemClass, unmap), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 0); + + /* void (* draw) (GnomeCanvasItem *item, GdkDrawable *drawable, */ + /* int x, int y, int width, int height); */ + proxy_signals [DRAW] = g_signal_new ("draw", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GnomeCanvasItemClass, draw), + NULL, NULL, + g_cclosure_user_marshal_VOID__OBJECT_INT_INT_INT_INT, + G_TYPE_NONE, 5, GDK_TYPE_DRAWABLE, + G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); + + /* void (* render) (GnomeCanvasItem *item, GnomeCanvasBuf *buf); */ + proxy_signals [RENDER] = g_signal_new ("render", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GnomeCanvasItemClass, render), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); + + /* double (* point) (GnomeCanvasItem *item, double x, double y, int cx, int cy, */ + /* GnomeCanvasItem **actual_item); */ + proxy_signals [POINT] = g_signal_new ("point", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GnomeCanvasItemClass, point), + NULL, NULL, + g_cclosure_user_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_INT_INT_POINTER, + G_TYPE_DOUBLE, 5, G_TYPE_DOUBLE, G_TYPE_DOUBLE, + G_TYPE_INT, G_TYPE_INT, G_TYPE_POINTER); + + /* void (* bounds) (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2); */ + proxy_signals [BOUNDS] = g_signal_new ("bounds", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GnomeCanvasItemClass, bounds), + NULL, NULL, + g_cclosure_user_marshal_VOID__OBJECT_POINTER_POINTER_POINTER_POINTER, + G_TYPE_NONE, 4, G_TYPE_POINTER, G_TYPE_POINTER, + G_TYPE_POINTER, G_TYPE_POINTER); +} diff --git a/glue/canvas-proxy.h b/glue/canvas-proxy.h new file mode 100644 index 000000000..d7c486d2c --- /dev/null +++ b/glue/canvas-proxy.h @@ -0,0 +1,30 @@ +/* + * canvasproxy.h + * + * Author: Duncan Mak (duncan@ximian.com) + * + * Copyright (C), 2002. Ximian, Inc. + * + */ + +#ifndef CANVAS_PROXY_H +#define CANVAS_PROXY_H + +#include + +G_BEGIN_DECLS + +typedef struct _CanvasProxy CanvasProxy; +typedef struct _CanvasProxyClass CanvasProxyClass; + +struct _CanvasProxy { + GnomeCanvasItem item; +}; + +struct _CanvasProxyClass { + GnomeCanvasItemClass parent; +}; + +G_END_DECLS + +#endif