TYPEMAP

# These are synonyms for Gtk::Gdk::Pixmap (which itself is a renamed Gtk::Gdk::Window)
Gtk::Gdk::Window	T_SimpleVal
Gtk::Gdk::Bitmap	T_SimpleVal

Gtk::Gdk::Cursor	T_MISCPTROBJ
Gtk::Gdk::GC		T_MISCPTROBJ
Gtk::Gdk::Image		T_SimpleVal
Gtk::Gdk::GCValues	T_MISCPTROBJ
Gtk::Gdk::Atom		T_SimpleVal

Gtk::Requisition	T_SimpleVal

Gtk::MenuFactory	T_MISCPTROBJ
Gtk::SelectionData      T_MISCPTROBJ

Gtk::Widget_Up		T_GtkPTROBJUp
Gtk::Widget_Sink_Up		T_GtkPTROBJSinkUp
Gtk::Widget_OrNULL_Up		T_GtkPTROBJOrNULLUp

Gtk::Object_Up		T_GtkPTROBJUp
Gtk::Object_Sink_Up		T_GtkPTROBJSinkUp
Gtk::Object_OrNULL_Up		T_GtkPTROBJOrNULLUp

Gtk::Gdk::Event		T_SimpleVal
Gtk::Gdk::Region	T_SimpleVal
Gtk::Gdk::Rectangle	T_SimplePtr
Gtk::Gdk::Color		T_SimpleVal

gfloat				T_FLOAT
gboolean			T_BOOL
guint				T_IV
gint				T_IV
glong				T_IV
gulong				T_IV

bool				T_BOOL

INPUT

T_BOOL
	$var = (int)SvIV($arg)

T_GtkPTROBJ
	do {
		void * _o = SvGtkObjectRef($arg, \"${ntype}\");
		if (!_o) 
			croak(\"$var is not of type ${ntype}\");
		else
			$var = Cast$type(_o);
	} while(0)

T_GtkPTROBJOrNULL
	$var = SvTRUE($arg) ? Cast$type(SvGtkObjectRef($arg, \"" . ($foo=$ntype,$foo=~s/_OrNULL//,$foo). "\")) : 0

T_GtkPTROBJUp
	$var = Cast$type(SvGtkObjectRef($arg, \"${ntype}\"))

T_GtkPTROBJSink
	$var = Cast$type(SvGtkObjectRef($arg, \"${ntype}\"))

T_GtkPTROBJSinkUp
	$var = Cast$type(SvGtkObjectRef($arg, \"${ntype}\"))

T_GtkPTRREF
	$var = Cast$type(SvGtkObjectRef($arg, 0))

T_GtkPTRREF_Up
	$var = Cast$type(SvGtkObjectRef($arg, 0))

T_MISCPTROBJ
	$var = ($type)SvMiscRef($arg, \"${ntype}\")

T_MISCPTRREF
	$var = ($type)SvMiscRef($arg, 0);

T_REFPTROBJ
	$var = ($type)SvMiscRef($arg, \"${ntype}\")

T_REFPTRREF
	$var = ($type)SvMiscRef($arg, 0);

T_SimpleVal
	$var = Sv" . ($foo=$ntype, $foo=~s/://g, $foo=~s/^GtkGdk/Gdk/, $foo) . "($arg)

T_SimplePtr
	$var = Sv" . ($foo=$ntype, $foo=~s/://g, $foo=~s/^GtkGdk/Gdk/, $foo) . "($arg,0)

OUTPUT

T_BOOL
	$arg = boolSV($var);

T_GtkPTROBJ
    if (!$var) {
    	croak("failed to return mandatory object of type $ntype");
    }
	sv_setsv($arg, newSVGtkObjectRef(GTK_OBJECT($var), \"${ntype}\"));
	SvREFCNT_dec(SvRV($arg));

T_GtkPTROBJSink
    if (!$var) {
    	croak("failed to return mandatory object of type @{[grep {s/_Sink//,1} $ntype]}");
    }
	sv_setsv($arg, newSVGtkObjectRef(GTK_OBJECT($var), \"@{[grep {s/_Sink//,1} $ntype]}\"));
	gtk_object_sink(GTK_OBJECT($var));
	SvREFCNT_dec(SvRV($arg));

T_GtkPTROBJOrNULL
    if ($var) {
		sv_setsv($arg, newSVGtkObjectRef(GTK_OBJECT($var), \"@{[grep {s/_OrNULL//,1} $ntype]}\"));
		SvREFCNT_dec(SvRV($arg));
	} else
		sv_setsv($arg, newSVsv(&sv_undef));

T_GtkPTROBJUp
	sv_setsv($arg, newSVGtkObjectRef(GTK_OBJECT($var), 0));
	SvREFCNT_dec(SvRV($arg));

T_GtkPTROBJOrNULLUp
	if ($var) {
		sv_setsv($arg, newSVGtkObjectRef(GTK_OBJECT($var), 0));
		SvREFCNT_dec(SvRV($arg));
	} else
		sv_setsv($arg, newSVsv(&sv_undef));

T_GtkPTROBJSinkUp
	sv_setsv($arg, newSVGtkObjectRef(GTK_OBJECT($var), 0));
	gtk_object_sink(GTK_OBJECT($var));
	SvREFCNT_dec(SvRV($arg));

T_MISCPTROBJ
	sv_setsv($arg, newSVMiscRef((void*)$var, \"${ntype}\", 0));
	SvREFCNT_dec(SvRV($arg));

T_REFPTROBJ
	{
		int n;
		sv_setsv($arg,newSVMiscRef((void*)$var, \"${ntype}\", &n));
		SvREFCNT_dec(SvRV($arg));
		if (n)
			@{[grep {s/://g, s/^GtkGdk/Gdk/, s/([a-z])([A-Z]+)/$1_$2/g, tr/A-Z/a-z/, 1} $ntype]}_ref($var);
	}

T_SimpleVal
	sv_setsv($arg,sv_2mortal(newSV@{[grep {s/://g,s/^GtkGdk/Gdk/,1} $ntype]}($var)));

T_SimplePtr
	sv_setsv($arg,sv_2mortal(newSV@{[grep {s/://g,s/^GtkGdk/Gdk/,1} $ntype]}($var)));
