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 "GtkHTMLDefs.h"

#ifdef GTKHTML_HAVE_GCONF
#include <gconf/gconf.h>
#endif

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_html(SV ** * _sp, int match, GtkObject * object, char * signame, int nparams, GtkArg * args, GtkType return_type)
{
	dTHR;
	XPUSHs(sv_2mortal(newSVpv(GTK_VALUE_POINTER(args[0]), 0)));
	XPUSHs(sv_2mortal(newSViv((long)GTK_VALUE_POINTER(args[1]))));
	return 1;
}
#undef sp

static bool
html_save (const HTMLEngine *engine, const char *data, guint len, gpointer user_data) {
	AV *stuff;
	SV *handler;
	int i, result;
	dSP;

	stuff = (AV*) user_data;
	handler = *av_fetch(stuff, 0, 0);

	ENTER;
	SAVETMPS;

	PUSHMARK(SP);

	XPUSHs(sv_2mortal(newSVpvn(data, len)));

	for(i=1; i <= av_len(stuff); ++i)
		XPUSHs(sv_2mortal(newSVsv(*av_fetch(stuff, i, 0))));
	
	PUTBACK;
	i = perl_call_sv(handler, G_SCALAR);
	
	SPAGAIN;

	if (i != 1)
		croak("handler failed");
	
	result = POPi;

	PUTBACK;
	FREETMPS;
	LEAVE;
	return result;
}

MODULE = Gtk::HTML	PACKAGE = Gtk::HTML	PREFIX = gtk_html_

#ifdef GTK_HTML

void
init(Class)
	CODE:
	{
		static int did_it = 0;
		static char * names[] = { "url_requested", 0 };
		if (did_it)
			return;
		did_it = 1;
		GtkHTML_InstallTypedefs();
		GtkHTML_InstallObjects();
		AddSignalHelperParts(gtk_html_get_type(), names, fixup_html, 0);
#ifdef GTKHTML_HAVE_GCONF
		/* gtkhtml is _so_ broken */
		if (!gconf_is_initialized()) {
			int argc;
			char ** argv = 0;
			AV * ARGV = perl_get_av("ARGV", FALSE);
			SV * ARGV0 = perl_get_sv("0", FALSE);
			int i;

			argc = av_len(ARGV)+2;
			if (argc) {
				argv = malloc(sizeof(char*)*argc);
				argv[0] = g_strdup(SvPV(ARGV0, PL_na));
				for(i=0;i<=av_len(ARGV);i++)
					argv[i+1] = g_strdup(SvPV(*av_fetch(ARGV, i, 0), PL_na));
			}
			gconf_init (argc, argv, NULL);
			if (argv) {
				for (i=0; i < argc; ++i)
					g_free(argv[i]);
				free(argv);
			}
		}
#endif
	}

Gtk::HTML_Sink
gtk_html_new (Class)
	SV *	Class
	CODE:
	RETVAL = (GtkHTML*)(gtk_html_new());
	OUTPUT:
	RETVAL

#if GTKHTML_HVER >= 0x001000

Gtk::HTML_Sink
gtk_html_new_from_string (Class, html_data)
	SV *	Class
	SV *	html_data
	CODE:
	{
		STRLEN len;
		char *d = SvPV (html_data, len);
		RETVAL = (GtkHTML*)(gtk_html_new_from_string(d, len));
	}
	OUTPUT:
	RETVAL

gulong
gtk_html_begin_content (html, content_type)
	Gtk::HTML	html
	char *		content_type

#endif

gulong
gtk_html_begin (html)
	Gtk::HTML	html

void
gtk_html_write (html, handle, chunk)
	Gtk::HTML	html
	guint	handle
	SV *	chunk
	CODE:
	{
		STRLEN blen;
		char *buf = SvPV(chunk, blen);
		gtk_html_write(html, handle, buf, blen);
	}

void
gtk_html_end (html, handle, status)
	Gtk::HTML	html
	guint	handle
	Gtk::HTMLStreamStatus	status

void
gtk_html_load_empty (html)
	Gtk::HTML	html

void
gtk_html_load_from_string (html, data)
	Gtk::HTML	html
	SV *		data
	CODE:
	{
		STRLEN blen;
		char *buf = SvPV(data, blen);
		gtk_html_load_from_string (html, buf, blen);
	}

void
gtk_html_set_editable (html, editable)
	Gtk::HTML	html
	bool	editable

bool
gtk_html_get_editable (html)
	Gtk::HTML	html

void
gtk_html_allow_selection (html, allow)
	Gtk::HTML	html
	bool	allow

#if GTKHTML_HVER < 0x000a00
	
int
gtk_html_request_paste (html, type, time)
	Gtk::HTML	html
	int	type
	int	time

#else

int
gtk_html_request_paste (html, selection, type, time)
	Gtk::HTML	html
	Gtk::Gdk::Atom	selection
	int	type
	int	time

