#include "signal_type.h"

struct GimpSignalType{
	GtkSignalMarshaller marshaller;
	GtkType return_type;
	guint nparams;
	const GtkType* param_types;
};

typedef const GtkType TypeArr[];

GimpSignalID gimp_signal_new(const gchar* name,
			     GtkSignalRunType signal_flags,
			     GtkType object_type,
			     guint function_offset,
			     GimpSignalType* sig_type){
	return gtk_signal_newv(name,
			       signal_flags,
			       object_type,
			       function_offset,
			       sig_type->marshaller,
			       sig_type->return_type,
			       sig_type->nparams,
			       /* Bah. We try to be const correct, but 
				  gtk isn't.. */
			       (GtkType*)sig_type->param_types);
}

static GimpSignalType sigtype_void={
	gtk_signal_default_marshaller,
	GTK_TYPE_NONE,
	0,
	NULL
};

GimpSignalType* const gimp_sigtype_void=&sigtype_void;

static void
gimp_marshaller_pointer (GtkObject*	object,
			 GtkSignalFunc	func,
			 gpointer		func_data,
			 GtkArg*		args)
{
	(*(GimpHandlerPointer)func) (object,
			      GTK_VALUE_POINTER (args[0]),
			      func_data);
}

static TypeArr pointer_types={
	GTK_TYPE_POINTER
};

static GimpSignalType sigtype_pointer={
	gimp_marshaller_pointer,
	GTK_TYPE_NONE,
	1,
	pointer_types
};

GimpSignalType* const gimp_sigtype_pointer=&sigtype_pointer;

static void
gimp_marshaller_int (GtkObject*	object,
			      GtkSignalFunc	func,
			      gpointer		func_data,
			      GtkArg*		args)
{
  (*(GimpHandlerInt)func) (object,
			  GTK_VALUE_INT (args[0]),
			  func_data);
}

static TypeArr int_types={
	GTK_TYPE_INT
};

static GimpSignalType sigtype_int={
	gimp_marshaller_int,
	GTK_TYPE_NONE,
	1,
	int_types
};

GimpSignalType* const gimp_sigtype_int=&sigtype_int;

static void
gimp_marshaller_int_int_int_int (GtkObject*	object,
				      GtkSignalFunc	func,
				      gpointer		func_data,
				      GtkArg*		args)
{
  (*(GimpHandlerIntIntIntInt)func) (object,
			  GTK_VALUE_INT (args[0]),
			  GTK_VALUE_INT (args[1]),
			  GTK_VALUE_INT (args[2]),
			  GTK_VALUE_INT (args[3]),
			  func_data);
}

static TypeArr int_int_int_int_types={
	GTK_TYPE_INT,
	GTK_TYPE_INT,
	GTK_TYPE_INT,
	GTK_TYPE_INT
};
	
static GimpSignalType sigtype_int_int_int_int={
	gimp_marshaller_int_int_int_int,
	GTK_TYPE_NONE,
	4,
	int_int_int_int_types
};

GimpSignalType* const gimp_sigtype_int_int_int_int=&sigtype_int_int_int_int;
