The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
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::MenuFactory	T_MISCPTROBJ
Gtk::SelectionData      T_MISCPTROBJ

upGtk::Widget		T_GtkUPPTROBJ

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

gfloat				T_FLOAT

bool				T_BOOL

INPUT

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

T_GtkPTROBJ
	if (SvTRUE($arg)) {
		$var = Cast$type(SvGtkObjectRef($arg, \"${ntype}\"));
	} else
		croak(\"$var is not of type ${ntype}\")

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

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

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

T_GtkUPPTRREF
	$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_GtkPTROBJOrNULL
    if ($var) {
		sv_setsv($arg, newSVGtkObjectRef(GTK_OBJECT($var), \"@{[map(s/OrNULL//,$ntype)]}\"));
		SvREFCNT_dec(SvRV($arg));
	} else
		sv_setsv($arg, newSVsv(&sv_undef));

T_GtkUPPTROBJ
	sv_setsv($arg, newSVGtkObjectRef(GTK_OBJECT($var), 0));
	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)));