#endif

#if GTKHTML_HVER >= 0x001000

void
gtk_html_select_word (html)
	Gtk::HTML	html

void
gtk_html_select_line (html)
	Gtk::HTML	html

void
gtk_html_select_paragraph (html)
	Gtk::HTML	html

void
gtk_html_select_paragraph_extended (html)
	Gtk::HTML	html

void
gtk_html_select_all (html)
	Gtk::HTML	html

void
gtk_html_modify_indent_by_delta (html, delta)
	Gtk::HTML	html
	int	delta

Gtk::HTMLParagraphStyle
gtk_html_get_paragraph_style (html)
	Gtk::HTML	html

void
gtk_html_set_color (html, color)
	Gtk::HTML	html
	Gtk::Gdk::Color	color
	CODE:
	{
		HTMLColor *c = html_color_new_from_gdk_color (color);
		gtk_html_set_color (html, c);
		html_color_unref (color);
	}

void
gtk_html_insert_html (html, html_src)
	Gtk::HTML	html
	char *	html_src

void
gtk_html_append_html (html, html_src)
	Gtk::HTML	html
	char *	html_src

void
gtk_html_set_default_content_type (html, content_type)
	Gtk::HTML	html
	char *	content_type

bool
gtk_html_command (html, command_name)
	Gtk::HTML	html
	char *	command_name

bool
gtk_html_edit_make_cursor_visible (html)
	Gtk::HTML	html

bool
gtk_html_build_with_gconf (Class)
	SV *	Class
	CODE:
	RETVAL = gtk_html_build_with_gconf ();
	OUTPUT:
	RETVAL

void
gtk_html_set_magnification (html, magnification)
	Gtk::HTML	html
	gdouble	magnification

void
gtk_html_zoom_in (html)
	Gtk::HTML	html

void
gtk_html_zoom_out (html)
	Gtk::HTML	html

void
gtk_html_zoom_reset (html)
	Gtk::HTML	html

void
gtk_html_update_styles (html)
	Gtk::HTML	html

void
gtk_html_set_allow_frameset (html, allow)
	Gtk::HTML	html
	bool	allow

bool
gtk_html_get_allow_frameset (html)
	Gtk::HTML	html

void
gtk_html_set_base (html, url)
	Gtk::HTML	html
	char *	url

char*
gtk_html_get_base (html)
	Gtk::HTML	html

void
gtk_html_set_indent (html, delta)
	Gtk::HTML	html
	int	delta

#else

void
gtk_html_indent (html, delta)
	Gtk::HTML	html
	int	delta

#endif

void
gtk_html_set_paragraph_style (html, style)
	Gtk::HTML	html
	Gtk::HTMLParagraphStyle	style

void
gtk_html_set_font_style (html, and_mask, or_mask)
	Gtk::HTML	html
	Gtk::HTMLFontStyle	and_mask
	Gtk::HTMLFontStyle	or_mask

void
gtk_html_set_paragraph_alignment (html, alignment)
	Gtk::HTML	html
	Gtk::HTMLParagraphAlignment	alignment

Gtk::HTMLParagraphAlignment
gtk_html_get_paragraph_alignment (html)
	Gtk::HTML	html

void
gtk_html_cut (html)
	Gtk::HTML	html

void
gtk_html_paste (html)
	Gtk::HTML	html

void
gtk_html_copy (html)
	Gtk::HTML	html

void
gtk_html_undo (html)
	Gtk::HTML	html

void
gtk_html_redo (html)
	Gtk::HTML	html

void
gtk_html_set_default_background_color (html, color)
	Gtk::HTML	html
	Gtk::Gdk::Color color

void
gtk_html_enable_debug (html, debug)
	Gtk::HTML	html
	bool	debug

char*
gtk_html_get_title (html)
	Gtk::HTML	html

bool
gtk_html_jump_to_anchor (html, anchor)
	Gtk::HTML	html
	char*	anchor

bool
gtk_html_save (html, handler, ...)
	Gtk::HTML	html
	SV	*handler
	CODE:
	{
		AV *args;

		args = newAV();

		PackCallbackST(args, 1);
		RETVAL = gtk_html_save(html, html_save, args);
		SvREFCNT_dec(args);
	}
	OUTPUT:
	RETVAL

bool
gtk_html_export (html, type, handler, ...)
	Gtk::HTML	html
	char *type
	SV	*handler
	CODE:
	{
		AV *args;

		args = newAV();

		PackCallbackST(args, 2);
		RETVAL = gtk_html_export(html, type, html_save, args);
		SvREFCNT_dec(args);
	}
	OUTPUT:
	RETVAL

#endif

INCLUDE: ../build/boxed.xsh

INCLUDE: ../build/objects.xsh

INCLUDE: ../build/extension.xsh