#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "GtkDefs.h" #include "GnomeDefs.h" static int GnomeCanvasItem_SetArg(GtkArg * a, SV * v, SV * Class, GtkObject * Object) { int result = 1; if (a->type == GTK_TYPE_GNOME_CANVAS_POINTS) { AV * av; int i; GnomeCanvasPoints * p; if (!SvOK(v) || !SvROK(v) || (SvTYPE(SvRV(v)) != SVt_PVAV) ) croak("points should be an array reference of coords"); av = (AV*)SvRV(v); p = gnome_canvas_points_new((av_len(av)+1)/2); for (i=0; i<=av_len(av); i++) p->coords[i] = SvNV(*av_fetch(av, i, 0)); GTK_VALUE_POINTER(*a) = p; } else if (a->type == GTK_TYPE_GDK_IMLIB_IMAGE) { GTK_VALUE_POINTER(*a) = SvGdkImlibImage(v); } else result = 0; return result; } static int GnomeCanvasItem_FreeArg(GtkArg * a) { if (a->type == GTK_TYPE_GNOME_CANVAS_POINTS) { gnome_canvas_points_free((GnomeCanvasPoints*)GTK_VALUE_POINTER(*a)); return 1; } else if (a->type == GTK_TYPE_GDK_IMLIB_IMAGE) return 1; return 0; } static SV * GnomeCanvasItem_GetArg (GtkArg * a) { if (a->type == GTK_TYPE_GNOME_CANVAS_POINTS) { AV * av = newAV(); SV *r = newRV((SV*)av); int i; GnomeCanvasPoints * points = (GnomeCanvasPoints*)GTK_VALUE_POINTER(*a); SvREFCNT_dec(av); for(i=0; i < points->num_points*2; ++i) av_push(av, newSVnv(points->coords[i])); return r; } else if (a->type == GTK_TYPE_GDK_IMLIB_IMAGE) return newSVGdkImlibImage(GTK_VALUE_POINTER(*a)); return NULL; } static struct PerlGtkTypeHelper type_help = { GnomeCanvasItem_GetArg, GnomeCanvasItem_SetArg, 0/*GnomeCanvasItem_SetRetArg*/, 0/*GnomeCanvasItem_GetRetArg*/, GnomeCanvasItem_FreeArg, 0 }; MODULE = Gnome::CanvasItem PACKAGE = Gnome::CanvasItem PREFIX = gnome_canvas_item_ #ifdef GNOME_CANVAS Gnome::CanvasItem_Sink_Up gnome_canvas_item_new(Class, parent, type, ...) Gnome::CanvasGroup parent SV* type CODE: { GtkArg *argv; int p, argc, i; GtkType realtype; SV * fixtypename = type; argc = items -3; if ( argc % 2 ) croak("too few arguments"); realtype = gtnumber_for_ptname(SvPV(type,PL_na)); if(!realtype) { fixtypename = newSVpv("Gnome::Canvas", 0); sv_catsv(fixtypename, type); realtype = gtnumber_for_ptname(SvPV(fixtypename,PL_na)); } if(!realtype) { croak("Invalid canvas item type '%s'", SvPV(type, PL_na)); } RETVAL = gnome_canvas_item_new(parent, realtype, 0); /*i, argv);*/ argv = malloc(sizeof(GtkArg)*argc); i=0; for(p=3; p %s\n", SvPV(ST(p), PL_na), SvPV(ST(p+1),PL_na)); */ FindArgumentTypeWithObject(GTK_OBJECT(RETVAL), ST(p), &argv[i]); GtkSetArg(&argv[i], ST(p+1), fixtypename, GTK_OBJECT(RETVAL)); p += 2; } gnome_canvas_item_setv(RETVAL, i, argv); for (p=0; p %s\n", SvPV(ST(p), PL_na), SvPV(ST(p+1),PL_na)); */ FindArgumentTypeWithObject(obj, ST(p), &argv[i]); GtkSetArg(&argv[i], ST(p+1), ST(0), obj); p += 2; } gnome_canvas_item_setv(self, i, argv); for(p=0;p