The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "GtkDefs.h"
#include "GtkXmHTMLDefs.h"

static void 
destroy_handler(gpointer data) {
        SvREFCNT_dec((AV*)data);
}

static void     callXS (void (*subaddr)(CV* cv), CV *cv, SV **mark)
{
        int items;
        dSP;
        PUSHMARK (mark);
        (*subaddr)(cv);

        PUTBACK;  /* Forget the return values */
}

#define sp (*_sp)
static int fixup_xmhtml(SV ** * _sp, int match, GtkObject * object, char * signame, int nparams, GtkArg * args, GtkType return_type)
{
	dTHR;
	if (match == 0 ) {
		XPUSHs(sv_2mortal(newSVpv(GTK_VALUE_POINTER(args[0]), 0)));
		XPUSHs(sv_2mortal(newSVXmAnyCallbackStruct((XmAnyCallbackStruct*)GTK_VALUE_POINTER(args[1]))));
	} else
		XPUSHs(sv_2mortal(newSVXmAnyCallbackStruct((XmAnyCallbackStruct*)GTK_VALUE_POINTER(args[0]))));
	return 1;
}
#undef sp

static XmImageInfo *
my_load_image(GtkWidget *self, gchar *ref) {
	AV * args;
	SV * handler, *result, *name;
	int i;
	XmImageInfo *info = NULL;
	STRLEN len;
	dSP;
	
	/* FIXME: add a destroy handler for args */
	args = gtk_object_get_data(GTK_OBJECT(self), "_perl_im_cb");
	handler = * av_fetch(args, 0, 0);
	
	ENTER;
	SAVETMPS;
	PUSHMARK(SP);
	XPUSHs(sv_2mortal(newSVGtkObjectRef(GTK_OBJECT(self), 0)));
	XPUSHs(sv_2mortal(newSVpv(ref, 0)));
	for (i=1;i<=av_len(args);i++)
		XPUSHs(sv_2mortal(newSVsv(*av_fetch(args, i, 0))));

	PUTBACK;
	i = perl_call_sv(handler, G_ARRAY);
	if (i!=2)
		croak("handler failed");

	SPAGAIN;
	result = POPs;
	name = POPs;

	if (SvOK(result) && SvPV(result, len) != NULL) {
		/*printf("Got data: len = %d\n", len);*/
		info = XmHTMLImageDefaultProc(self, SvPV(name, PL_na), SvPV(result, PL_na), len);
	} else {
		/*printf("Got file: %s\n", SvPV(result, len));*/
		info = XmHTMLImageDefaultProc(self, SvPV(name, len), NULL, 0);
	}

	PUTBACK;
	FREETMPS;
	LEAVE;
	
	return info;
}


MODULE = Gtk::XmHTML	PACKAGE = Gtk::XmHTML	PREFIX = gtk_xmhtml_

#ifdef GTK_XMHTML

void
init(Class)
	CODE:
	{
		static int did_it = 0;
		static char * names[] = {
				"anchor-visited",
				"activate",
				"arm",
				"anchor-track",
				"frame",
				"form",
				"input",
				"link",
				"motion",
				"imagemap",
				"document",
				"_focus",
				"losing-focus",
				"motion-track",
				"html-event",
				0};
		if (did_it)
			return;
		did_it = 1;
		GtkXmHTML_InstallTypedefs();
		GtkXmHTML_InstallObjects();
		AddSignalHelperParts(gtk_xmhtml_get_type(), names, fixup_xmhtml, 0);
	}

Gtk::XmHTML_Sink
new(Class)
	SV * Class
	CODE:
	RETVAL = (GtkXmHTML*)(gtk_xmhtml_new());
	OUTPUT:
	RETVAL

void
gtk_xmhtml_freeze(self)
	Gtk::XmHTML self

void
gtk_xmhtml_thaw(self)
	Gtk::XmHTML self


void
gtk_xmhtml_source(self, source)
	Gtk::XmHTML self
	char* source

void
gtk_xmhtml_set_string_direction(self, direction)
	Gtk::XmHTML self
	int direction

void
gtk_xmhtml_set_alignment(self, alignment)
	Gtk::XmHTML self
	int alignment

#if 0

void
gtk_xmhtml_outline(self, flag)
	Gtk::XmHTML self
	int flag

#endif

void
gtk_xmhtml_set_font_familty(self, familty, sizes)
	Gtk::XmHTML self
	char* familty
	char* sizes

void
gtk_xmhtml_set_font_familty_fixed(self, familty, sizes)
	Gtk::XmHTML self
	char* familty
	char* sizes

void
gtk_xmhtml_set_font_charset(self, charset)
	Gtk::XmHTML self
	char* charset

void
gtk_xmhtml_set_allow_body_colors(self, enable)
	Gtk::XmHTML self
	int enable

void
gtk_xmhtml_set_hilight_on_enter(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_anchor_underline_type(self, underline_type)
	Gtk::XmHTML self
	int underline_type

void
gtk_xmhtml_set_anchor_visited_underline_type(self, underline_type)
	Gtk::XmHTML self
	int underline_type

void
gtk_xmhtml_set_anchor_target_underline_type(self, underline_type)
	Gtk::XmHTML self
	int underline_type

void
gtk_xmhtml_set_allow_color_switching(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_allow_font_switching(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_max_image_colors(self, max_colors)
	Gtk::XmHTML self
	int max_colors

void
gtk_xmhtml_set_allow_images(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_plc_intervals(self, min_delay, max_delay, def_delay)
	Gtk::XmHTML self
	int min_delay
	int max_delay
	int def_delay

void
gtk_xmhtml_set_def_body_image_url(self, url)
	Gtk::XmHTML self
	char* url

void
gtk_xmhtml_set_anchor_buttons(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_anchor_cursor(self, cursor, flag)
	Gtk::XmHTML self
	Gtk::Gdk::Cursor cursor
	int flag

void
gtk_xmhtml_set_topline(self, topline)
	Gtk::XmHTML self
	int topline

void
gtk_xmhtml_set_freeze_animations(self, flag)
	Gtk::XmHTML self
	int flag

#if 0

gstring
gtk_xmhtml_get_source(self)
	Gtk::XmHTML self

#endif

void
gtk_xmhtml_set_screen_gamma(self, gamma)
	Gtk::XmHTML self
	double gamma

void
gtk_xmhtml_set_perfect_colors(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_uncompress_command(self, cmd)
	Gtk::XmHTML self
	char* cmd

void
gtk_xmhtml_set_strict_checking(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_bad_html_warnings(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_allow_form_coloring(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_imagemap_draw(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_mime_type(self, mime_type)
	Gtk::XmHTML self
	char* mime_type

void
gtk_xmhtml_set_alpha_processing(self, flag)
	Gtk::XmHTML self
	int flag

void
gtk_xmhtml_set_rgb_conv_mode(self, val)
	Gtk::XmHTML self
	int val

void
gtk_xmhtml_set_image_procs (self, handler, ...)
	Gtk::XmHTML self
	SV *	handler
	CODE:
	{
		AV * args = newAV();
		PackCallbackST(args, 1);

		gtk_xmhtml_set_image_procs(self, my_load_image, NULL, NULL, NULL);
		gtk_object_set_data_full(GTK_OBJECT(self), "_perl_im_cb", args, destroy_handler);
	}


#endif

INCLUDE: ../build/boxed.xsh

INCLUDE: ../build/objects.xsh

INCLUDE: ../build/extension.xsh