/*******************************************************************************
 * Copyright (c) 2000, 2021 IBM Corporation and others. All rights reserved.
 * The contents of this file are made available under the terms
 * of the GNU Lesser General Public License (LGPL) Version 2.1 that
 * accompanies this distribution (lgpl-v21.txt).  The LGPL is also
 * available at http://www.gnu.org/licenses/lgpl.html.  If the version
 * of the LGPL at http://www.gnu.org is different to the version of
 * the LGPL accompanying this distribution and there is any conflict
 * between the two license versions, the terms of the LGPL accompanying
 * this distribution shall govern.
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

/* Note: This file was auto-generated by org.eclipse.swt.tools.internal.JNIGenerator */
/* DO NOT EDIT - your changes will be lost. */

#include "swt.h"
#include "os_structs.h"
#include "os_stats.h"

#ifndef GDK_NATIVE
#define GDK_NATIVE(func) Java_org_eclipse_swt_internal_gtk_GDK_##func
#endif

#ifndef NO_GDK_1EVENT_1TYPE
JNIEXPORT jint JNICALL GDK_NATIVE(GDK_1EVENT_1TYPE)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GDK_1EVENT_1TYPE_FUNC);
	rc = (jint)GDK_EVENT_TYPE((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, GDK_1EVENT_1TYPE_FUNC);
	return rc;
}
#endif

#ifndef NO_GDK_1EVENT_1WINDOW
JNIEXPORT jlong JNICALL GDK_NATIVE(GDK_1EVENT_1WINDOW)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, GDK_1EVENT_1WINDOW_FUNC);
	rc = (jlong)GDK_EVENT_WINDOW((GdkEventAny *)arg0);
	GDK_NATIVE_EXIT(env, that, GDK_1EVENT_1WINDOW_FUNC);
	return rc;
}
#endif

#ifndef NO_GDK_1IS_1X11_1DISPLAY
JNIEXPORT jboolean JNICALL GDK_NATIVE(GDK_1IS_1X11_1DISPLAY)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, GDK_1IS_1X11_1DISPLAY_FUNC);
	rc = (jboolean)GDK_IS_X11_DISPLAY((GdkDisplay *)arg0);
	GDK_NATIVE_EXIT(env, that, GDK_1IS_1X11_1DISPLAY_FUNC);
	return rc;
}
#endif

#ifndef NO_GDK_1TYPE_1PIXBUF
JNIEXPORT jlong JNICALL GDK_NATIVE(GDK_1TYPE_1PIXBUF)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, GDK_1TYPE_1PIXBUF_FUNC);
	rc = (jlong)GDK_TYPE_PIXBUF;
	GDK_NATIVE_EXIT(env, that, GDK_1TYPE_1PIXBUF_FUNC);
	return rc;
}
#endif

#ifndef NO_GDK_1TYPE_1RGBA
JNIEXPORT jlong JNICALL GDK_NATIVE(GDK_1TYPE_1RGBA)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, GDK_1TYPE_1RGBA_FUNC);
	rc = (jlong)GDK_TYPE_RGBA;
	GDK_NATIVE_EXIT(env, that, GDK_1TYPE_1RGBA_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkEventButton_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkEventButton_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkEventButton_1sizeof_FUNC);
	rc = (jint)GdkEventButton_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkEventButton_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkEventCrossing_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkEventCrossing_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkEventCrossing_1sizeof_FUNC);
	rc = (jint)GdkEventCrossing_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkEventCrossing_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkEventFocus_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkEventFocus_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkEventFocus_1sizeof_FUNC);
	rc = (jint)GdkEventFocus_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkEventFocus_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkEventKey_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkEventKey_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkEventKey_1sizeof_FUNC);
	rc = (jint)GdkEventKey_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkEventKey_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkEventMotion_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkEventMotion_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkEventMotion_1sizeof_FUNC);
	rc = (jint)GdkEventMotion_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkEventMotion_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkEventWindowState_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkEventWindowState_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkEventWindowState_1sizeof_FUNC);
	rc = (jint)GdkEventWindowState_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkEventWindowState_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkEvent_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkEvent_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkEvent_1sizeof_FUNC);
	rc = (jint)GdkEvent_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkEvent_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkGeometry_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkGeometry_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkGeometry_1sizeof_FUNC);
	rc = (jint)GdkGeometry_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkGeometry_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkKeymapKey_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkKeymapKey_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkKeymapKey_1sizeof_FUNC);
	rc = (jint)GdkKeymapKey_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkKeymapKey_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkRGBA_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkRGBA_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkRGBA_1sizeof_FUNC);
	rc = (jint)GdkRGBA_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkRGBA_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkRectangle_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkRectangle_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkRectangle_1sizeof_FUNC);
	rc = (jint)GdkRectangle_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkRectangle_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GdkWindowAttr_1sizeof
JNIEXPORT jint JNICALL GDK_NATIVE(GdkWindowAttr_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, GdkWindowAttr_1sizeof_FUNC);
	rc = (jint)GdkWindowAttr_sizeof();
	GDK_NATIVE_EXIT(env, that, GdkWindowAttr_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1atom_1intern
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1atom_1intern)
	(JNIEnv *env, jclass that, jbyteArray arg0, jboolean arg1)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1atom_1intern_FUNC);
		if (arg0) if ((lparg0 = (*env)->GetPrimitiveArrayCritical(env, arg0, NULL)) == NULL) goto fail;
/*
	rc = (jlong)gdk_atom_intern((const gchar *)lparg0, arg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_atom_intern)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(const gchar *, jboolean))fp)((const gchar *)lparg0, arg1);
		}
	}
fail:
		if (arg0 && lparg0) (*env)->ReleasePrimitiveArrayCritical(env, arg0, lparg0, JNI_ABORT);
	GDK_NATIVE_EXIT(env, that, gdk_1atom_1intern_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1atom_1name
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1atom_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1atom_1name_FUNC);
	rc = (jlong)gdk_atom_name((GdkAtom)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1atom_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1button_1event_1get_1button
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1button_1event_1get_1button)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1button_1event_1get_1button_FUNC);
	rc = (jint)gdk_button_event_get_button((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1button_1event_1get_1button_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1cairo_1create
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1cairo_1create)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1cairo_1create_FUNC);
/*
	rc = (jlong)gdk_cairo_create((GdkWindow *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_cairo_create)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkWindow *))fp)((GdkWindow *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1cairo_1create_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1cairo_1get_1clip_1rectangle
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1cairo_1get_1clip_1rectangle)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1cairo_1get_1clip_1rectangle_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
/*
	rc = (jboolean)gdk_cairo_get_clip_rectangle((cairo_t *)arg0, (GdkRectangle *)lparg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_cairo_get_clip_rectangle)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(cairo_t *, GdkRectangle *))fp)((cairo_t *)arg0, (GdkRectangle *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) setGdkRectangleFields(env, arg1, lparg1);
	GDK_NATIVE_EXIT(env, that, gdk_1cairo_1get_1clip_1rectangle_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1cairo_1region
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1cairo_1region)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1cairo_1region_FUNC);
	gdk_cairo_region((cairo_t *)arg0, (cairo_region_t *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1cairo_1region_FUNC);
}
#endif

#ifndef NO_gdk_1cairo_1region_1create_1from_1surface
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1cairo_1region_1create_1from_1surface)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1cairo_1region_1create_1from_1surface_FUNC);
	rc = (jlong)gdk_cairo_region_create_from_surface((cairo_surface_t *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1cairo_1region_1create_1from_1surface_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1cairo_1set_1source_1pixbuf
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1cairo_1set_1source_1pixbuf)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3)
{
	GDK_NATIVE_ENTER(env, that, gdk_1cairo_1set_1source_1pixbuf_FUNC);
	gdk_cairo_set_source_pixbuf((cairo_t *)arg0, (const GdkPixbuf *)arg1, (gdouble)arg2, (gdouble)arg3);
	GDK_NATIVE_EXIT(env, that, gdk_1cairo_1set_1source_1pixbuf_FUNC);
}
#endif

#ifndef NO_gdk_1cairo_1set_1source_1rgba
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1cairo_1set_1source_1rgba)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRGBA _arg1, *lparg1=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1cairo_1set_1source_1rgba_FUNC);
	if (arg1) if ((lparg1 = getGdkRGBAFields(env, arg1, &_arg1)) == NULL) goto fail;
	gdk_cairo_set_source_rgba((cairo_t *)arg0, (const GdkRGBA *)lparg1);
fail:
	if (arg1 && lparg1) setGdkRGBAFields(env, arg1, lparg1);
	GDK_NATIVE_EXIT(env, that, gdk_1cairo_1set_1source_1rgba_FUNC);
}
#endif

#ifndef NO_gdk_1cairo_1set_1source_1window
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1cairo_1set_1source_1window)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3)
{
	GDK_NATIVE_ENTER(env, that, gdk_1cairo_1set_1source_1window_FUNC);
	gdk_cairo_set_source_window((cairo_t *)arg0, (GdkWindow *)arg1, (gdouble)arg2, (gdouble)arg3);
	GDK_NATIVE_EXIT(env, that, gdk_1cairo_1set_1source_1window_FUNC);
}
#endif

#ifndef NO_gdk_1clipboard_1set_1content
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1clipboard_1set_1content)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1clipboard_1set_1content_FUNC);
	rc = (jlong)gdk_clipboard_set_content((GdkClipboard *)arg0, (GdkContentProvider *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1clipboard_1set_1content_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1crossing_1event_1get_1mode
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1crossing_1event_1get_1mode)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1crossing_1event_1get_1mode_FUNC);
	rc = (jint)gdk_crossing_event_get_mode((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1crossing_1event_1get_1mode_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1cursor_1new_1from_1name__JLjava_lang_String_2
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1cursor_1new_1from_1name__JLjava_lang_String_2)
	(JNIEnv *env, jclass that, jlong arg0, jstring arg1)
{
	const char *lparg1= NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1cursor_1new_1from_1name__JLjava_lang_String_2_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetStringUTFChars(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gdk_cursor_new_from_name((GdkDisplay *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseStringUTFChars(env, arg1, lparg1);
	GDK_NATIVE_EXIT(env, that, gdk_1cursor_1new_1from_1name__JLjava_lang_String_2_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1cursor_1new_1from_1name__Ljava_lang_String_2J
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1cursor_1new_1from_1name__Ljava_lang_String_2J)
	(JNIEnv *env, jclass that, jstring arg0, jlong arg1)
{
	const char *lparg0= NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1cursor_1new_1from_1name__Ljava_lang_String_2J_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetStringUTFChars(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gdk_cursor_new_from_name((const gchar *)lparg0, (GdkCursor *)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseStringUTFChars(env, arg0, lparg0);
	GDK_NATIVE_EXIT(env, that, gdk_1cursor_1new_1from_1name__Ljava_lang_String_2J_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1cursor_1new_1from_1pixbuf
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1cursor_1new_1from_1pixbuf)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1cursor_1new_1from_1pixbuf_FUNC);
	rc = (jlong)gdk_cursor_new_from_pixbuf((GdkDisplay *)arg0, (GdkPixbuf *)arg1, (gint)arg2, (gint)arg3);
	GDK_NATIVE_EXIT(env, that, gdk_1cursor_1new_1from_1pixbuf_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1cursor_1new_1from_1texture
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1cursor_1new_1from_1texture)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jlong arg3)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1cursor_1new_1from_1texture_FUNC);
	rc = (jlong)gdk_cursor_new_from_texture((GdkTexture *)arg0, (gint)arg1, (gint)arg2, (GdkCursor *)arg3);
	GDK_NATIVE_EXIT(env, that, gdk_1cursor_1new_1from_1texture_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1device_1get_1associated_1device
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1device_1get_1associated_1device)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1device_1get_1associated_1device_FUNC);
/*
	rc = (jlong)gdk_device_get_associated_device((GdkDevice *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_device_get_associated_device)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDevice *))fp)((GdkDevice *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1device_1get_1associated_1device_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1device_1get_1seat
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1device_1get_1seat)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1device_1get_1seat_FUNC);
	rc = (jlong)gdk_device_get_seat((GdkDevice *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1device_1get_1seat_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1device_1get_1surface_1at_1position
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1device_1get_1surface_1at_1position)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1, jdoubleArray arg2)
{
	jdouble *lparg1=NULL;
	jdouble *lparg2=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1device_1get_1surface_1at_1position_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	rc = (jlong)gdk_device_get_surface_at_position((GdkDevice *)arg0, (double *)lparg1, (double *)lparg2);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_device_get_surface_at_position)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDevice *, double *, double *))fp)((GdkDevice *)arg0, (double *)lparg1, (double *)lparg2);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1device_1get_1surface_1at_1position_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1device_1get_1window_1at_1position
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1device_1get_1window_1at_1position)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1device_1get_1window_1at_1position_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	rc = (jlong)gdk_device_get_window_at_position((GdkDevice *)arg0, (gint *)lparg1, (gint *)lparg2);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_device_get_window_at_position)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDevice *, gint *, gint *))fp)((GdkDevice *)arg0, (gint *)lparg1, (gint *)lparg2);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1device_1get_1window_1at_1position_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1device_1warp
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1device_1warp)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3)
{
	GDK_NATIVE_ENTER(env, that, gdk_1device_1warp_FUNC);
/*
	gdk_device_warp((GdkDevice *)arg0, (GdkScreen *)arg1, (gint)arg2, (gint)arg3);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_device_warp)
		if (fp) {
			((void (CALLING_CONVENTION*)(GdkDevice *, GdkScreen *, gint, gint))fp)((GdkDevice *)arg0, (GdkScreen *)arg1, (gint)arg2, (gint)arg3);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1device_1warp_FUNC);
}
#endif

#ifndef NO_gdk_1display_1beep
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1display_1beep)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1display_1beep_FUNC);
	gdk_display_beep((GdkDisplay *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1display_1beep_FUNC);
}
#endif

#ifndef NO_gdk_1display_1get_1clipboard
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1clipboard)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1clipboard_FUNC);
/*
	rc = (jlong)gdk_display_get_clipboard((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_clipboard)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1clipboard_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1default
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1default)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1default_FUNC);
	rc = (jlong)gdk_display_get_default();
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1default_1group
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1default_1group)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1default_1group_FUNC);
/*
	rc = (jlong)gdk_display_get_default_group((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_default_group)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1default_1group_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1default_1seat
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1default_1seat)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1default_1seat_FUNC);
/*
	rc = (jlong)gdk_display_get_default_seat(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_default_seat)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1default_1seat_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1monitor
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1monitor)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1monitor_FUNC);
/*
	rc = (jlong)gdk_display_get_monitor((GdkDisplay *)arg0, arg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_monitor)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *, jint))fp)((GdkDisplay *)arg0, arg1);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1monitor_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1monitor_1at_1point
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1monitor_1at_1point)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1monitor_1at_1point_FUNC);
/*
	rc = (jlong)gdk_display_get_monitor_at_point((GdkDisplay *)arg0, arg1, arg2);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_monitor_at_point)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *, jint, jint))fp)((GdkDisplay *)arg0, arg1, arg2);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1monitor_1at_1point_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1monitor_1at_1surface
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1monitor_1at_1surface)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1monitor_1at_1surface_FUNC);
	rc = (jlong)gdk_display_get_monitor_at_surface((GdkDisplay *)arg0, (GdkSurface *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1monitor_1at_1surface_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1monitor_1at_1window
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1monitor_1at_1window)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1monitor_1at_1window_FUNC);
/*
	rc = (jlong)gdk_display_get_monitor_at_window((GdkDisplay *)arg0, (GdkWindow *)arg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_monitor_at_window)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *, GdkWindow *))fp)((GdkDisplay *)arg0, (GdkWindow *)arg1);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1monitor_1at_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1monitors
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1monitors)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1monitors_FUNC);
/*
	rc = (jlong)gdk_display_get_monitors((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_monitors)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1monitors_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1n_1monitors
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1display_1get_1n_1monitors)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1n_1monitors_FUNC);
/*
	rc = (jint)gdk_display_get_n_monitors((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_n_monitors)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1n_1monitors_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1primary_1clipboard
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1primary_1clipboard)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1primary_1clipboard_FUNC);
/*
	rc = (jlong)gdk_display_get_primary_clipboard((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_primary_clipboard)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1primary_1clipboard_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1get_1primary_1monitor
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1get_1primary_1monitor)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1get_1primary_1monitor_FUNC);
/*
	rc = (jlong)gdk_display_get_primary_monitor((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_primary_monitor)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1get_1primary_1monitor_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1is_1composited
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1display_1is_1composited)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1is_1composited_FUNC);
/*
	rc = (jboolean)gdk_display_is_composited((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_is_composited)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1is_1composited_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1map_1keyval
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1display_1map_1keyval)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlongArray arg2, jintArray arg3)
{
	jlong *lparg2=NULL;
	jint *lparg3=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1map_1keyval_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)gdk_display_map_keyval((GdkDisplay *)arg0, (guint)arg1, (GdkKeymapKey**)lparg2, (gint*)lparg3);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_map_keyval)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GdkDisplay *, guint, GdkKeymapKey**, gint*))fp)((GdkDisplay *)arg0, (guint)arg1, (GdkKeymapKey**)lparg2, (gint*)lparg3);
		}
	}
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1display_1map_1keyval_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1display_1put_1event
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1display_1put_1event)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1display_1put_1event_FUNC);
	gdk_display_put_event((GdkDisplay *)arg0, (GdkEvent *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1display_1put_1event_FUNC);
}
#endif

#ifndef NO_gdk_1display_1supports_1cursor_1color
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1display_1supports_1cursor_1color)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1supports_1cursor_1color_FUNC);
/*
	rc = (jboolean)gdk_display_supports_cursor_color((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_supports_cursor_color)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1display_1supports_1cursor_1color_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1drag_1context_1get_1actions
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1drag_1context_1get_1actions)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1drag_1context_1get_1actions_FUNC);
/*
	rc = (jint)gdk_drag_context_get_actions(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_drag_context_get_actions)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1drag_1context_1get_1actions_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1drag_1context_1get_1dest_1window
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1drag_1context_1get_1dest_1window)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1drag_1context_1get_1dest_1window_FUNC);
	rc = (jlong)gdk_drag_context_get_dest_window((GdkDragContext *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1drag_1context_1get_1dest_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1drag_1context_1get_1selected_1action
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1drag_1context_1get_1selected_1action)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1drag_1context_1get_1selected_1action_FUNC);
/*
	rc = (jint)gdk_drag_context_get_selected_action(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_drag_context_get_selected_action)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1drag_1context_1get_1selected_1action_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1drag_1context_1list_1targets
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1drag_1context_1list_1targets)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1drag_1context_1list_1targets_FUNC);
	rc = (jlong)gdk_drag_context_list_targets((GdkDragContext *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1drag_1context_1list_1targets_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1drag_1status
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1drag_1status)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GDK_NATIVE_ENTER(env, that, gdk_1drag_1status_FUNC);
	gdk_drag_status((GdkDragContext *)arg0, (GdkDragAction)arg1, (guint32)arg2);
	GDK_NATIVE_EXIT(env, that, gdk_1drag_1status_FUNC);
}
#endif

#ifndef NO_gdk_1event_1copy
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1event_1copy)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1copy_FUNC);
	rc = (jlong)gdk_event_copy((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1copy_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1free
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1event_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1event_1free_FUNC);
	gdk_event_free((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1free_FUNC);
}
#endif

#ifndef NO_gdk_1event_1get
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1event_1get)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_FUNC);
	rc = (jlong)gdk_event_get();
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1button
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1button)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1button_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_button((GdkEvent *)arg0, (guint *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1button_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1coords
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1coords)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1, jdoubleArray arg2)
{
	jdouble *lparg1=NULL;
	jdouble *lparg2=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1coords_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_coords((GdkEvent *)arg0, (gdouble *)lparg1, (gdouble *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1coords_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1event_1type
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1event_1get_1event_1type)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1event_1type_FUNC);
/*
	rc = (jint)gdk_event_get_event_type((GdkEvent *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_event_get_event_type)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GdkEvent *))fp)((GdkEvent *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1event_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1keycode
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1keycode)
	(JNIEnv *env, jclass that, jlong arg0, jshortArray arg1)
{
	jshort *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1keycode_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetShortArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_keycode((GdkEvent *)arg0, (guint16 *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseShortArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1keycode_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1keyval
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1keyval)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1keyval_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_keyval((GdkEvent *)arg0, (guint *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1keyval_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1modifier_1state
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1event_1get_1modifier_1state)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1modifier_1state_FUNC);
	rc = (jint)gdk_event_get_modifier_state((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1modifier_1state_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1position
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1position)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1, jdoubleArray arg2)
{
	jdouble *lparg1=NULL;
	jdouble *lparg2=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1position_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_position((GdkEvent *)arg0, (double *)lparg1, (double *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1position_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1root_1coords
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1root_1coords)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1, jdoubleArray arg2)
{
	jdouble *lparg1=NULL;
	jdouble *lparg2=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1root_1coords_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_root_coords((GdkEvent *)arg0, (gdouble *)lparg1, (gdouble *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1root_1coords_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1scroll_1deltas
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1scroll_1deltas)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1, jdoubleArray arg2)
{
	jdouble *lparg1=NULL;
	jdouble *lparg2=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1scroll_1deltas_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_scroll_deltas((const GdkEvent *)arg0, (gdouble *)lparg1, (gdouble *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1scroll_1deltas_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1scroll_1direction
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1scroll_1direction)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1scroll_1direction_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_scroll_direction((const GdkEvent *)arg0, (GdkScrollDirection *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1scroll_1direction_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1seat
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1event_1get_1seat)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1seat_FUNC);
/*
	rc = (jlong)gdk_event_get_seat(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_event_get_seat)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1seat_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1state
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1state)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1state_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_state((GdkEvent *)arg0, (GdkModifierType *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1state_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1surface
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1event_1get_1surface)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1surface_FUNC);
	rc = (jlong)gdk_event_get_surface((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1surface_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1time
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1event_1get_1time)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1time_FUNC);
	rc = (jint)gdk_event_get_time((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1time_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1window
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1event_1get_1window)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1window_FUNC);
	rc = (jlong)gdk_event_get_window((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1handler_1set
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1event_1handler_1set)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	GDK_NATIVE_ENTER(env, that, gdk_1event_1handler_1set_FUNC);
/*
	gdk_event_handler_set(arg0, arg1, arg2);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_event_handler_set)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jlong, jlong))fp)(arg0, arg1, arg2);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1event_1handler_1set_FUNC);
}
#endif

#ifndef NO_gdk_1event_1new
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1event_1new)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1new_FUNC);
	rc = (jlong)gdk_event_new(arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1peek
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1event_1peek)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1peek_FUNC);
	rc = (jlong)gdk_event_peek();
	GDK_NATIVE_EXIT(env, that, gdk_1event_1peek_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1put
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1event_1put)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1event_1put_FUNC);
	gdk_event_put((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1put_FUNC);
}
#endif

#ifndef NO_gdk_1event_1ref
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1event_1ref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1ref_FUNC);
	rc = (jlong)gdk_event_ref((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1ref_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1set_1device
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1event_1set_1device)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1event_1set_1device_FUNC);
	gdk_event_set_device((GdkEvent *)arg0, (GdkDevice *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1set_1device_FUNC);
}
#endif

#ifndef NO_gdk_1event_1unref
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1event_1unref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1event_1unref_FUNC);
	gdk_event_unref((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1unref_FUNC);
}
#endif

#ifndef NO_gdk_1focus_1event_1get_1in
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1focus_1event_1get_1in)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1focus_1event_1get_1in_FUNC);
	rc = (jboolean)gdk_focus_event_get_in((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1focus_1event_1get_1in_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1get_1default_1root_1window
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1get_1default_1root_1window)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1get_1default_1root_1window_FUNC);
	rc = (jlong)gdk_get_default_root_window();
	GDK_NATIVE_EXIT(env, that, gdk_1get_1default_1root_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1key_1event_1get_1keycode
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1key_1event_1get_1keycode)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1key_1event_1get_1keycode_FUNC);
	rc = (jint)gdk_key_event_get_keycode((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1key_1event_1get_1keycode_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1key_1event_1get_1keyval
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1key_1event_1get_1keyval)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1key_1event_1get_1keyval_FUNC);
	rc = (jint)gdk_key_event_get_keyval((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1key_1event_1get_1keyval_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1key_1event_1get_1layout
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1key_1event_1get_1layout)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1key_1event_1get_1layout_FUNC);
	rc = (jint)gdk_key_event_get_layout((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1key_1event_1get_1layout_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1keymap_1get_1entries_1for_1keyval
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1keymap_1get_1entries_1for_1keyval)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlongArray arg2, jintArray arg3)
{
	jlong *lparg2=NULL;
	jint *lparg3=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1keymap_1get_1entries_1for_1keyval_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)gdk_keymap_get_entries_for_keyval((GdkKeymap*)arg0, (guint)arg1, (GdkKeymapKey**)lparg2, (gint*)lparg3);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_keymap_get_entries_for_keyval)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GdkKeymap*, guint, GdkKeymapKey**, gint*))fp)((GdkKeymap*)arg0, (guint)arg1, (GdkKeymapKey**)lparg2, (gint*)lparg3);
		}
	}
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1keymap_1get_1entries_1for_1keyval_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1keymap_1get_1for_1display
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1keymap_1get_1for_1display)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1keymap_1get_1for_1display_FUNC);
/*
	rc = (jlong)gdk_keymap_get_for_display((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_keymap_get_for_display)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1keymap_1get_1for_1display_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1keymap_1translate_1keyboard_1state
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1keymap_1translate_1keyboard_1state)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jintArray arg4, jintArray arg5, jintArray arg6, jintArray arg7)
{
	jint *lparg4=NULL;
	jint *lparg5=NULL;
	jint *lparg6=NULL;
	jint *lparg7=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1keymap_1translate_1keyboard_1state_FUNC);
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetIntArrayElements(env, arg5, NULL)) == NULL) goto fail;
	if (arg6) if ((lparg6 = (*env)->GetIntArrayElements(env, arg6, NULL)) == NULL) goto fail;
	if (arg7) if ((lparg7 = (*env)->GetIntArrayElements(env, arg7, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)gdk_keymap_translate_keyboard_state((GdkKeymap *)arg0, (guint)arg1, (GdkModifierType)arg2, (gint)arg3, (guint *)lparg4, (gint *)lparg5, (gint *)lparg6, (GdkModifierType *)lparg7);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_keymap_translate_keyboard_state)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GdkKeymap *, guint, GdkModifierType, gint, guint *, gint *, gint *, GdkModifierType *))fp)((GdkKeymap *)arg0, (guint)arg1, (GdkModifierType)arg2, (gint)arg3, (guint *)lparg4, (gint *)lparg5, (gint *)lparg6, (GdkModifierType *)lparg7);
		}
	}
fail:
	if (arg7 && lparg7) (*env)->ReleaseIntArrayElements(env, arg7, lparg7, 0);
	if (arg6 && lparg6) (*env)->ReleaseIntArrayElements(env, arg6, lparg6, 0);
	if (arg5 && lparg5) (*env)->ReleaseIntArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1keymap_1translate_1keyboard_1state_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1keyval_1name
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1keyval_1name)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1keyval_1name_FUNC);
	rc = (jlong)gdk_keyval_name((guint)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1keyval_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1keyval_1to_1lower
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1keyval_1to_1lower)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1keyval_1to_1lower_FUNC);
	rc = (jlong)gdk_keyval_to_lower(arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1keyval_1to_1lower_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1keyval_1to_1unicode
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1keyval_1to_1unicode)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1keyval_1to_1unicode_FUNC);
	rc = (jlong)gdk_keyval_to_unicode(arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1keyval_1to_1unicode_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1monitor_1get_1geometry
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1monitor_1get_1geometry)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1monitor_1get_1geometry_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
/*
	gdk_monitor_get_geometry(arg0, lparg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_monitor_get_geometry)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, GdkRectangle *))fp)(arg0, lparg1);
		}
	}
fail:
	if (arg1 && lparg1) setGdkRectangleFields(env, arg1, lparg1);
	GDK_NATIVE_EXIT(env, that, gdk_1monitor_1get_1geometry_FUNC);
}
#endif

#ifndef NO_gdk_1monitor_1get_1scale_1factor
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1monitor_1get_1scale_1factor)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1monitor_1get_1scale_1factor_FUNC);
/*
	rc = (jint)gdk_monitor_get_scale_factor(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_monitor_get_scale_factor)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1monitor_1get_1scale_1factor_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1monitor_1get_1workarea
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1monitor_1get_1workarea)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1monitor_1get_1workarea_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
/*
	gdk_monitor_get_workarea(arg0, lparg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_monitor_get_workarea)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, GdkRectangle *))fp)(arg0, lparg1);
		}
	}
fail:
	if (arg1 && lparg1) setGdkRectangleFields(env, arg1, lparg1);
	GDK_NATIVE_EXIT(env, that, gdk_1monitor_1get_1workarea_FUNC);
}
#endif

#ifndef NO_gdk_1pango_1context_1get
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pango_1context_1get)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pango_1context_1get_FUNC);
/*
	rc = (jlong)gdk_pango_context_get();
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_pango_context_get)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1pango_1context_1get_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pango_1layout_1get_1clip_1region
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pango_1layout_1get_1clip_1region)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jintArray arg3, jint arg4)
{
	jint *lparg3=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pango_1layout_1get_1clip_1region_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	rc = (jlong)gdk_pango_layout_get_clip_region((PangoLayout *)arg0, arg1, arg2, (gint *)lparg3, arg4);
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1pango_1layout_1get_1clip_1region_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1animation_1get_1iter
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1animation_1get_1iter)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1animation_1get_1iter_FUNC);
	rc = (jlong)gdk_pixbuf_animation_get_iter((GdkPixbufAnimation *)arg0, (const GTimeVal *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1animation_1get_1iter_FUNC);
	return rc;
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_gdk_1pixbuf_1animation_1get_1static_1image
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1animation_1get_1static_1image)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1animation_1get_1static_1image_FUNC);
	rc = (jlong)gdk_pixbuf_animation_get_static_image((GdkPixbufAnimation *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1animation_1get_1static_1image_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1animation_1is_1static_1image
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1pixbuf_1animation_1is_1static_1image)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1animation_1is_1static_1image_FUNC);
	rc = (jboolean)gdk_pixbuf_animation_is_static_image((GdkPixbufAnimation *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1animation_1is_1static_1image_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1animation_1iter_1advance
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1pixbuf_1animation_1iter_1advance)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1animation_1iter_1advance_FUNC);
	rc = (jboolean)gdk_pixbuf_animation_iter_advance((GdkPixbufAnimationIter *)arg0, (const GTimeVal *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1animation_1iter_1advance_FUNC);
	return rc;
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_gdk_1pixbuf_1animation_1iter_1get_1delay_1time
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1pixbuf_1animation_1iter_1get_1delay_1time)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1animation_1iter_1get_1delay_1time_FUNC);
	rc = (jint)gdk_pixbuf_animation_iter_get_delay_time((GdkPixbufAnimationIter *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1animation_1iter_1get_1delay_1time_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1animation_1iter_1get_1pixbuf
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1animation_1iter_1get_1pixbuf)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1animation_1iter_1get_1pixbuf_FUNC);
	rc = (jlong)gdk_pixbuf_animation_iter_get_pixbuf((GdkPixbufAnimationIter *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1animation_1iter_1get_1pixbuf_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1copy
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1copy)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1copy_FUNC);
	rc = (jlong)gdk_pixbuf_copy((const GdkPixbuf *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1copy_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1copy_1area
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1pixbuf_1copy_1area)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jint arg4, jlong arg5, jint arg6, jint arg7)
{
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1copy_1area_FUNC);
	gdk_pixbuf_copy_area((GdkPixbuf *)arg0, arg1, arg2, arg3, arg4, (GdkPixbuf *)arg5, arg6, arg7);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1copy_1area_FUNC);
}
#endif

#ifndef NO_gdk_1pixbuf_1format_1get_1name
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1format_1get_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1format_1get_1name_FUNC);
	rc = (jlong)gdk_pixbuf_format_get_name((GdkPixbufFormat *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1format_1get_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1get_1bits_1per_1sample
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1pixbuf_1get_1bits_1per_1sample)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1get_1bits_1per_1sample_FUNC);
	rc = (jint)gdk_pixbuf_get_bits_per_sample((const GdkPixbuf *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1get_1bits_1per_1sample_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1get_1from_1surface
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1get_1from_1surface)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jint arg4)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1get_1from_1surface_FUNC);
/*
	rc = (jlong)gdk_pixbuf_get_from_surface((cairo_surface_t *)arg0, arg1, arg2, arg3, arg4);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_pixbuf_get_from_surface)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(cairo_surface_t *, jint, jint, jint, jint))fp)((cairo_surface_t *)arg0, arg1, arg2, arg3, arg4);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1get_1from_1surface_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1get_1from_1texture
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1get_1from_1texture)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1get_1from_1texture_FUNC);
/*
	rc = (jlong)gdk_pixbuf_get_from_texture((GdkTexture *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_pixbuf_get_from_texture)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkTexture *))fp)((GdkTexture *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1get_1from_1texture_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1get_1from_1window
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1get_1from_1window)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jint arg4)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1get_1from_1window_FUNC);
/*
	rc = (jlong)gdk_pixbuf_get_from_window((GdkWindow *)arg0, arg1, arg2, arg3, arg4);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_pixbuf_get_from_window)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkWindow *, jint, jint, jint, jint))fp)((GdkWindow *)arg0, arg1, arg2, arg3, arg4);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1get_1from_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1get_1has_1alpha
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1pixbuf_1get_1has_1alpha)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1get_1has_1alpha_FUNC);
	rc = (jboolean)gdk_pixbuf_get_has_alpha((const GdkPixbuf *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1get_1has_1alpha_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1get_1height
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1pixbuf_1get_1height)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1get_1height_FUNC);
	rc = (jint)gdk_pixbuf_get_height((const GdkPixbuf *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1get_1height_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1get_1n_1channels
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1pixbuf_1get_1n_1channels)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1get_1n_1channels_FUNC);
	rc = (jint)gdk_pixbuf_get_n_channels((const GdkPixbuf *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1get_1n_1channels_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1get_1pixels
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1get_1pixels)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1get_1pixels_FUNC);
	rc = (jlong)gdk_pixbuf_get_pixels((const GdkPixbuf *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1get_1pixels_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1get_1rowstride
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1pixbuf_1get_1rowstride)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1get_1rowstride_FUNC);
	rc = (jint)gdk_pixbuf_get_rowstride((const GdkPixbuf *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1get_1rowstride_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1get_1width
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1pixbuf_1get_1width)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1get_1width_FUNC);
	rc = (jint)gdk_pixbuf_get_width((const GdkPixbuf *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1get_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1loader_1close
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1pixbuf_1loader_1close)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1loader_1close_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_pixbuf_loader_close((GdkPixbufLoader *)arg0, (GError **)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1loader_1close_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1loader_1get_1animation
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1loader_1get_1animation)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1loader_1get_1animation_FUNC);
	rc = (jlong)gdk_pixbuf_loader_get_animation((GdkPixbufLoader *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1loader_1get_1animation_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1loader_1get_1format
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1loader_1get_1format)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1loader_1get_1format_FUNC);
	rc = (jlong)gdk_pixbuf_loader_get_format((GdkPixbufLoader *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1loader_1get_1format_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1loader_1get_1pixbuf
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1loader_1get_1pixbuf)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1loader_1get_1pixbuf_FUNC);
	rc = (jlong)gdk_pixbuf_loader_get_pixbuf((GdkPixbufLoader *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1loader_1get_1pixbuf_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1loader_1new
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1loader_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1loader_1new_FUNC);
	rc = (jlong)gdk_pixbuf_loader_new();
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1loader_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1loader_1write
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1pixbuf_1loader_1write)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jlongArray arg3)
{
	jlong *lparg3=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1loader_1write_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetLongArrayElements(env, arg3, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_pixbuf_loader_write((GdkPixbufLoader *)arg0, (const guchar *)arg1, (gsize)arg2, (GError **)lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseLongArrayElements(env, arg3, lparg3, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1loader_1write_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1new
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1new)
	(JNIEnv *env, jclass that, jint arg0, jboolean arg1, jint arg2, jint arg3, jint arg4)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1new_FUNC);
	rc = (jlong)gdk_pixbuf_new((GdkColorspace)arg0, (gboolean)arg1, arg2, arg3, arg4);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1new_1from_1data
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1new_1from_1data)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jboolean arg2, jint arg3, jint arg4, jint arg5, jint arg6, jlong arg7, jlong arg8)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1new_1from_1data_FUNC);
	rc = (jlong)gdk_pixbuf_new_from_data((const guchar *)arg0, (GdkColorspace)arg1, (gboolean)arg2, arg3, arg4, arg5, arg6, (GdkPixbufDestroyNotify)arg7, (gpointer)arg8);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1new_1from_1data_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1new_1from_1file
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1new_1from_1file)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlongArray arg1)
{
	jbyte *lparg0=NULL;
	jlong *lparg1=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1new_1from_1file_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gdk_pixbuf_new_from_file((const char *)lparg0, (GError**)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1new_1from_1file_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1save_1to_1bufferv
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1pixbuf_1save_1to_1bufferv)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1, jlongArray arg2, jbyteArray arg3, jlongArray arg4, jlongArray arg5, jlongArray arg6)
{
	jlong *lparg1=NULL;
	jlong *lparg2=NULL;
	jbyte *lparg3=NULL;
	jlong *lparg4=NULL;
	jlong *lparg5=NULL;
	jlong *lparg6=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1save_1to_1bufferv_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetByteArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetLongArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetLongArrayElements(env, arg5, NULL)) == NULL) goto fail;
	if (arg6) if ((lparg6 = (*env)->GetLongArrayElements(env, arg6, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_pixbuf_save_to_bufferv((GdkPixbuf *)arg0, (gchar **)lparg1, (gsize *)lparg2, (const char *)lparg3, (char **)lparg4, (char **)lparg5, (GError **)lparg6);
fail:
	if (arg6 && lparg6) (*env)->ReleaseLongArrayElements(env, arg6, lparg6, 0);
	if (arg5 && lparg5) (*env)->ReleaseLongArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseLongArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseByteArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1save_1to_1bufferv_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1pixbuf_1scale_1simple
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1pixbuf_1scale_1simple)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1pixbuf_1scale_1simple_FUNC);
	rc = (jlong)gdk_pixbuf_scale_simple((const GdkPixbuf *)arg0, arg1, arg2, (GdkInterpType)arg3);
	GDK_NATIVE_EXIT(env, that, gdk_1pixbuf_1scale_1simple_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1popup_1get_1parent
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1popup_1get_1parent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1popup_1get_1parent_FUNC);
	rc = (jlong)gdk_popup_get_parent((GdkPopup *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1popup_1get_1parent_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1popup_1layout_1new
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1popup_1layout_1new)
	(JNIEnv *env, jclass that, jobject arg0, jint arg1, jint arg2)
{
	GdkRectangle _arg0, *lparg0=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1popup_1layout_1new_FUNC);
	if (arg0) if ((lparg0 = getGdkRectangleFields(env, arg0, &_arg0)) == NULL) goto fail;
	rc = (jlong)gdk_popup_layout_new((const GdkRectangle *)lparg0, (GdkGravity)arg1, (GdkGravity)arg2);
fail:
	if (arg0 && lparg0) setGdkRectangleFields(env, arg0, lparg0);
	GDK_NATIVE_EXIT(env, that, gdk_1popup_1layout_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1popup_1present
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1popup_1present)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jlong arg3)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1popup_1present_FUNC);
	rc = (jboolean)gdk_popup_present((GdkPopup *)arg0, arg1, arg2, (GdkPopupLayout *)arg3);
	GDK_NATIVE_EXIT(env, that, gdk_1popup_1present_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1property_1get
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1property_1get)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jint arg5, jlongArray arg6, jintArray arg7, jintArray arg8, jlongArray arg9)
{
	jlong *lparg6=NULL;
	jint *lparg7=NULL;
	jint *lparg8=NULL;
	jlong *lparg9=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1property_1get_FUNC);
	if (arg6) if ((lparg6 = (*env)->GetLongArrayElements(env, arg6, NULL)) == NULL) goto fail;
	if (arg7) if ((lparg7 = (*env)->GetIntArrayElements(env, arg7, NULL)) == NULL) goto fail;
	if (arg8) if ((lparg8 = (*env)->GetIntArrayElements(env, arg8, NULL)) == NULL) goto fail;
	if (arg9) if ((lparg9 = (*env)->GetLongArrayElements(env, arg9, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_property_get((GdkWindow *)arg0, (GdkAtom)arg1, (GdkAtom)arg2, arg3, arg4, arg5, (GdkAtom *)lparg6, (gint *)lparg7, (gint *)lparg8, (guchar **)lparg9);
fail:
	if (arg9 && lparg9) (*env)->ReleaseLongArrayElements(env, arg9, lparg9, 0);
	if (arg8 && lparg8) (*env)->ReleaseIntArrayElements(env, arg8, lparg8, 0);
	if (arg7 && lparg7) (*env)->ReleaseIntArrayElements(env, arg7, lparg7, 0);
	if (arg6 && lparg6) (*env)->ReleaseLongArrayElements(env, arg6, lparg6, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1property_1get_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1rgba_1free
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1rgba_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1rgba_1free_FUNC);
	gdk_rgba_free((GdkRGBA *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1rgba_1free_FUNC);
}
#endif

#ifndef NO_gdk_1rgba_1parse
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1rgba_1parse)
	(JNIEnv *env, jclass that, jobject arg0, jbyteArray arg1)
{
	GdkRGBA _arg0, *lparg0=NULL;
	jbyte *lparg1=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1rgba_1parse_FUNC);
	if (arg0) if ((lparg0 = getGdkRGBAFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gdk_rgba_parse((GdkRGBA *)lparg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) setGdkRGBAFields(env, arg0, lparg0);
	GDK_NATIVE_EXIT(env, that, gdk_1rgba_1parse_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1rgba_1to_1string
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1rgba_1to_1string)
	(JNIEnv *env, jclass that, jobject arg0)
{
	GdkRGBA _arg0, *lparg0=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1rgba_1to_1string_FUNC);
	if (arg0) if ((lparg0 = getGdkRGBAFields(env, arg0, &_arg0)) == NULL) goto fail;
	rc = (jlong)gdk_rgba_to_string((GdkRGBA *)lparg0);
fail:
	if (arg0 && lparg0) setGdkRGBAFields(env, arg0, lparg0);
	GDK_NATIVE_EXIT(env, that, gdk_1rgba_1to_1string_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1get_1default
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1screen_1get_1default)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1get_1default_FUNC);
	rc = (jlong)gdk_screen_get_default();
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1get_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1get_1monitor_1at_1point
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1screen_1get_1monitor_1at_1point)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1get_1monitor_1at_1point_FUNC);
/*
	rc = (jint)gdk_screen_get_monitor_at_point((GdkScreen *)arg0, (gint)arg1, (gint)arg2);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_screen_get_monitor_at_point)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GdkScreen *, gint, gint))fp)((GdkScreen *)arg0, (gint)arg1, (gint)arg2);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1get_1monitor_1at_1point_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1get_1monitor_1at_1window
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1screen_1get_1monitor_1at_1window)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1get_1monitor_1at_1window_FUNC);
/*
	rc = (jint)gdk_screen_get_monitor_at_window((GdkScreen *)arg0, (GdkWindow *)arg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_screen_get_monitor_at_window)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GdkScreen *, GdkWindow *))fp)((GdkScreen *)arg0, (GdkWindow *)arg1);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1get_1monitor_1at_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1get_1monitor_1geometry
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1screen_1get_1monitor_1geometry)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jobject arg2)
{
	GdkRectangle _arg2, *lparg2=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1get_1monitor_1geometry_FUNC);
	if (arg2) if ((lparg2 = &_arg2) == NULL) goto fail;
/*
	gdk_screen_get_monitor_geometry((GdkScreen *)arg0, arg1, lparg2);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_screen_get_monitor_geometry)
		if (fp) {
			((void (CALLING_CONVENTION*)(GdkScreen *, jint, GdkRectangle *))fp)((GdkScreen *)arg0, arg1, lparg2);
		}
	}
fail:
	if (arg2 && lparg2) setGdkRectangleFields(env, arg2, lparg2);
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1get_1monitor_1geometry_FUNC);
}
#endif

#ifndef NO_gdk_1screen_1get_1monitor_1scale_1factor
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1screen_1get_1monitor_1scale_1factor)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1get_1monitor_1scale_1factor_FUNC);
/*
	rc = (jint)gdk_screen_get_monitor_scale_factor((GdkScreen *)arg0, (gint)arg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_screen_get_monitor_scale_factor)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GdkScreen *, gint))fp)((GdkScreen *)arg0, (gint)arg1);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1get_1monitor_1scale_1factor_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1get_1monitor_1workarea
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1screen_1get_1monitor_1workarea)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jobject arg2)
{
	GdkRectangle _arg2, *lparg2=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1get_1monitor_1workarea_FUNC);
	if (arg2) if ((lparg2 = &_arg2) == NULL) goto fail;
/*
	gdk_screen_get_monitor_workarea((GdkScreen *)arg0, arg1, lparg2);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_screen_get_monitor_workarea)
		if (fp) {
			((void (CALLING_CONVENTION*)(GdkScreen *, jint, GdkRectangle *))fp)((GdkScreen *)arg0, arg1, lparg2);
		}
	}
fail:
	if (arg2 && lparg2) setGdkRectangleFields(env, arg2, lparg2);
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1get_1monitor_1workarea_FUNC);
}
#endif

#ifndef NO_gdk_1screen_1get_1n_1monitors
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1screen_1get_1n_1monitors)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1get_1n_1monitors_FUNC);
/*
	rc = (jint)gdk_screen_get_n_monitors((GdkScreen *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_screen_get_n_monitors)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GdkScreen *))fp)((GdkScreen *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1get_1n_1monitors_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1get_1primary_1monitor
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1screen_1get_1primary_1monitor)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1get_1primary_1monitor_FUNC);
/*
	rc = (jint)gdk_screen_get_primary_monitor((GdkScreen *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_screen_get_primary_monitor)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GdkScreen *))fp)((GdkScreen *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1get_1primary_1monitor_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1get_1resolution
JNIEXPORT jdouble JNICALL GDK_NATIVE(gdk_1screen_1get_1resolution)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1get_1resolution_FUNC);
	rc = (jdouble)gdk_screen_get_resolution((GdkScreen *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1get_1resolution_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1get_1system_1visual
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1screen_1get_1system_1visual)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1get_1system_1visual_FUNC);
	rc = (jlong)gdk_screen_get_system_visual((GdkScreen *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1get_1system_1visual_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1height
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1screen_1height)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1height_FUNC);
/*
	rc = (jint)gdk_screen_height();
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_screen_height)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)())fp)();
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1height_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1is_1composited
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1screen_1is_1composited)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1is_1composited_FUNC);
	rc = (jboolean)gdk_screen_is_composited((GdkScreen *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1is_1composited_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1screen_1width
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1screen_1width)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1screen_1width_FUNC);
/*
	rc = (jint)gdk_screen_width();
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_screen_width)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)())fp)();
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1screen_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1scroll_1event_1get_1deltas
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1scroll_1event_1get_1deltas)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1, jdoubleArray arg2)
{
	jdouble *lparg1=NULL;
	jdouble *lparg2=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1scroll_1event_1get_1deltas_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gdk_scroll_event_get_deltas((GdkEvent *)arg0, lparg1, lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1scroll_1event_1get_1deltas_FUNC);
}
#endif

#ifndef NO_gdk_1scroll_1event_1get_1direction
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1scroll_1event_1get_1direction)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1scroll_1event_1get_1direction_FUNC);
	rc = (jint)gdk_scroll_event_get_direction((GdkEvent *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1scroll_1event_1get_1direction_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1seat_1get_1keyboard
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1seat_1get_1keyboard)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1seat_1get_1keyboard_FUNC);
/*
	rc = (jlong)gdk_seat_get_keyboard(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_seat_get_keyboard)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1seat_1get_1keyboard_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1seat_1get_1pointer
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1seat_1get_1pointer)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1seat_1get_1pointer_FUNC);
/*
	rc = (jlong)gdk_seat_get_pointer(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_seat_get_pointer)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1seat_1get_1pointer_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1seat_1grab
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1seat_1grab)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jboolean arg3, jlong arg4, jlong arg5, jlong arg6, jlong arg7)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1seat_1grab_FUNC);
/*
	rc = (jint)gdk_seat_grab(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_seat_grab)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(jlong, jlong, jint, jboolean, jlong, jlong, jlong, jlong))fp)(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1seat_1grab_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1seat_1ungrab
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1seat_1ungrab)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1seat_1ungrab_FUNC);
/*
	gdk_seat_ungrab(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_seat_ungrab)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1seat_1ungrab_FUNC);
}
#endif

#ifndef NO_gdk_1selection_1owner_1get
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1selection_1owner_1get)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1selection_1owner_1get_FUNC);
	gdk_selection_owner_get((GdkAtom)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1selection_1owner_1get_FUNC);
}
#endif

#ifndef NO_gdk_1selection_1owner_1set
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1selection_1owner_1set)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jboolean arg3)
{
	GDK_NATIVE_ENTER(env, that, gdk_1selection_1owner_1set_FUNC);
	gdk_selection_owner_set((GdkWindow *)arg0, (GdkAtom)arg1, (guint32)arg2, (gboolean)arg3);
	GDK_NATIVE_EXIT(env, that, gdk_1selection_1owner_1set_FUNC);
}
#endif

#ifndef NO_gdk_1set_1program_1class
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1set_1program_1class)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1set_1program_1class_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
/*
	gdk_set_program_class((const char *)lparg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_set_program_class)
		if (fp) {
			((void (CALLING_CONVENTION*)(const char *))fp)((const char *)lparg0);
		}
	}
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1set_1program_1class_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1create_1similar_1surface
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1surface_1create_1similar_1surface)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1create_1similar_1surface_FUNC);
	rc = (jlong)gdk_surface_create_similar_surface((GdkSurface *)arg0, (cairo_content_t)arg1, arg2, arg3);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1create_1similar_1surface_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1surface_1destroy
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1destroy)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1destroy_FUNC);
	gdk_surface_destroy((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1destroy_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1get_1device_1position
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1get_1device_1position)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdoubleArray arg2, jdoubleArray arg3, jintArray arg4)
{
	jdouble *lparg2=NULL;
	jdouble *lparg3=NULL;
	jint *lparg4=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1get_1device_1position_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetDoubleArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	gdk_surface_get_device_position((GdkSurface *)arg0, (GdkDevice *)arg1, (double *)lparg2, (double *)lparg3, (GdkModifierType *)lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseDoubleArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1get_1device_1position_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1get_1display
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1surface_1get_1display)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1get_1display_FUNC);
	rc = (jlong)gdk_surface_get_display((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1get_1display_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1surface_1get_1height
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1surface_1get_1height)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1get_1height_FUNC);
	rc = (jint)gdk_surface_get_height((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1get_1height_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1surface_1get_1width
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1surface_1get_1width)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1get_1width_FUNC);
	rc = (jint)gdk_surface_get_width((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1get_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1surface_1hide
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1hide)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1hide_FUNC);
	gdk_surface_hide((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1hide_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1new_1popup
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1surface_1new_1popup)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1new_1popup_FUNC);
	rc = (jlong)gdk_surface_new_popup((GdkSurface *)arg0, arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1new_1popup_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1surface_1new_1toplevel
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1surface_1new_1toplevel)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1new_1toplevel_FUNC);
/*
	rc = (jlong)gdk_surface_new_toplevel((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_surface_new_toplevel)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1new_1toplevel_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1surface_1set_1cursor
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1set_1cursor)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1set_1cursor_FUNC);
	gdk_surface_set_cursor((GdkSurface *)arg0, (GdkCursor *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1set_1cursor_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1set_1input_1region
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1set_1input_1region)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1set_1input_1region_FUNC);
	gdk_surface_set_input_region((GdkSurface *)arg0, (cairo_region_t *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1set_1input_1region_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1set_1opaque_1region
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1set_1opaque_1region)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1set_1opaque_1region_FUNC);
	gdk_surface_set_opaque_region((GdkSurface *)arg0, (cairo_region_t *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1set_1opaque_1region_FUNC);
}
#endif

#ifndef NO_gdk_1text_1property_1to_1utf8_1list_1for_1display
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1text_1property_1to_1utf8_1list_1for_1display)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jlong arg3, jint arg4, jlongArray arg5)
{
	jlong *lparg5=NULL;
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1text_1property_1to_1utf8_1list_1for_1display_FUNC);
	if (arg5) if ((lparg5 = (*env)->GetLongArrayElements(env, arg5, NULL)) == NULL) goto fail;
	rc = (jint)gdk_text_property_to_utf8_list_for_display((GdkDisplay *)arg0, (GdkAtom)arg1, arg2, (guchar *)arg3, arg4, (gchar ***)lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseLongArrayElements(env, arg5, lparg5, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1text_1property_1to_1utf8_1list_1for_1display_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1texture_1new_1for_1pixbuf
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1texture_1new_1for_1pixbuf)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1texture_1new_1for_1pixbuf_FUNC);
	rc = (jlong)gdk_texture_new_for_pixbuf((GdkPixbuf *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1texture_1new_1for_1pixbuf_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1texture_1new_1from_1file
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1texture_1new_1from_1file)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1texture_1new_1from_1file_FUNC);
	rc = (jlong)gdk_texture_new_from_file((GFile *)arg0, (GError **)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1texture_1new_1from_1file_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1threads_1add_1idle
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1threads_1add_1idle)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1threads_1add_1idle_FUNC);
	rc = (jint)gdk_threads_add_idle((GSourceFunc)arg0, (gpointer)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1threads_1add_1idle_FUNC);
	return rc;
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_gdk_1threads_1add_1timeout
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1threads_1add_1timeout)
	(JNIEnv *env, jclass that, jint arg0, jlong arg1, jlong arg2)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1threads_1add_1timeout_FUNC);
	rc = (jint)gdk_threads_add_timeout(arg0, (GSourceFunc)arg1, (gpointer)arg2);
	GDK_NATIVE_EXIT(env, that, gdk_1threads_1add_1timeout_FUNC);
	return rc;
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_gdk_1threads_1enter
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1threads_1enter)
	(JNIEnv *env, jclass that)
{
	GDK_NATIVE_ENTER(env, that, gdk_1threads_1enter_FUNC);
	gdk_threads_enter();
	GDK_NATIVE_EXIT(env, that, gdk_1threads_1enter_FUNC);
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_gdk_1threads_1init
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1threads_1init)
	(JNIEnv *env, jclass that)
{
	GDK_NATIVE_ENTER(env, that, gdk_1threads_1init_FUNC);
	gdk_threads_init();
	GDK_NATIVE_EXIT(env, that, gdk_1threads_1init_FUNC);
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_gdk_1threads_1leave
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1threads_1leave)
	(JNIEnv *env, jclass that)
{
	GDK_NATIVE_ENTER(env, that, gdk_1threads_1leave_FUNC);
	gdk_threads_leave();
	GDK_NATIVE_EXIT(env, that, gdk_1threads_1leave_FUNC);
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_gdk_1toplevel_1layout_1new
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1toplevel_1layout_1new)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1toplevel_1layout_1new_FUNC);
/*
	rc = (jlong)gdk_toplevel_layout_new(arg0, arg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_toplevel_layout_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jint, jint))fp)(arg0, arg1);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1toplevel_1layout_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1toplevel_1present
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1toplevel_1present)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jlong arg3)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1toplevel_1present_FUNC);
/*
	rc = (jboolean)gdk_toplevel_present((GdkToplevel *)arg0, arg1, arg2, (GdkToplevelLayout *)arg3);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_toplevel_present)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GdkToplevel *, jint, jint, GdkToplevelLayout *))fp)((GdkToplevel *)arg0, arg1, arg2, (GdkToplevelLayout *)arg3);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1toplevel_1present_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1unicode_1to_1keyval
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1unicode_1to_1keyval)
	(JNIEnv *env, jclass that, jint arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1unicode_1to_1keyval_FUNC);
	rc = (jint)gdk_unicode_to_keyval(arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1unicode_1to_1keyval_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1utf8_1to_1string_1target
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1utf8_1to_1string_1target)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1utf8_1to_1string_1target_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
/*
	rc = (jlong)gdk_utf8_to_string_target((const gchar *)lparg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_utf8_to_string_target)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(const gchar *))fp)((const gchar *)lparg0);
		}
	}
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1utf8_1to_1string_1target_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1visual_1get_1depth
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1visual_1get_1depth)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1visual_1get_1depth_FUNC);
	rc = (jint)gdk_visual_get_depth((GdkVisual *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1visual_1get_1depth_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1create_1similar_1surface
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1window_1create_1similar_1surface)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1create_1similar_1surface_FUNC);
	rc = (jlong)gdk_window_create_similar_surface((GdkWindow *)arg0, (cairo_content_t)arg1, arg2, arg3);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1create_1similar_1surface_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1destroy
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1destroy)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1destroy_FUNC);
	gdk_window_destroy((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1destroy_FUNC);
}
#endif

#ifndef NO_gdk_1window_1focus
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1focus)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1focus_FUNC);
	gdk_window_focus((GdkWindow *)arg0, arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1focus_FUNC);
}
#endif

#ifndef NO_gdk_1window_1get_1children
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1window_1get_1children)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1children_FUNC);
	rc = (jlong)gdk_window_get_children((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1children_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1get_1device_1position
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1window_1get_1device_1position)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jintArray arg2, jintArray arg3, jintArray arg4)
{
	jint *lparg2=NULL;
	jint *lparg3=NULL;
	jint *lparg4=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1device_1position_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	rc = (jlong)gdk_window_get_device_position((GdkWindow *)arg0, (GdkDevice *)arg1, (gint *)lparg2, (gint *)lparg3, (GdkModifierType *)lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1device_1position_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1get_1display
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1window_1get_1display)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1display_FUNC);
	rc = (jlong)gdk_window_get_display((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1display_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1get_1events
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1window_1get_1events)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1events_FUNC);
	rc = (jint)gdk_window_get_events((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1events_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1get_1frame_1extents
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1get_1frame_1extents)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1frame_1extents_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
	gdk_window_get_frame_extents((GdkWindow *)arg0, (GdkRectangle *)lparg1);
fail:
	if (arg1 && lparg1) setGdkRectangleFields(env, arg1, lparg1);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1frame_1extents_FUNC);
}
#endif

#ifndef NO_gdk_1window_1get_1height
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1window_1get_1height)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1height_FUNC);
	rc = (jint)gdk_window_get_height((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1height_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1get_1origin
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1window_1get_1origin)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1origin_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jint)gdk_window_get_origin((GdkWindow *)arg0, (gint *)lparg1, (gint *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1origin_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1get_1parent
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1window_1get_1parent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1parent_FUNC);
	rc = (jlong)gdk_window_get_parent((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1parent_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1get_1root_1origin
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1get_1root_1origin)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1root_1origin_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gdk_window_get_root_origin((GdkWindow *)arg0, (gint *)lparg1, (gint *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1root_1origin_FUNC);
}
#endif

#ifndef NO_gdk_1window_1get_1state
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1window_1get_1state)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1state_FUNC);
	rc = (jint)gdk_window_get_state((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1state_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1get_1user_1data
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1get_1user_1data)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1user_1data_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gdk_window_get_user_data((GdkWindow *)arg0, (gpointer *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1user_1data_FUNC);
}
#endif

#ifndef NO_gdk_1window_1get_1visible_1region
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1window_1get_1visible_1region)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1visible_1region_FUNC);
	rc = (jlong)gdk_window_get_visible_region((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1visible_1region_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1get_1width
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1window_1get_1width)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1get_1width_FUNC);
	rc = (jint)gdk_window_get_width((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1get_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1hide
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1hide)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1hide_FUNC);
	gdk_window_hide((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1hide_FUNC);
}
#endif

#ifndef NO_gdk_1window_1invalidate_1rect
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1invalidate_1rect)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jboolean arg2)
{
	GdkRectangle _arg1, *lparg1=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1invalidate_1rect_FUNC);
	if (arg1) if ((lparg1 = getGdkRectangleFields(env, arg1, &_arg1)) == NULL) goto fail;
	gdk_window_invalidate_rect((GdkWindow *)arg0, (GdkRectangle *)lparg1, (gboolean)arg2);
fail:
	GDK_NATIVE_EXIT(env, that, gdk_1window_1invalidate_1rect_FUNC);
}
#endif

#ifndef NO_gdk_1window_1invalidate_1region
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1invalidate_1region)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1invalidate_1region_FUNC);
	gdk_window_invalidate_region((GdkWindow *)arg0, (const cairo_region_t *)arg1, (gboolean)arg2);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1invalidate_1region_FUNC);
}
#endif

#ifndef NO_gdk_1window_1lower
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1lower)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1lower_FUNC);
	gdk_window_lower((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1lower_FUNC);
}
#endif

#ifndef NO_gdk_1window_1move
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1move)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1move_FUNC);
	gdk_window_move((GdkWindow *)arg0, arg1, arg2);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1move_FUNC);
}
#endif

#ifndef NO_gdk_1window_1move_1resize
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1move_1resize)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jint arg4)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1move_1resize_FUNC);
	gdk_window_move_resize((GdkWindow *)arg0, arg1, arg2, arg3, arg4);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1move_1resize_FUNC);
}
#endif

#ifndef NO_gdk_1window_1new
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1window_1new)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	GdkWindowAttr _arg1, *lparg1=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1window_1new_FUNC);
	if (arg1) if ((lparg1 = getGdkWindowAttrFields(env, arg1, &_arg1)) == NULL) goto fail;
	rc = (jlong)gdk_window_new((GdkWindow *)arg0, lparg1, arg2);
fail:
	GDK_NATIVE_EXIT(env, that, gdk_1window_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1window_1raise
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1raise)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1raise_FUNC);
	gdk_window_raise((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1raise_FUNC);
}
#endif

#ifndef NO_gdk_1window_1resize
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1resize)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1resize_FUNC);
	gdk_window_resize((GdkWindow *)arg0, arg1, arg2);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1resize_FUNC);
}
#endif

#ifndef NO_gdk_1window_1restack
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1restack)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1restack_FUNC);
	gdk_window_restack((GdkWindow *)arg0, (GdkWindow *)arg1, (gboolean)arg2);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1restack_FUNC);
}
#endif

#ifndef NO_gdk_1window_1set_1background_1pattern
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1set_1background_1pattern)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1set_1background_1pattern_FUNC);
	gdk_window_set_background_pattern((GdkWindow *)arg0, (cairo_pattern_t *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1set_1background_1pattern_FUNC);
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_gdk_1window_1set_1cursor
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1set_1cursor)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1set_1cursor_FUNC);
	gdk_window_set_cursor((GdkWindow *)arg0, (GdkCursor *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1set_1cursor_FUNC);
}
#endif

#ifndef NO_gdk_1window_1set_1decorations
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1set_1decorations)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1set_1decorations_FUNC);
	gdk_window_set_decorations((GdkWindow *)arg0, (GdkWMDecoration)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1set_1decorations_FUNC);
}
#endif

#ifndef NO_gdk_1window_1set_1events
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1set_1events)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1set_1events_FUNC);
	gdk_window_set_events((GdkWindow *)arg0, arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1set_1events_FUNC);
}
#endif

#ifndef NO_gdk_1window_1set_1functions
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1set_1functions)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1set_1functions_FUNC);
	gdk_window_set_functions((GdkWindow *)arg0, (GdkWMFunction)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1set_1functions_FUNC);
}
#endif

#ifndef NO_gdk_1window_1set_1override_1redirect
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1set_1override_1redirect)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1set_1override_1redirect_FUNC);
	gdk_window_set_override_redirect((GdkWindow *)arg0, (gboolean)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1set_1override_1redirect_FUNC);
}
#endif

#ifndef NO_gdk_1window_1set_1user_1data
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1set_1user_1data)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1set_1user_1data_FUNC);
	gdk_window_set_user_data((GdkWindow *)arg0, (gpointer)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1set_1user_1data_FUNC);
}
#endif

#ifndef NO_gdk_1window_1show
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1show)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1show_FUNC);
	gdk_window_show((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1show_FUNC);
}
#endif

#ifndef NO_gdk_1window_1show_1unraised
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1window_1show_1unraised)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1window_1show_1unraised_FUNC);
	gdk_window_show_unraised((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1window_1show_1unraised_FUNC);
}
#endif

#ifndef NO_gdk_1x11_1display_1error_1trap_1pop_1ignored
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1x11_1display_1error_1trap_1pop_1ignored)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1display_1error_1trap_1pop_1ignored_FUNC);
	gdk_x11_display_error_trap_pop_ignored((GdkDisplay *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1display_1error_1trap_1pop_1ignored_FUNC);
}
#endif

#ifndef NO_gdk_1x11_1display_1error_1trap_1push
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1x11_1display_1error_1trap_1push)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1display_1error_1trap_1push_FUNC);
	gdk_x11_display_error_trap_push((GdkDisplay *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1display_1error_1trap_1push_FUNC);
}
#endif

#ifndef NO_gdk_1x11_1display_1get_1default_1group
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1x11_1display_1get_1default_1group)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1display_1get_1default_1group_FUNC);
/*
	rc = (jlong)gdk_x11_display_get_default_group((GdkDisplay *)arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_x11_display_get_default_group)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDisplay *))fp)((GdkDisplay *)arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1display_1get_1default_1group_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1x11_1display_1get_1xdisplay
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1x11_1display_1get_1xdisplay)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1display_1get_1xdisplay_FUNC);
	rc = (jlong)gdk_x11_display_get_xdisplay((GdkDisplay *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1display_1get_1xdisplay_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1x11_1display_1utf8_1to_1compound_1text
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1x11_1display_1utf8_1to_1compound_1text)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlongArray arg2, jintArray arg3, jlongArray arg4, jintArray arg5)
{
	jbyte *lparg1=NULL;
	jlong *lparg2=NULL;
	jint *lparg3=NULL;
	jlong *lparg4=NULL;
	jint *lparg5=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1display_1utf8_1to_1compound_1text_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetLongArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetIntArrayElements(env, arg5, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_x11_display_utf8_to_compound_text((GdkDisplay *)arg0, (const gchar*)lparg1, (GdkAtom *)lparg2, (gint *)lparg3, (guchar **)lparg4, (gint *)lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseIntArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseLongArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1display_1utf8_1to_1compound_1text_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1x11_1get_1default_1xdisplay
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1x11_1get_1default_1xdisplay)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1get_1default_1xdisplay_FUNC);
	rc = (jlong)gdk_x11_get_default_xdisplay();
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1get_1default_1xdisplay_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1x11_1screen_1get_1window_1manager_1name
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1x11_1screen_1get_1window_1manager_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1screen_1get_1window_1manager_1name_FUNC);
/*
	rc = (jlong)gdk_x11_screen_get_window_manager_name(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_x11_screen_get_window_manager_name)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1screen_1get_1window_1manager_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1x11_1screen_1lookup_1visual
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1x11_1screen_1lookup_1visual)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1screen_1lookup_1visual_FUNC);
/*
	rc = (jlong)gdk_x11_screen_lookup_visual(arg0, (VisualID)arg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_x11_screen_lookup_visual)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong, VisualID))fp)(arg0, (VisualID)arg1);
		}
	}
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1screen_1lookup_1visual_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1x11_1surface_1get_1xid
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1x11_1surface_1get_1xid)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1surface_1get_1xid_FUNC);
	rc = (jlong)gdk_x11_surface_get_xid((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1surface_1get_1xid_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1x11_1surface_1lookup_1for_1display
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1x11_1surface_1lookup_1for_1display)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1surface_1lookup_1for_1display_FUNC);
	rc = (jlong)gdk_x11_surface_lookup_for_display((GdkDisplay *)arg0, (Window)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1surface_1lookup_1for_1display_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1x11_1window_1get_1xid
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1x11_1window_1get_1xid)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1window_1get_1xid_FUNC);
	rc = (jlong)gdk_x11_window_get_xid((GdkWindow *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1window_1get_1xid_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1x11_1window_1lookup_1for_1display
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1x11_1window_1lookup_1for_1display)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1x11_1window_1lookup_1for_1display_FUNC);
	rc = (jlong)gdk_x11_window_lookup_for_display((GdkDisplay *)arg0, (Window)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1x11_1window_1lookup_1for_1display_FUNC);
	return rc;
}
#endif

#ifndef GTK_NATIVE
#define GTK_NATIVE(func) Java_org_eclipse_swt_internal_gtk_GTK_##func
#endif

#ifndef NO_GET_1FUNCTION_1POINTER_1gtk_1false
JNIEXPORT jlong JNICALL GTK_NATIVE(GET_1FUNCTION_1POINTER_1gtk_1false)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, GET_1FUNCTION_1POINTER_1gtk_1false_FUNC);
	rc = (jlong)GET_FUNCTION_POINTER_gtk_false();
	GTK_NATIVE_EXIT(env, that, GET_1FUNCTION_1POINTER_1gtk_1false_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1ACCEL_1LABEL
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1ACCEL_1LABEL)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1ACCEL_1LABEL_FUNC);
	rc = (jboolean)GTK_IS_ACCEL_LABEL(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1ACCEL_1LABEL_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1BOX
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1BOX)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1BOX_FUNC);
	rc = (jboolean)GTK_IS_BOX(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1BOX_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1BUTTON
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1BUTTON)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1BUTTON_FUNC);
	rc = (jboolean)GTK_IS_BUTTON(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1BUTTON_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1CELL_1RENDERER_1PIXBUF
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1CELL_1RENDERER_1PIXBUF)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1CELL_1RENDERER_1PIXBUF_FUNC);
	rc = (jboolean)GTK_IS_CELL_RENDERER_PIXBUF(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1CELL_1RENDERER_1PIXBUF_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1CELL_1RENDERER_1TEXT
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1CELL_1RENDERER_1TEXT)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1CELL_1RENDERER_1TEXT_FUNC);
	rc = (jboolean)GTK_IS_CELL_RENDERER_TEXT(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1CELL_1RENDERER_1TEXT_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1CELL_1RENDERER_1TOGGLE
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1CELL_1RENDERER_1TOGGLE)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1CELL_1RENDERER_1TOGGLE_FUNC);
	rc = (jboolean)GTK_IS_CELL_RENDERER_TOGGLE(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1CELL_1RENDERER_1TOGGLE_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1CONTAINER
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1CONTAINER)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1CONTAINER_FUNC);
	rc = (jboolean)GTK_IS_CONTAINER(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1CONTAINER_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1IM_1CONTEXT
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1IM_1CONTEXT)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1IM_1CONTEXT_FUNC);
	rc = (jboolean)GTK_IS_IM_CONTEXT(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1IM_1CONTEXT_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1LABEL
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1LABEL)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1LABEL_FUNC);
	rc = (jboolean)GTK_IS_LABEL(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1LABEL_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1PLUG
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1PLUG)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1PLUG_FUNC);
	rc = (jboolean)GTK_IS_PLUG(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1PLUG_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1SCROLLED_1WINDOW
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1SCROLLED_1WINDOW)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1SCROLLED_1WINDOW_FUNC);
	rc = (jboolean)GTK_IS_SCROLLED_WINDOW(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1SCROLLED_1WINDOW_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1IS_1WINDOW
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1WINDOW)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1WINDOW_FUNC);
	rc = (jboolean)GTK_IS_WINDOW(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1WINDOW_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1TYPE_1CELL_1RENDERER_1PIXBUF
JNIEXPORT jlong JNICALL GTK_NATIVE(GTK_1TYPE_1CELL_1RENDERER_1PIXBUF)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1TYPE_1CELL_1RENDERER_1PIXBUF_FUNC);
	rc = (jlong)GTK_TYPE_CELL_RENDERER_PIXBUF;
	GTK_NATIVE_EXIT(env, that, GTK_1TYPE_1CELL_1RENDERER_1PIXBUF_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1TYPE_1CELL_1RENDERER_1TEXT
JNIEXPORT jlong JNICALL GTK_NATIVE(GTK_1TYPE_1CELL_1RENDERER_1TEXT)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1TYPE_1CELL_1RENDERER_1TEXT_FUNC);
	rc = (jlong)GTK_TYPE_CELL_RENDERER_TEXT;
	GTK_NATIVE_EXIT(env, that, GTK_1TYPE_1CELL_1RENDERER_1TEXT_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1TYPE_1CELL_1RENDERER_1TOGGLE
JNIEXPORT jlong JNICALL GTK_NATIVE(GTK_1TYPE_1CELL_1RENDERER_1TOGGLE)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1TYPE_1CELL_1RENDERER_1TOGGLE_FUNC);
	rc = (jlong)GTK_TYPE_CELL_RENDERER_TOGGLE;
	GTK_NATIVE_EXIT(env, that, GTK_1TYPE_1CELL_1RENDERER_1TOGGLE_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1TYPE_1IM_1MULTICONTEXT
JNIEXPORT jlong JNICALL GTK_NATIVE(GTK_1TYPE_1IM_1MULTICONTEXT)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1TYPE_1IM_1MULTICONTEXT_FUNC);
	rc = (jlong)GTK_TYPE_IM_MULTICONTEXT;
	GTK_NATIVE_EXIT(env, that, GTK_1TYPE_1IM_1MULTICONTEXT_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1TYPE_1TEXT_1VIEW_1ACCESSIBLE
JNIEXPORT jlong JNICALL GTK_NATIVE(GTK_1TYPE_1TEXT_1VIEW_1ACCESSIBLE)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1TYPE_1TEXT_1VIEW_1ACCESSIBLE_FUNC);
	rc = (jlong)GTK_TYPE_TEXT_VIEW_ACCESSIBLE;
	GTK_NATIVE_EXIT(env, that, GTK_1TYPE_1TEXT_1VIEW_1ACCESSIBLE_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1TYPE_1WIDGET
JNIEXPORT jlong JNICALL GTK_NATIVE(GTK_1TYPE_1WIDGET)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1TYPE_1WIDGET_FUNC);
	rc = (jlong)GTK_TYPE_WIDGET;
	GTK_NATIVE_EXIT(env, that, GTK_1TYPE_1WIDGET_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1TYPE_1WINDOW
JNIEXPORT jlong JNICALL GTK_NATIVE(GTK_1TYPE_1WINDOW)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1TYPE_1WINDOW_FUNC);
	rc = (jlong)GTK_TYPE_WINDOW;
	GTK_NATIVE_EXIT(env, that, GTK_1TYPE_1WINDOW_FUNC);
	return rc;
}
#endif

#ifndef NO_GTK_1WIDGET_1GET_1CLASS
JNIEXPORT jlong JNICALL GTK_NATIVE(GTK_1WIDGET_1GET_1CLASS)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1WIDGET_1GET_1CLASS_FUNC);
	rc = (jlong)GTK_WIDGET_GET_CLASS((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1WIDGET_1GET_1CLASS_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkAllocation_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkAllocation_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkAllocation_1sizeof_FUNC);
	rc = (jint)GtkAllocation_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkAllocation_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkBorder_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkBorder_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkBorder_1sizeof_FUNC);
	rc = (jint)GtkBorder_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkBorder_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkCellRendererPixbufClass_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkCellRendererPixbufClass_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkCellRendererPixbufClass_1sizeof_FUNC);
	rc = (jint)GtkCellRendererPixbufClass_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkCellRendererPixbufClass_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkCellRendererPixbuf_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkCellRendererPixbuf_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkCellRendererPixbuf_1sizeof_FUNC);
	rc = (jint)GtkCellRendererPixbuf_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkCellRendererPixbuf_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkCellRendererTextClass_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkCellRendererTextClass_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkCellRendererTextClass_1sizeof_FUNC);
	rc = (jint)GtkCellRendererTextClass_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkCellRendererTextClass_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkCellRendererText_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkCellRendererText_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkCellRendererText_1sizeof_FUNC);
	rc = (jint)GtkCellRendererText_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkCellRendererText_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkCellRendererToggleClass_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkCellRendererToggleClass_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkCellRendererToggleClass_1sizeof_FUNC);
	rc = (jint)GtkCellRendererToggleClass_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkCellRendererToggleClass_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkCellRendererToggle_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkCellRendererToggle_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkCellRendererToggle_1sizeof_FUNC);
	rc = (jint)GtkCellRendererToggle_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkCellRendererToggle_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkRequisition_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkRequisition_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkRequisition_1sizeof_FUNC);
	rc = (jint)GtkRequisition_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkRequisition_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkTargetEntry_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkTargetEntry_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkTargetEntry_1sizeof_FUNC);
	rc = (jint)GtkTargetEntry_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkTargetEntry_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkTextIter_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkTextIter_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkTextIter_1sizeof_FUNC);
	rc = (jint)GtkTextIter_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkTextIter_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GtkTreeIter_1sizeof
JNIEXPORT jint JNICALL GTK_NATIVE(GtkTreeIter_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, GtkTreeIter_1sizeof_FUNC);
	rc = (jint)GtkTreeIter_sizeof();
	GTK_NATIVE_EXIT(env, that, GtkTreeIter_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1accel_1group_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1accel_1group_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1accel_1group_1new_FUNC);
/*
	rc = (jlong)gtk_accel_group_new();
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_accel_group_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1accel_1group_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1accelerator_1get_1default_1mod_1mask
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1accelerator_1get_1default_1mod_1mask)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1accelerator_1get_1default_1mod_1mask_FUNC);
	rc = (jint)gtk_accelerator_get_default_mod_mask();
	GTK_NATIVE_EXIT(env, that, gtk_1accelerator_1get_1default_1mod_1mask_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1accelerator_1name
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1accelerator_1name)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1accelerator_1name_FUNC);
	rc = (jlong)gtk_accelerator_name((guint)arg0, (GdkModifierType)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1accelerator_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1accelerator_1parse__J_3I_3I
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1accelerator_1parse__J_3I_3I)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1accelerator_1parse__J_3I_3I_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_accelerator_parse((const gchar *)arg0, (guint *)lparg1, (GdkModifierType *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1accelerator_1parse__J_3I_3I_FUNC);
}
#endif

#ifndef NO_gtk_1accelerator_1parse___3B_3I_3I
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1accelerator_1parse___3B_3I_3I)
	(JNIEnv *env, jclass that, jbyteArray arg0, jintArray arg1, jintArray arg2)
{
	jbyte *lparg0=NULL;
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1accelerator_1parse___3B_3I_3I_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_accelerator_parse((const gchar *)lparg0, (guint *)lparg1, (GdkModifierType *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1accelerator_1parse___3B_3I_3I_FUNC);
}
#endif

#ifndef NO_gtk_1accessible_1get_1widget
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1accessible_1get_1widget)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1accessible_1get_1widget_FUNC);
/*
	rc = (jlong)gtk_accessible_get_widget((GtkAccessible *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_accessible_get_widget)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkAccessible *))fp)((GtkAccessible *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1accessible_1get_1widget_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1adjustment_1configure
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1adjustment_1configure)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jdouble arg2, jdouble arg3, jdouble arg4, jdouble arg5, jdouble arg6)
{
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1configure_FUNC);
	gtk_adjustment_configure((GtkAdjustment *)arg0, arg1, arg2, arg3, arg4, arg5, arg6);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1configure_FUNC);
}
#endif

#ifndef NO_gtk_1adjustment_1get_1lower
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1adjustment_1get_1lower)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1get_1lower_FUNC);
	rc = (jdouble)gtk_adjustment_get_lower((GtkAdjustment *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1get_1lower_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1adjustment_1get_1page_1increment
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1adjustment_1get_1page_1increment)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1get_1page_1increment_FUNC);
	rc = (jdouble)gtk_adjustment_get_page_increment((GtkAdjustment *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1get_1page_1increment_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1adjustment_1get_1page_1size
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1adjustment_1get_1page_1size)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1get_1page_1size_FUNC);
	rc = (jdouble)gtk_adjustment_get_page_size((GtkAdjustment *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1get_1page_1size_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1adjustment_1get_1step_1increment
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1adjustment_1get_1step_1increment)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1get_1step_1increment_FUNC);
	rc = (jdouble)gtk_adjustment_get_step_increment((GtkAdjustment *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1get_1step_1increment_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1adjustment_1get_1upper
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1adjustment_1get_1upper)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1get_1upper_FUNC);
	rc = (jdouble)gtk_adjustment_get_upper((GtkAdjustment *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1get_1upper_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1adjustment_1get_1value
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1adjustment_1get_1value)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1get_1value_FUNC);
	rc = (jdouble)gtk_adjustment_get_value((GtkAdjustment *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1get_1value_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1adjustment_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1adjustment_1new)
	(JNIEnv *env, jclass that, jdouble arg0, jdouble arg1, jdouble arg2, jdouble arg3, jdouble arg4, jdouble arg5)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1new_FUNC);
	rc = (jlong)gtk_adjustment_new((gdouble)arg0, (gdouble)arg1, (gdouble)arg2, (gdouble)arg3, (gdouble)arg4, arg5);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1adjustment_1set_1page_1increment
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1adjustment_1set_1page_1increment)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1set_1page_1increment_FUNC);
	gtk_adjustment_set_page_increment((GtkAdjustment *)arg0, (gdouble)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1set_1page_1increment_FUNC);
}
#endif

#ifndef NO_gtk_1adjustment_1set_1step_1increment
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1adjustment_1set_1step_1increment)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1set_1step_1increment_FUNC);
	gtk_adjustment_set_step_increment((GtkAdjustment *)arg0, (gdouble)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1set_1step_1increment_FUNC);
}
#endif

#ifndef NO_gtk_1adjustment_1set_1value
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1adjustment_1set_1value)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1adjustment_1set_1value_FUNC);
	gtk_adjustment_set_value((GtkAdjustment *)arg0, (gdouble)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1adjustment_1set_1value_FUNC);
}
#endif

#ifndef NO_gtk_1border_1free
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1border_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1border_1free_FUNC);
	gtk_border_free((GtkBorder *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1border_1free_FUNC);
}
#endif

#ifndef NO_gtk_1box_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1box_1new)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1box_1new_FUNC);
	rc = (jlong)gtk_box_new((GtkOrientation)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1box_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1box_1set_1homogeneous
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1box_1set_1homogeneous)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1box_1set_1homogeneous_FUNC);
	gtk_box_set_homogeneous((GtkBox *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1box_1set_1homogeneous_FUNC);
}
#endif

#ifndef NO_gtk_1box_1set_1spacing
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1box_1set_1spacing)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1box_1set_1spacing_FUNC);
	gtk_box_set_spacing((GtkBox *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1box_1set_1spacing_FUNC);
}
#endif

#ifndef NO_gtk_1button_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1button_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1button_1new_FUNC);
	rc = (jlong)gtk_button_new();
	GTK_NATIVE_EXIT(env, that, gtk_1button_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1button_1set_1label
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1button_1set_1label)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1button_1set_1label_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	gtk_button_set_label((GtkButton *)arg0, (const char *)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_button_set_label)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkButton *, const char *))fp)((GtkButton *)arg0, (const char *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1button_1set_1label_FUNC);
}
#endif

#ifndef NO_gtk_1button_1set_1use_1underline
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1button_1set_1use_1underline)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1button_1set_1use_1underline_FUNC);
	gtk_button_set_use_underline((GtkButton *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1button_1set_1use_1underline_FUNC);
}
#endif

#ifndef NO_gtk_1calendar_1clear_1marks
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1clear_1marks)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1clear_1marks_FUNC);
	gtk_calendar_clear_marks((GtkCalendar *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1clear_1marks_FUNC);
}
#endif

#ifndef NO_gtk_1calendar_1mark_1day
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1mark_1day)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1mark_1day_FUNC);
	gtk_calendar_mark_day((GtkCalendar *)arg0, (guint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1mark_1day_FUNC);
}
#endif

#ifndef NO_gtk_1calendar_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1calendar_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1new_FUNC);
	rc = (jlong)gtk_calendar_new();
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1cell_1layout_1clear
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1cell_1layout_1clear)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1layout_1clear_FUNC);
	gtk_cell_layout_clear((GtkCellLayout *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1layout_1clear_FUNC);
}
#endif

#ifndef NO_gtk_1cell_1layout_1get_1cells
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1cell_1layout_1get_1cells)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1layout_1get_1cells_FUNC);
	rc = (jlong)gtk_cell_layout_get_cells((GtkCellLayout *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1layout_1get_1cells_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1cell_1layout_1pack_1start
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1cell_1layout_1pack_1start)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1layout_1pack_1start_FUNC);
	gtk_cell_layout_pack_start((GtkCellLayout *)arg0, (GtkCellRenderer *)arg1, arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1layout_1pack_1start_FUNC);
}
#endif

#ifndef NO_gtk_1cell_1layout_1set_1attributes
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1cell_1layout_1set_1attributes)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jbyteArray arg2, jint arg3, jlong arg4)
{
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1layout_1set_1attributes_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_cell_layout_set_attributes((GtkCellLayout *)arg0, (GtkCellRenderer *)arg1, lparg2, arg3, (const gchar *)NULL);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1layout_1set_1attributes_FUNC);
}
#endif

#ifndef NO_gtk_1cell_1renderer_1get_1fixed_1size
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1cell_1renderer_1get_1fixed_1size)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1renderer_1get_1fixed_1size_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_cell_renderer_get_fixed_size((GtkCellRenderer *)arg0, (gint *)lparg1, (gint *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1renderer_1get_1fixed_1size_FUNC);
}
#endif

#ifndef NO_gtk_1cell_1renderer_1get_1padding
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1cell_1renderer_1get_1padding)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1renderer_1get_1padding_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_cell_renderer_get_padding((GtkCellRenderer *)arg0, (gint *)lparg1, (gint *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1renderer_1get_1padding_FUNC);
}
#endif

#ifndef NO_gtk_1cell_1renderer_1get_1preferred_1height_1for_1width
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1cell_1renderer_1get_1preferred_1height_1for_1width)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jintArray arg3, jintArray arg4)
{
	jint *lparg3=NULL;
	jint *lparg4=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1renderer_1get_1preferred_1height_1for_1width_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	gtk_cell_renderer_get_preferred_height_for_width((GtkCellRenderer *)arg0, (GtkWidget *)arg1, (gint)arg2, (gint *)lparg3, (gint *)lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1renderer_1get_1preferred_1height_1for_1width_FUNC);
}
#endif

#ifndef NO_gtk_1cell_1renderer_1get_1preferred_1size
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1cell_1renderer_1get_1preferred_1size)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jobject arg3)
{
	GtkRequisition _arg2, *lparg2=NULL;
	GtkRequisition _arg3, *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1renderer_1get_1preferred_1size_FUNC);
	if (arg2) if ((lparg2 = getGtkRequisitionFields(env, arg2, &_arg2)) == NULL) goto fail;
	if (arg3) if ((lparg3 = getGtkRequisitionFields(env, arg3, &_arg3)) == NULL) goto fail;
	gtk_cell_renderer_get_preferred_size((GtkCellRenderer *)arg0, (GtkWidget *)arg1, (GtkRequisition *)lparg2, (GtkRequisition *)lparg3);
fail:
	if (arg3 && lparg3) setGtkRequisitionFields(env, arg3, lparg3);
	if (arg2 && lparg2) setGtkRequisitionFields(env, arg2, lparg2);
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1renderer_1get_1preferred_1size_FUNC);
}
#endif

#ifndef NO_gtk_1cell_1renderer_1pixbuf_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1cell_1renderer_1pixbuf_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1renderer_1pixbuf_1new_FUNC);
	rc = (jlong)gtk_cell_renderer_pixbuf_new();
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1renderer_1pixbuf_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1cell_1renderer_1set_1fixed_1size
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1cell_1renderer_1set_1fixed_1size)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1renderer_1set_1fixed_1size_FUNC);
	gtk_cell_renderer_set_fixed_size((GtkCellRenderer *)arg0, (gint)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1renderer_1set_1fixed_1size_FUNC);
}
#endif

#ifndef NO_gtk_1cell_1renderer_1text_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1cell_1renderer_1text_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1renderer_1text_1new_FUNC);
	rc = (jlong)gtk_cell_renderer_text_new();
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1renderer_1text_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1cell_1renderer_1toggle_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1cell_1renderer_1toggle_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1renderer_1toggle_1new_FUNC);
	rc = (jlong)gtk_cell_renderer_toggle_new();
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1renderer_1toggle_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1cell_1view_1set_1fit_1model
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1cell_1view_1set_1fit_1model)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1cell_1view_1set_1fit_1model_FUNC);
	gtk_cell_view_set_fit_model((GtkCellView *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1cell_1view_1set_1fit_1model_FUNC);
}
#endif

#ifndef NO_gtk_1check_1button_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1check_1button_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1check_1button_1new_FUNC);
	rc = (jlong)gtk_check_button_new();
	GTK_NATIVE_EXIT(env, that, gtk_1check_1button_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1check_1version
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1check_1version)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1check_1version_FUNC);
	rc = (jlong)gtk_check_version(arg0, arg1, arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1check_1version_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1color_1chooser_1add_1palette
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1color_1chooser_1add_1palette)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jlong arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1color_1chooser_1add_1palette_FUNC);
	gtk_color_chooser_add_palette((GtkColorChooser *)arg0, (GtkOrientation)arg1, (gint)arg2, (gint)arg3, (GdkRGBA *)arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1color_1chooser_1add_1palette_FUNC);
}
#endif

#ifndef NO_gtk_1color_1chooser_1dialog_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1color_1chooser_1dialog_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1color_1chooser_1dialog_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_color_chooser_dialog_new((const gchar *)lparg0, (GtkWindow *)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1color_1chooser_1dialog_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1color_1chooser_1get_1rgba
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1color_1chooser_1get_1rgba)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRGBA _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1color_1chooser_1get_1rgba_FUNC);
	if (arg1) if ((lparg1 = getGdkRGBAFields(env, arg1, &_arg1)) == NULL) goto fail;
	gtk_color_chooser_get_rgba((GtkColorChooser *)arg0, (GdkRGBA *)lparg1);
fail:
	if (arg1 && lparg1) setGdkRGBAFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1color_1chooser_1get_1rgba_FUNC);
}
#endif

#ifndef NO_gtk_1color_1chooser_1get_1use_1alpha
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1color_1chooser_1get_1use_1alpha)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1color_1chooser_1get_1use_1alpha_FUNC);
	rc = (jboolean)gtk_color_chooser_get_use_alpha((GtkColorChooser *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1color_1chooser_1get_1use_1alpha_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1color_1chooser_1set_1rgba
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1color_1chooser_1set_1rgba)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRGBA _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1color_1chooser_1set_1rgba_FUNC);
	if (arg1) if ((lparg1 = getGdkRGBAFields(env, arg1, &_arg1)) == NULL) goto fail;
	gtk_color_chooser_set_rgba((GtkColorChooser *)arg0, (GdkRGBA *)lparg1);
fail:
	if (arg1 && lparg1) setGdkRGBAFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1color_1chooser_1set_1rgba_FUNC);
}
#endif

#ifndef NO_gtk_1color_1chooser_1set_1use_1alpha
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1color_1chooser_1set_1use_1alpha)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1color_1chooser_1set_1use_1alpha_FUNC);
	gtk_color_chooser_set_use_alpha((GtkColorChooser *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1color_1chooser_1set_1use_1alpha_FUNC);
}
#endif

#ifndef NO_gtk_1combo_1box_1get_1active
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1combo_1box_1get_1active)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1get_1active_FUNC);
	rc = (jint)gtk_combo_box_get_active((GtkComboBox *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1get_1active_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1combo_1box_1get_1child
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1combo_1box_1get_1child)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1get_1child_FUNC);
/*
	rc = (jlong)gtk_combo_box_get_child((GtkComboBox *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_combo_box_get_child)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkComboBox *))fp)((GtkComboBox *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1get_1child_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1combo_1box_1get_1model
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1combo_1box_1get_1model)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1get_1model_FUNC);
	rc = (jlong)gtk_combo_box_get_model((GtkComboBox *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1get_1model_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1combo_1box_1get_1wrap_1width
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1combo_1box_1get_1wrap_1width)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1get_1wrap_1width_FUNC);
/*
	rc = (jint)gtk_combo_box_get_wrap_width((GtkComboBox *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_combo_box_get_wrap_width)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GtkComboBox *))fp)((GtkComboBox *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1get_1wrap_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1combo_1box_1popdown
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1combo_1box_1popdown)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1popdown_FUNC);
	gtk_combo_box_popdown((GtkComboBox *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1popdown_FUNC);
}
#endif

#ifndef NO_gtk_1combo_1box_1popup
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1combo_1box_1popup)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1popup_FUNC);
	gtk_combo_box_popup((GtkComboBox *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1popup_FUNC);
}
#endif

#ifndef NO_gtk_1combo_1box_1set_1active
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1combo_1box_1set_1active)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1set_1active_FUNC);
	gtk_combo_box_set_active((GtkComboBox *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1set_1active_FUNC);
}
#endif

#ifndef NO_gtk_1combo_1box_1set_1wrap_1width
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1combo_1box_1set_1wrap_1width)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1set_1wrap_1width_FUNC);
/*
	gtk_combo_box_set_wrap_width((GtkComboBox *)arg0, (gint)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_combo_box_set_wrap_width)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkComboBox *, gint))fp)((GtkComboBox *)arg0, (gint)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1set_1wrap_1width_FUNC);
}
#endif

#ifndef NO_gtk_1combo_1box_1text_1insert
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1combo_1box_1text_1insert)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jbyteArray arg2, jbyteArray arg3)
{
	jbyte *lparg2=NULL;
	jbyte *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1text_1insert_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetByteArrayElements(env, arg3, NULL)) == NULL) goto fail;
	gtk_combo_box_text_insert((GtkComboBoxText *)arg0, (gint)arg1, (const gchar *)lparg2, (const gchar *)lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseByteArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1text_1insert_FUNC);
}
#endif

#ifndef NO_gtk_1combo_1box_1text_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1combo_1box_1text_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1text_1new_FUNC);
	rc = (jlong)gtk_combo_box_text_new();
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1text_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1combo_1box_1text_1new_1with_1entry
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1combo_1box_1text_1new_1with_1entry)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1text_1new_1with_1entry_FUNC);
	rc = (jlong)gtk_combo_box_text_new_with_entry();
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1text_1new_1with_1entry_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1combo_1box_1text_1remove
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1combo_1box_1text_1remove)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1text_1remove_FUNC);
	gtk_combo_box_text_remove((GtkComboBoxText *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1text_1remove_FUNC);
}
#endif

#ifndef NO_gtk_1combo_1box_1text_1remove_1all
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1combo_1box_1text_1remove_1all)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1combo_1box_1text_1remove_1all_FUNC);
	gtk_combo_box_text_remove_all((GtkComboBoxText *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1combo_1box_1text_1remove_1all_FUNC);
}
#endif

#ifndef NO_gtk_1css_1provider_1load_1from_1data__J_3BJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1css_1provider_1load_1from_1data__J_3BJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1css_1provider_1load_1from_1data__J_3BJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_css_provider_load_from_data((GtkCssProvider *)arg0, (const gchar *)lparg1, (gssize)arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1css_1provider_1load_1from_1data__J_3BJ_FUNC);
}
#endif

#ifndef NO_gtk_1css_1provider_1load_1from_1data__J_3BJ_3J
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1css_1provider_1load_1from_1data__J_3BJ_3J)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jlongArray arg3)
{
	jbyte *lparg1=NULL;
	jlong *lparg3=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1css_1provider_1load_1from_1data__J_3BJ_3J_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetLongArrayElements(env, arg3, NULL)) == NULL) goto fail;
	rc = (jboolean)gtk_css_provider_load_from_data((GtkCssProvider *)arg0, (const gchar *)lparg1, (gssize)arg2, (GError **)lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseLongArrayElements(env, arg3, lparg3, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1css_1provider_1load_1from_1data__J_3BJ_3J_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1css_1provider_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1css_1provider_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1css_1provider_1new_FUNC);
	rc = (jlong)gtk_css_provider_new();
	GTK_NATIVE_EXIT(env, that, gtk_1css_1provider_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1css_1provider_1to_1string
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1css_1provider_1to_1string)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1css_1provider_1to_1string_FUNC);
	rc = (jlong)gtk_css_provider_to_string((GtkCssProvider *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1css_1provider_1to_1string_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1dialog_1add_1button
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1dialog_1add_1button)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2)
{
	jbyte *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1dialog_1add_1button_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_dialog_add_button((GtkDialog *)arg0, (const gchar *)lparg1, (gint)arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1dialog_1add_1button_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1editable_1copy_1clipboard
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1editable_1copy_1clipboard)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1copy_1clipboard_FUNC);
/*
	gtk_editable_copy_clipboard((GtkEditable *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_editable_copy_clipboard)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkEditable *))fp)((GtkEditable *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1copy_1clipboard_FUNC);
}
#endif

#ifndef NO_gtk_1editable_1cut_1clipboard
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1editable_1cut_1clipboard)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1cut_1clipboard_FUNC);
/*
	gtk_editable_cut_clipboard((GtkEditable *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_editable_cut_clipboard)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkEditable *))fp)((GtkEditable *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1cut_1clipboard_FUNC);
}
#endif

#ifndef NO_gtk_1editable_1delete_1selection
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1editable_1delete_1selection)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1delete_1selection_FUNC);
	gtk_editable_delete_selection((GtkEditable *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1delete_1selection_FUNC);
}
#endif

#ifndef NO_gtk_1editable_1delete_1text
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1editable_1delete_1text)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1delete_1text_FUNC);
	gtk_editable_delete_text((GtkEditable *)arg0, (gint)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1delete_1text_FUNC);
}
#endif

#ifndef NO_gtk_1editable_1get_1editable
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1editable_1get_1editable)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1get_1editable_FUNC);
	rc = (jboolean)gtk_editable_get_editable((GtkEditable *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1get_1editable_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1editable_1get_1position
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1editable_1get_1position)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1get_1position_FUNC);
	rc = (jint)gtk_editable_get_position((GtkEditable *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1get_1position_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1editable_1get_1selection_1bounds
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1editable_1get_1selection_1bounds)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1get_1selection_1bounds_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jboolean)gtk_editable_get_selection_bounds((GtkEditable *)arg0, (gint *)lparg1, (gint *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1get_1selection_1bounds_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1editable_1insert_1text
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1editable_1insert_1text)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2, jintArray arg3)
{
	jbyte *lparg1=NULL;
	jint *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1insert_1text_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	gtk_editable_insert_text((GtkEditable *)arg0, (gchar *)lparg1, (gint)arg2, (gint *)lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1insert_1text_FUNC);
}
#endif

#ifndef NO_gtk_1editable_1paste_1clipboard
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1editable_1paste_1clipboard)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1paste_1clipboard_FUNC);
/*
	gtk_editable_paste_clipboard((GtkEditable *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_editable_paste_clipboard)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkEditable *))fp)((GtkEditable *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1paste_1clipboard_FUNC);
}
#endif

#ifndef NO_gtk_1editable_1select_1region
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1editable_1select_1region)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1select_1region_FUNC);
	gtk_editable_select_region((GtkEditable *)arg0, (gint)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1select_1region_FUNC);
}
#endif

#ifndef NO_gtk_1editable_1set_1editable
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1editable_1set_1editable)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1set_1editable_FUNC);
	gtk_editable_set_editable((GtkEditable *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1set_1editable_FUNC);
}
#endif

#ifndef NO_gtk_1editable_1set_1position
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1editable_1set_1position)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1editable_1set_1position_FUNC);
	gtk_editable_set_position((GtkEditable *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1editable_1set_1position_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1buffer_1delete_1text
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1entry_1buffer_1delete_1text)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1buffer_1delete_1text_FUNC);
	rc = (jint)gtk_entry_buffer_delete_text((GtkEntryBuffer *)arg0, (guint)arg1, arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1buffer_1delete_1text_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1entry_1buffer_1get_1text
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1entry_1buffer_1get_1text)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1buffer_1get_1text_FUNC);
	rc = (jlong)gtk_entry_buffer_get_text((GtkEntryBuffer *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1buffer_1get_1text_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1entry_1buffer_1set_1text
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1buffer_1set_1text)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1buffer_1set_1text_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_entry_buffer_set_text((GtkEntryBuffer *)arg0, (const char *)lparg1, arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1buffer_1set_1text_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1get_1buffer
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1entry_1get_1buffer)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1get_1buffer_FUNC);
/*
	rc = (jlong)gtk_entry_get_buffer((GtkEntry *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_entry_get_buffer)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkEntry *))fp)((GtkEntry *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1get_1buffer_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1entry_1get_1icon_1area
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1get_1icon_1area)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jobject arg2)
{
	GdkRectangle _arg2, *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1get_1icon_1area_FUNC);
	if (arg2) if ((lparg2 = &_arg2) == NULL) goto fail;
	gtk_entry_get_icon_area((GtkEntry *)arg0, (gint)arg1, (GdkRectangle *)lparg2);
fail:
	if (arg2 && lparg2) setGdkRectangleFields(env, arg2, lparg2);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1get_1icon_1area_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1get_1invisible_1char
JNIEXPORT jchar JNICALL GTK_NATIVE(gtk_1entry_1get_1invisible_1char)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jchar rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1get_1invisible_1char_FUNC);
	rc = (jchar)gtk_entry_get_invisible_char((GtkEntry *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1get_1invisible_1char_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1entry_1get_1layout
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1entry_1get_1layout)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1get_1layout_FUNC);
/*
	rc = (jlong)gtk_entry_get_layout((GtkEntry *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_entry_get_layout)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkEntry *))fp)((GtkEntry *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1get_1layout_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1entry_1get_1layout_1offsets
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1get_1layout_1offsets)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1get_1layout_1offsets_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	gtk_entry_get_layout_offsets((GtkEntry *)arg0, (gint *)lparg1, (gint *)lparg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_entry_get_layout_offsets)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkEntry *, gint *, gint *))fp)((GtkEntry *)arg0, (gint *)lparg1, (gint *)lparg2);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1get_1layout_1offsets_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1get_1max_1length
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1entry_1get_1max_1length)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1get_1max_1length_FUNC);
	rc = (jint)gtk_entry_get_max_length((GtkEntry *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1get_1max_1length_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1entry_1get_1text
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1entry_1get_1text)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1get_1text_FUNC);
/*
	rc = (jlong)gtk_entry_get_text((GtkEntry *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_entry_get_text)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkEntry *))fp)((GtkEntry *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1get_1text_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1entry_1get_1visibility
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1entry_1get_1visibility)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1get_1visibility_FUNC);
	rc = (jboolean)gtk_entry_get_visibility((GtkEntry *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1get_1visibility_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1entry_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1entry_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1new_FUNC);
	rc = (jlong)gtk_entry_new();
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1entry_1set_1alignment
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1alignment)
	(JNIEnv *env, jclass that, jlong arg0, jfloat arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1alignment_FUNC);
	gtk_entry_set_alignment((GtkEntry *)arg0, (gfloat)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1alignment_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1buffer
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1buffer)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1buffer_FUNC);
/*
	gtk_entry_set_buffer((GtkEntry *)arg0, (GtkEntryBuffer *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_entry_set_buffer)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkEntry *, GtkEntryBuffer *))fp)((GtkEntry *)arg0, (GtkEntryBuffer *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1buffer_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1has_1frame
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1has_1frame)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1has_1frame_FUNC);
	gtk_entry_set_has_frame((GtkEntry *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1has_1frame_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1icon_1activatable
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1icon_1activatable)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jboolean arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1icon_1activatable_FUNC);
	gtk_entry_set_icon_activatable((GtkEntry *)arg0, (GtkEntryIconPosition)arg1, (gboolean)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1icon_1activatable_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1icon_1from_1icon_1name
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1icon_1from_1icon_1name)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jbyteArray arg2)
{
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1icon_1from_1icon_1name_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_entry_set_icon_from_icon_name((GtkEntry *)arg0, (gint)arg1, (const gchar *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1icon_1from_1icon_1name_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1icon_1sensitive
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1icon_1sensitive)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jboolean arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1icon_1sensitive_FUNC);
	gtk_entry_set_icon_sensitive((GtkEntry *)arg0, (GtkEntryIconPosition)arg1, (gboolean)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1icon_1sensitive_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1input_1hints
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1input_1hints)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1input_1hints_FUNC);
	gtk_entry_set_input_hints((GtkEntry *)arg0, (GtkInputHints)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1input_1hints_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1invisible_1char
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1invisible_1char)
	(JNIEnv *env, jclass that, jlong arg0, jchar arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1invisible_1char_FUNC);
	gtk_entry_set_invisible_char((GtkEntry *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1invisible_1char_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1max_1length
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1max_1length)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1max_1length_FUNC);
	gtk_entry_set_max_length((GtkEntry *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1max_1length_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1placeholder_1text
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1placeholder_1text)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1placeholder_1text_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_entry_set_placeholder_text((GtkEntry *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1placeholder_1text_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1tabs
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1tabs)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1tabs_FUNC);
	gtk_entry_set_tabs((GtkEntry *)arg0, (PangoTabArray *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1tabs_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1text
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1text)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1text_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	gtk_entry_set_text((GtkEntry *)arg0, (const gchar *)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_entry_set_text)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkEntry *, const gchar *))fp)((GtkEntry *)arg0, (const gchar *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1text_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1visibility
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1visibility)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1visibility_FUNC);
	gtk_entry_set_visibility((GtkEntry *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1visibility_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1set_1width_1chars
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1entry_1set_1width_1chars)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1set_1width_1chars_FUNC);
/*
	gtk_entry_set_width_chars((GtkEntry *)arg0, (gint)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_entry_set_width_chars)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkEntry *, gint))fp)((GtkEntry *)arg0, (gint)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1set_1width_1chars_FUNC);
}
#endif

#ifndef NO_gtk_1entry_1text_1index_1to_1layout_1index
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1entry_1text_1index_1to_1layout_1index)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1entry_1text_1index_1to_1layout_1index_FUNC);
/*
	rc = (jint)gtk_entry_text_index_to_layout_index((GtkEntry *)arg0, (gint)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_entry_text_index_to_layout_index)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GtkEntry *, gint))fp)((GtkEntry *)arg0, (gint)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1entry_1text_1index_1to_1layout_1index_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1enumerate_1printers
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1enumerate_1printers)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jboolean arg3)
{
	GTK_NATIVE_ENTER(env, that, gtk_1enumerate_1printers_FUNC);
	gtk_enumerate_printers((GtkPrinterFunc)arg0, (gpointer)arg1, (GDestroyNotify)arg2, (gboolean)arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1enumerate_1printers_FUNC);
}
#endif

#ifndef NO_gtk_1event_1box_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1event_1box_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1event_1box_1new_FUNC);
/*
	rc = (jlong)gtk_event_box_new();
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_event_box_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1event_1box_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1event_1controller_1focus_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1event_1controller_1focus_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1focus_1new_FUNC);
/*
	rc = (jlong)gtk_event_controller_focus_new();
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_event_controller_focus_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1focus_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1event_1controller_1get_1current_1event
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1event_1controller_1get_1current_1event)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1get_1current_1event_FUNC);
/*
	rc = (jlong)gtk_event_controller_get_current_event((GtkEventController *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_event_controller_get_current_event)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkEventController *))fp)((GtkEventController *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1get_1current_1event_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1event_1controller_1get_1widget
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1event_1controller_1get_1widget)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1get_1widget_FUNC);
	rc = (jlong)gtk_event_controller_get_widget((GtkEventController *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1get_1widget_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1event_1controller_1handle_1event
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1event_1controller_1handle_1event)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1handle_1event_FUNC);
/*
	gtk_event_controller_handle_event(arg0, arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_event_controller_handle_event)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jlong))fp)(arg0, arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1handle_1event_FUNC);
}
#endif

#ifndef NO_gtk_1event_1controller_1key_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1event_1controller_1key_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1key_1new_FUNC);
/*
	rc = (jlong)gtk_event_controller_key_new();
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_event_controller_key_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1key_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1event_1controller_1legacy_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1event_1controller_1legacy_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1legacy_1new_FUNC);
/*
	rc = (jlong)gtk_event_controller_legacy_new();
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_event_controller_legacy_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1legacy_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1event_1controller_1motion_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1event_1controller_1motion_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1motion_1new_FUNC);
/*
	rc = (jlong)gtk_event_controller_motion_new();
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_event_controller_motion_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1motion_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1event_1controller_1scroll_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1event_1controller_1scroll_1new)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1scroll_1new_FUNC);
/*
	rc = (jlong)gtk_event_controller_scroll_new(arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_event_controller_scroll_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jint))fp)(arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1scroll_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1event_1controller_1set_1propagation_1phase
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1event_1controller_1set_1propagation_1phase)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1set_1propagation_1phase_FUNC);
	gtk_event_controller_set_propagation_phase((GtkEventController *)arg0, (GtkPropagationPhase)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1set_1propagation_1phase_FUNC);
}
#endif

#ifndef NO_gtk_1expander_1get_1expanded
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1expander_1get_1expanded)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1expander_1get_1expanded_FUNC);
	rc = (jboolean)gtk_expander_get_expanded((GtkExpander *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1expander_1get_1expanded_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1expander_1get_1label_1widget
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1expander_1get_1label_1widget)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1expander_1get_1label_1widget_FUNC);
	rc = (jlong)gtk_expander_get_label_widget((GtkExpander *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1expander_1get_1label_1widget_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1expander_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1expander_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1expander_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_expander_new((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1expander_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1expander_1set_1child
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1expander_1set_1child)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1expander_1set_1child_FUNC);
/*
	gtk_expander_set_child((GtkExpander *)arg0, (GtkWidget *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_expander_set_child)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkExpander *, GtkWidget *))fp)((GtkExpander *)arg0, (GtkWidget *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1expander_1set_1child_FUNC);
}
#endif

#ifndef NO_gtk_1expander_1set_1expanded
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1expander_1set_1expanded)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1expander_1set_1expanded_FUNC);
	gtk_expander_set_expanded((GtkExpander *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1expander_1set_1expanded_FUNC);
}
#endif

#ifndef NO_gtk_1expander_1set_1label_1widget
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1expander_1set_1label_1widget)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1expander_1set_1label_1widget_FUNC);
	gtk_expander_set_label_widget((GtkExpander *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1expander_1set_1label_1widget_FUNC);
}
#endif

#ifndef NO_gtk_1file_1chooser_1add_1filter
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1add_1filter)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1add_1filter_FUNC);
	gtk_file_chooser_add_filter((GtkFileChooser *)arg0, (GtkFileFilter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1add_1filter_FUNC);
}
#endif

#ifndef NO_gtk_1file_1chooser_1get_1filter
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1file_1chooser_1get_1filter)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1get_1filter_FUNC);
	rc = (jlong)gtk_file_chooser_get_filter((GtkFileChooser *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1get_1filter_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1file_1chooser_1native_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1file_1chooser_1native_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1, jint arg2, jbyteArray arg3, jbyteArray arg4)
{
	jbyte *lparg0=NULL;
	jbyte *lparg3=NULL;
	jbyte *lparg4=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1native_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetByteArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetByteArrayElements(env, arg4, NULL)) == NULL) goto fail;
/*
	rc = (jlong)gtk_file_chooser_native_new((const gchar *)lparg0, (GtkWindow *)arg1, arg2, (const gchar *)lparg3, (const gchar *)lparg4);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_native_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(const gchar *, GtkWindow *, jint, const gchar *, const gchar *))fp)((const gchar *)lparg0, (GtkWindow *)arg1, arg2, (const gchar *)lparg3, (const gchar *)lparg4);
		}
	}
fail:
	if (arg4 && lparg4) (*env)->ReleaseByteArrayElements(env, arg4, lparg4, JNI_ABORT);
	if (arg3 && lparg3) (*env)->ReleaseByteArrayElements(env, arg3, lparg3, JNI_ABORT);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1native_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1file_1chooser_1set_1current_1name
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1current_1name)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1current_1name_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_file_chooser_set_current_name((GtkFileChooser *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1current_1name_FUNC);
}
#endif

#ifndef NO_gtk_1file_1chooser_1set_1filter
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1filter)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1filter_FUNC);
	gtk_file_chooser_set_filter((GtkFileChooser *)arg0, (GtkFileFilter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1filter_FUNC);
}
#endif

#ifndef NO_gtk_1file_1chooser_1set_1select_1multiple
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1select_1multiple)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1select_1multiple_FUNC);
	gtk_file_chooser_set_select_multiple((GtkFileChooser *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1select_1multiple_FUNC);
}
#endif

#ifndef NO_gtk_1file_1filter_1add_1pattern
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1filter_1add_1pattern)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1filter_1add_1pattern_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_file_filter_add_pattern((GtkFileFilter *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1filter_1add_1pattern_FUNC);
}
#endif

#ifndef NO_gtk_1file_1filter_1get_1name
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1file_1filter_1get_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1filter_1get_1name_FUNC);
	rc = (jlong)gtk_file_filter_get_name((GtkFileFilter *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1filter_1get_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1file_1filter_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1file_1filter_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1filter_1new_FUNC);
	rc = (jlong)gtk_file_filter_new();
	GTK_NATIVE_EXIT(env, that, gtk_1file_1filter_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1file_1filter_1set_1name
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1filter_1set_1name)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1filter_1set_1name_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_file_filter_set_name((GtkFileFilter *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1filter_1set_1name_FUNC);
}
#endif

#ifndef NO_gtk_1font_1chooser_1dialog_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1font_1chooser_1dialog_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1font_1chooser_1dialog_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_font_chooser_dialog_new((const gchar *)lparg0, (GtkWindow *)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1font_1chooser_1dialog_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1font_1chooser_1get_1font
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1font_1chooser_1get_1font)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1font_1chooser_1get_1font_FUNC);
	rc = (jlong)gtk_font_chooser_get_font((GtkFontChooser *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1font_1chooser_1get_1font_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1font_1chooser_1set_1font
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1font_1chooser_1set_1font)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1font_1chooser_1set_1font_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_font_chooser_set_font((GtkFontChooser *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1font_1chooser_1set_1font_FUNC);
}
#endif

#ifndef NO_gtk_1frame_1get_1label_1widget
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1frame_1get_1label_1widget)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1frame_1get_1label_1widget_FUNC);
	rc = (jlong)gtk_frame_get_label_widget((GtkFrame *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1frame_1get_1label_1widget_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1frame_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1frame_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1frame_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_frame_new((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1frame_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1frame_1set_1child
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1frame_1set_1child)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1frame_1set_1child_FUNC);
/*
	gtk_frame_set_child((GtkFrame *)arg0, (GtkWidget *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_frame_set_child)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkFrame *, GtkWidget *))fp)((GtkFrame *)arg0, (GtkWidget *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1frame_1set_1child_FUNC);
}
#endif

#ifndef NO_gtk_1frame_1set_1label_1widget
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1frame_1set_1label_1widget)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1frame_1set_1label_1widget_FUNC);
	gtk_frame_set_label_widget((GtkFrame *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1frame_1set_1label_1widget_FUNC);
}
#endif

#ifndef NO_gtk_1frame_1set_1shadow_1type
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1frame_1set_1shadow_1type)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1frame_1set_1shadow_1type_FUNC);
	gtk_frame_set_shadow_type((GtkFrame *)arg0, (GtkShadowType)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1frame_1set_1shadow_1type_FUNC);
}
#endif

#ifndef NO_gtk_1gesture_1click_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1gesture_1click_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1click_1new_FUNC);
/*
	rc = (jlong)gtk_gesture_click_new();
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_click_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1click_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1drag_1get_1offset
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1gesture_1drag_1get_1offset)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1, jdoubleArray arg2)
{
	jdouble *lparg1=NULL;
	jdouble *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1drag_1get_1offset_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	gtk_gesture_drag_get_offset(arg0, lparg1, lparg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_drag_get_offset)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jdouble *, jdouble *))fp)(arg0, lparg1, lparg2);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1drag_1get_1offset_FUNC);
}
#endif

#ifndef NO_gtk_1gesture_1drag_1get_1start_1point
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1gesture_1drag_1get_1start_1point)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1, jdoubleArray arg2)
{
	jdouble *lparg1=NULL;
	jdouble *lparg2=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1drag_1get_1start_1point_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)gtk_gesture_drag_get_start_point(arg0, lparg1, lparg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_drag_get_start_point)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong, jdouble *, jdouble *))fp)(arg0, lparg1, lparg2);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1drag_1get_1start_1point_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1drag_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1gesture_1drag_1new)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1drag_1new_FUNC);
/*
	rc = (jlong)gtk_gesture_drag_new((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_drag_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1drag_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1get_1last_1updated_1sequence
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1gesture_1get_1last_1updated_1sequence)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1get_1last_1updated_1sequence_FUNC);
/*
	rc = (jlong)gtk_gesture_get_last_updated_sequence(arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_get_last_updated_sequence)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1get_1last_1updated_1sequence_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1get_1point
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1gesture_1get_1point)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdoubleArray arg2, jdoubleArray arg3)
{
	jdouble *lparg2=NULL;
	jdouble *lparg3=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1get_1point_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetDoubleArrayElements(env, arg3, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)gtk_gesture_get_point(arg0, arg1, lparg2, lparg3);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_get_point)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong, jlong, jdouble *, jdouble *))fp)(arg0, arg1, lparg2, lparg3);
		}
	}
fail:
	if (arg3 && lparg3) (*env)->ReleaseDoubleArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1get_1point_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1is_1recognized
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1gesture_1is_1recognized)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1is_1recognized_FUNC);
/*
	rc = (jboolean)gtk_gesture_is_recognized(arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_is_recognized)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1is_1recognized_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1rotate_1get_1angle_1delta
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1gesture_1rotate_1get_1angle_1delta)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1rotate_1get_1angle_1delta_FUNC);
/*
	rc = (jdouble)gtk_gesture_rotate_get_angle_delta(arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_rotate_get_angle_delta)
		if (fp) {
			rc = (jdouble)((jdouble (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1rotate_1get_1angle_1delta_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1rotate_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1gesture_1rotate_1new)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1rotate_1new_FUNC);
/*
	rc = (jlong)gtk_gesture_rotate_new(arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_rotate_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1rotate_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1single_1get_1current_1button
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1gesture_1single_1get_1current_1button)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1single_1get_1current_1button_FUNC);
	rc = (jint)gtk_gesture_single_get_current_button((GtkGestureSingle *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1single_1get_1current_1button_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1single_1set_1button
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1gesture_1single_1set_1button)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1single_1set_1button_FUNC);
/*
	gtk_gesture_single_set_button(arg0, arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_single_set_button)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jint))fp)(arg0, arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1single_1set_1button_FUNC);
}
#endif

#ifndef NO_gtk_1gesture_1swipe_1get_1velocity
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1gesture_1swipe_1get_1velocity)
	(JNIEnv *env, jclass that, jlong arg0, jdoubleArray arg1, jdoubleArray arg2)
{
	jdouble *lparg1=NULL;
	jdouble *lparg2=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1swipe_1get_1velocity_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)gtk_gesture_swipe_get_velocity(arg0, lparg1, lparg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_swipe_get_velocity)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong, jdouble *, jdouble *))fp)(arg0, lparg1, lparg2);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1swipe_1get_1velocity_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1zoom_1get_1scale_1delta
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1gesture_1zoom_1get_1scale_1delta)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1zoom_1get_1scale_1delta_FUNC);
/*
	rc = (jdouble)gtk_gesture_zoom_get_scale_delta(arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_zoom_get_scale_delta)
		if (fp) {
			rc = (jdouble)((jdouble (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1zoom_1get_1scale_1delta_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1gesture_1zoom_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1gesture_1zoom_1new)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1zoom_1new_FUNC);
/*
	rc = (jlong)gtk_gesture_zoom_new(arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_gesture_zoom_new)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1zoom_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1get_1default_1language
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1get_1default_1language)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1get_1default_1language_FUNC);
	rc = (jlong)gtk_get_default_language();
	GTK_NATIVE_EXIT(env, that, gtk_1get_1default_1language_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1get_1major_1version
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1get_1major_1version)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1get_1major_1version_FUNC);
	rc = (jint)gtk_get_major_version();
	GTK_NATIVE_EXIT(env, that, gtk_1get_1major_1version_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1get_1micro_1version
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1get_1micro_1version)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1get_1micro_1version_FUNC);
	rc = (jint)gtk_get_micro_version();
	GTK_NATIVE_EXIT(env, that, gtk_1get_1micro_1version_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1get_1minor_1version
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1get_1minor_1version)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1get_1minor_1version_FUNC);
	rc = (jint)gtk_get_minor_version();
	GTK_NATIVE_EXIT(env, that, gtk_1get_1minor_1version_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1im_1context_1focus_1in
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1im_1context_1focus_1in)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1im_1context_1focus_1in_FUNC);
	gtk_im_context_focus_in((GtkIMContext *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1im_1context_1focus_1in_FUNC);
}
#endif

#ifndef NO_gtk_1im_1context_1focus_1out
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1im_1context_1focus_1out)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1im_1context_1focus_1out_FUNC);
	gtk_im_context_focus_out((GtkIMContext *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1im_1context_1focus_1out_FUNC);
}
#endif

#ifndef NO_gtk_1im_1context_1get_1preedit_1string
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1im_1context_1get_1preedit_1string)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1, jlongArray arg2, jintArray arg3)
{
	jlong *lparg1=NULL;
	jlong *lparg2=NULL;
	jint *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1im_1context_1get_1preedit_1string_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	gtk_im_context_get_preedit_string((GtkIMContext *)arg0, (gchar **)lparg1, (PangoAttrList **)lparg2, (gint *)lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1im_1context_1get_1preedit_1string_FUNC);
}
#endif

#ifndef NO_gtk_1im_1context_1get_1type
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1im_1context_1get_1type)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1im_1context_1get_1type_FUNC);
	rc = (jlong)gtk_im_context_get_type();
	GTK_NATIVE_EXIT(env, that, gtk_1im_1context_1get_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1im_1context_1reset
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1im_1context_1reset)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1im_1context_1reset_FUNC);
	gtk_im_context_reset((GtkIMContext *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1im_1context_1reset_FUNC);
}
#endif

#ifndef NO_gtk_1im_1context_1set_1client_1window
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1im_1context_1set_1client_1window)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1im_1context_1set_1client_1window_FUNC);
	gtk_im_context_set_client_window((GtkIMContext *)arg0, (GdkWindow *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1im_1context_1set_1client_1window_FUNC);
}
#endif

#ifndef NO_gtk_1im_1context_1set_1cursor_1location
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1im_1context_1set_1cursor_1location)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1im_1context_1set_1cursor_1location_FUNC);
	if (arg1) if ((lparg1 = getGdkRectangleFields(env, arg1, &_arg1)) == NULL) goto fail;
	gtk_im_context_set_cursor_location((GtkIMContext *)arg0, (GdkRectangle *)lparg1);
fail:
	GTK_NATIVE_EXIT(env, that, gtk_1im_1context_1set_1cursor_1location_FUNC);
}
#endif

#ifndef NO_gtk_1im_1multicontext_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1im_1multicontext_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1im_1multicontext_1new_FUNC);
	rc = (jlong)gtk_im_multicontext_new();
	GTK_NATIVE_EXIT(env, that, gtk_1im_1multicontext_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1image_1clear
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1image_1clear)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1image_1clear_FUNC);
/*
	gtk_image_clear((GtkImage *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_image_clear)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkImage *))fp)((GtkImage *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1image_1clear_FUNC);
}
#endif

#ifndef NO_gtk_1image_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1image_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1image_1new_FUNC);
	rc = (jlong)gtk_image_new();
	GTK_NATIVE_EXIT(env, that, gtk_1image_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1image_1new_1from_1icon_1name___3B
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1image_1new_1from_1icon_1name___3B)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1image_1new_1from_1icon_1name___3B_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
/*
	rc = (jlong)gtk_image_new_from_icon_name((const gchar *)lparg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_image_new_from_icon_name)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(const gchar *))fp)((const gchar *)lparg0);
		}
	}
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1image_1new_1from_1icon_1name___3B_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1image_1new_1from_1icon_1name___3BI
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1image_1new_1from_1icon_1name___3BI)
	(JNIEnv *env, jclass that, jbyteArray arg0, jint arg1)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1image_1new_1from_1icon_1name___3BI_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
/*
	rc = (jlong)gtk_image_new_from_icon_name((const gchar *)lparg0, (GtkIconSize)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_image_new_from_icon_name)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(const gchar *, GtkIconSize))fp)((const gchar *)lparg0, (GtkIconSize)arg1);
		}
	}
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1image_1new_1from_1icon_1name___3BI_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1image_1new_1from_1surface
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1image_1new_1from_1surface)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1image_1new_1from_1surface_FUNC);
/*
	rc = (jlong)gtk_image_new_from_surface((cairo_surface_t *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_image_new_from_surface)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(cairo_surface_t *))fp)((cairo_surface_t *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1image_1new_1from_1surface_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1image_1set_1from_1icon_1name
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1image_1set_1from_1icon_1name)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1image_1set_1from_1icon_1name_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	gtk_image_set_from_icon_name((GtkImage *)arg0, (const gchar *)lparg1, (GtkIconSize)arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_image_set_from_icon_name)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkImage *, const gchar *, GtkIconSize))fp)((GtkImage *)arg0, (const gchar *)lparg1, (GtkIconSize)arg2);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1image_1set_1from_1icon_1name_FUNC);
}
#endif

#ifndef NO_gtk_1image_1set_1from_1paintable
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1image_1set_1from_1paintable)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1image_1set_1from_1paintable_FUNC);
/*
	rc = (jlong)gtk_image_set_from_paintable((GtkImage *)arg0, (GdkPaintable *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_image_set_from_paintable)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkImage *, GdkPaintable *))fp)((GtkImage *)arg0, (GdkPaintable *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1image_1set_1from_1paintable_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1image_1set_1from_1surface
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1image_1set_1from_1surface)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1image_1set_1from_1surface_FUNC);
/*
	gtk_image_set_from_surface((GtkImage *)arg0, (cairo_surface_t *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_image_set_from_surface)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkImage *, cairo_surface_t *))fp)((GtkImage *)arg0, (cairo_surface_t *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1image_1set_1from_1surface_FUNC);
}
#endif

#ifndef NO_gtk_1image_1set_1pixel_1size
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1image_1set_1pixel_1size)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1image_1set_1pixel_1size_FUNC);
	gtk_image_set_pixel_size((GtkImage *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1image_1set_1pixel_1size_FUNC);
}
#endif

#ifndef NO_gtk_1label_1get_1layout
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1label_1get_1layout)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1label_1get_1layout_FUNC);
	rc = (jlong)gtk_label_get_layout((GtkLabel *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1get_1layout_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1label_1get_1mnemonic_1keyval
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1label_1get_1mnemonic_1keyval)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1label_1get_1mnemonic_1keyval_FUNC);
	rc = (jint)gtk_label_get_mnemonic_keyval((GtkLabel *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1get_1mnemonic_1keyval_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1label_1get_1type
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1label_1get_1type)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1label_1get_1type_FUNC);
	rc = (jlong)gtk_label_get_type();
	GTK_NATIVE_EXIT(env, that, gtk_1label_1get_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1label_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1label_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1label_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_label_new((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1label_1new_1with_1mnemonic
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1label_1new_1with_1mnemonic)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1label_1new_1with_1mnemonic_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_label_new_with_mnemonic((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1new_1with_1mnemonic_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1label_1set_1attributes
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1attributes)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1attributes_FUNC);
	gtk_label_set_attributes((GtkLabel *)arg0, (PangoAttrList *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1attributes_FUNC);
}
#endif

#ifndef NO_gtk_1label_1set_1justify
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1justify)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1justify_FUNC);
	gtk_label_set_justify((GtkLabel *)arg0, (GtkJustification)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1justify_FUNC);
}
#endif

#ifndef NO_gtk_1label_1set_1line_1wrap
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1line_1wrap)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1line_1wrap_FUNC);
/*
	gtk_label_set_line_wrap((GtkLabel *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_label_set_line_wrap)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkLabel *, gboolean))fp)((GtkLabel *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1line_1wrap_FUNC);
}
#endif

#ifndef NO_gtk_1label_1set_1line_1wrap_1mode
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1line_1wrap_1mode)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1line_1wrap_1mode_FUNC);
/*
	gtk_label_set_line_wrap_mode((GtkLabel *)arg0, (PangoWrapMode)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_label_set_line_wrap_mode)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkLabel *, PangoWrapMode))fp)((GtkLabel *)arg0, (PangoWrapMode)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1line_1wrap_1mode_FUNC);
}
#endif

#ifndef NO_gtk_1label_1set_1text__JJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1text__JJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1text__JJ_FUNC);
	gtk_label_set_text((GtkLabel *)arg0, (const gchar *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1text__JJ_FUNC);
}
#endif

#ifndef NO_gtk_1label_1set_1text__J_3B
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1text__J_3B)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1text__J_3B_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_label_set_text((GtkLabel *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1text__J_3B_FUNC);
}
#endif

#ifndef NO_gtk_1label_1set_1text_1with_1mnemonic
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1text_1with_1mnemonic)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1text_1with_1mnemonic_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_label_set_text_with_mnemonic((GtkLabel *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1text_1with_1mnemonic_FUNC);
}
#endif

#ifndef NO_gtk_1label_1set_1wrap
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1wrap)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1wrap_FUNC);
/*
	gtk_label_set_wrap((GtkLabel *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_label_set_wrap)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkLabel *, gboolean))fp)((GtkLabel *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1wrap_FUNC);
}
#endif

#ifndef NO_gtk_1label_1set_1wrap_1mode
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1wrap_1mode)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1wrap_1mode_FUNC);
/*
	gtk_label_set_wrap_mode((GtkLabel *)arg0, (PangoWrapMode)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_label_set_wrap_mode)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkLabel *, PangoWrapMode))fp)((GtkLabel *)arg0, (PangoWrapMode)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1wrap_1mode_FUNC);
}
#endif

#ifndef NO_gtk_1label_1set_1xalign
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1xalign)
	(JNIEnv *env, jclass that, jlong arg0, jfloat arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1xalign_FUNC);
	gtk_label_set_xalign((GtkLabel *)arg0, (gfloat)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1xalign_FUNC);
}
#endif

#ifndef NO_gtk_1label_1set_1yalign
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1label_1set_1yalign)
	(JNIEnv *env, jclass that, jlong arg0, jfloat arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1label_1set_1yalign_FUNC);
	gtk_label_set_yalign((GtkLabel *)arg0, (gfloat)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1label_1set_1yalign_FUNC);
}
#endif

#ifndef NO_gtk_1list_1store_1append
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1list_1store_1append)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1list_1store_1append_FUNC);
	gtk_list_store_append((GtkListStore *)arg0, (GtkTreeIter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1list_1store_1append_FUNC);
}
#endif

#ifndef NO_gtk_1list_1store_1clear
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1list_1store_1clear)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1list_1store_1clear_FUNC);
	gtk_list_store_clear((GtkListStore *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1list_1store_1clear_FUNC);
}
#endif

#ifndef NO_gtk_1list_1store_1insert
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1list_1store_1insert)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1list_1store_1insert_FUNC);
	gtk_list_store_insert((GtkListStore *)arg0, (GtkTreeIter *)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1list_1store_1insert_FUNC);
}
#endif

#ifndef NO_gtk_1list_1store_1newv
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1list_1store_1newv)
	(JNIEnv *env, jclass that, jint arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1list_1store_1newv_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_list_store_newv((gint)arg0, (GType *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1list_1store_1newv_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1list_1store_1remove
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1list_1store_1remove)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1list_1store_1remove_FUNC);
	gtk_list_store_remove((GtkListStore *)arg0, (GtkTreeIter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1list_1store_1remove_FUNC);
}
#endif

#ifndef NO_gtk_1list_1store_1set__JJIII
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1list_1store_1set__JJIII)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3, jint arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1list_1store_1set__JJIII_FUNC);
	gtk_list_store_set((GtkListStore *)arg0, (GtkTreeIter *)arg1, arg2, arg3, arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1list_1store_1set__JJIII_FUNC);
}
#endif

#ifndef NO_gtk_1list_1store_1set__JJIJI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1list_1store_1set__JJIJI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jlong arg3, jint arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1list_1store_1set__JJIJI_FUNC);
	gtk_list_store_set((GtkListStore *)arg0, (GtkTreeIter *)arg1, arg2, arg3, arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1list_1store_1set__JJIJI_FUNC);
}
#endif

#ifndef NO_gtk_1list_1store_1set__JJILorg_eclipse_swt_internal_gtk_GdkRGBA_2I
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1list_1store_1set__JJILorg_eclipse_swt_internal_gtk_GdkRGBA_2I)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jobject arg3, jint arg4)
{
	GdkRGBA _arg3, *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1list_1store_1set__JJILorg_eclipse_swt_internal_gtk_GdkRGBA_2I_FUNC);
	if (arg3) if ((lparg3 = getGdkRGBAFields(env, arg3, &_arg3)) == NULL) goto fail;
	gtk_list_store_set((GtkListStore *)arg0, (GtkTreeIter *)arg1, arg2, lparg3, arg4);
fail:
	GTK_NATIVE_EXIT(env, that, gtk_1list_1store_1set__JJILorg_eclipse_swt_internal_gtk_GdkRGBA_2I_FUNC);
}
#endif

#ifndef NO_gtk_1list_1store_1set__JJIZI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1list_1store_1set__JJIZI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jboolean arg3, jint arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1list_1store_1set__JJIZI_FUNC);
	gtk_list_store_set((GtkListStore *)arg0, (GtkTreeIter *)arg1, arg2, arg3, arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1list_1store_1set__JJIZI_FUNC);
}
#endif

#ifndef NO_gtk_1list_1store_1set__JJI_3BI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1list_1store_1set__JJI_3BI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jbyteArray arg3, jint arg4)
{
	jbyte *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1list_1store_1set__JJI_3BI_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetByteArrayElements(env, arg3, NULL)) == NULL) goto fail;
	gtk_list_store_set((GtkListStore *)arg0, (GtkTreeIter *)arg1, arg2, lparg3, arg4);
fail:
	if (arg3 && lparg3) (*env)->ReleaseByteArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1list_1store_1set__JJI_3BI_FUNC);
}
#endif

#ifndef NO_gtk_1menu_1button_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1menu_1button_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1button_1new_FUNC);
	rc = (jlong)gtk_menu_button_new();
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1button_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1menu_1button_1set_1use_1underline
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1menu_1button_1set_1use_1underline)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1button_1set_1use_1underline_FUNC);
/*
	gtk_menu_button_set_use_underline((GtkMenuButton *)arg0, arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_menu_button_set_use_underline)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkMenuButton *, jboolean))fp)((GtkMenuButton *)arg0, arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1button_1set_1use_1underline_FUNC);
}
#endif

#ifndef NO_gtk_1menu_1popup
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1menu_1popup)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jint arg5, jint arg6)
{
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1popup_FUNC);
/*
	gtk_menu_popup(arg0, arg1, arg2, arg3, arg4, arg5, arg6);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_menu_popup)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jlong, jlong, jlong, jlong, jint, jint))fp)(arg0, arg1, arg2, arg3, arg4, arg5, arg6);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1popup_FUNC);
}
#endif

#ifndef NO_gtk_1menu_1popup_1at_1pointer
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1menu_1popup_1at_1pointer)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1popup_1at_1pointer_FUNC);
/*
	gtk_menu_popup_at_pointer(arg0, arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_menu_popup_at_pointer)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jlong))fp)(arg0, arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1popup_1at_1pointer_FUNC);
}
#endif

#ifndef NO_gtk_1menu_1popup_1at_1rect
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1menu_1popup_1at_1rect)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jint arg3, jint arg4, jlong arg5)
{
	GdkRectangle _arg2, *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1popup_1at_1rect_FUNC);
	if (arg2) if ((lparg2 = getGdkRectangleFields(env, arg2, &_arg2)) == NULL) goto fail;
/*
	gtk_menu_popup_at_rect(arg0, arg1, lparg2, arg3, arg4, arg5);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_menu_popup_at_rect)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jlong, GdkRectangle *, jint, jint, jlong))fp)(arg0, arg1, lparg2, arg3, arg4, arg5);
		}
	}
fail:
	if (arg2 && lparg2) setGdkRectangleFields(env, arg2, lparg2);
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1popup_1at_1rect_FUNC);
}
#endif

#ifndef NO_gtk_1message_1dialog_1format_1secondary_1text
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1message_1dialog_1format_1secondary_1text)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1message_1dialog_1format_1secondary_1text_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_message_dialog_format_secondary_text((GtkMessageDialog *)arg0, (const gchar *)lparg1, (const gchar *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1message_1dialog_1format_1secondary_1text_FUNC);
}
#endif

#ifndef NO_gtk_1message_1dialog_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1message_1dialog_1new)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jbyteArray arg4, jbyteArray arg5)
{
	jbyte *lparg4=NULL;
	jbyte *lparg5=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1message_1dialog_1new_FUNC);
	if (arg4) if ((lparg4 = (*env)->GetByteArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetByteArrayElements(env, arg5, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_message_dialog_new((GtkWindow *)arg0, (GtkDialogFlags)arg1, (GtkMessageType)arg2, (GtkButtonsType)arg3, (const gchar *)lparg4, (const gchar *)lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseByteArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseByteArrayElements(env, arg4, lparg4, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1message_1dialog_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1native_1dialog_1show
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1native_1dialog_1show)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1native_1dialog_1show_FUNC);
	gtk_native_dialog_show((GtkNativeDialog *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1native_1dialog_1show_FUNC);
}
#endif

#ifndef NO_gtk_1notebook_1get_1current_1page
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1notebook_1get_1current_1page)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1get_1current_1page_FUNC);
	rc = (jint)gtk_notebook_get_current_page((GtkNotebook *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1get_1current_1page_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1notebook_1get_1n_1pages
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1notebook_1get_1n_1pages)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1get_1n_1pages_FUNC);
	rc = (jint)gtk_notebook_get_n_pages((GtkNotebook *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1get_1n_1pages_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1notebook_1get_1scrollable
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1notebook_1get_1scrollable)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1get_1scrollable_FUNC);
	rc = (jboolean)gtk_notebook_get_scrollable((GtkNotebook *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1get_1scrollable_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1notebook_1insert_1page
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1notebook_1insert_1page)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jint arg3)
{
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1insert_1page_FUNC);
	gtk_notebook_insert_page((GtkNotebook *)arg0, (GtkWidget *)arg1, (GtkWidget *)arg2, (gint)arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1insert_1page_FUNC);
}
#endif

#ifndef NO_gtk_1notebook_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1notebook_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1new_FUNC);
	rc = (jlong)gtk_notebook_new();
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1notebook_1next_1page
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1notebook_1next_1page)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1next_1page_FUNC);
	gtk_notebook_next_page((GtkNotebook *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1next_1page_FUNC);
}
#endif

#ifndef NO_gtk_1notebook_1prev_1page
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1notebook_1prev_1page)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1prev_1page_FUNC);
	gtk_notebook_prev_page((GtkNotebook *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1prev_1page_FUNC);
}
#endif

#ifndef NO_gtk_1notebook_1remove_1page
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1notebook_1remove_1page)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1remove_1page_FUNC);
	gtk_notebook_remove_page((GtkNotebook *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1remove_1page_FUNC);
}
#endif

#ifndef NO_gtk_1notebook_1set_1current_1page
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1notebook_1set_1current_1page)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1set_1current_1page_FUNC);
	gtk_notebook_set_current_page((GtkNotebook *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1set_1current_1page_FUNC);
}
#endif

#ifndef NO_gtk_1notebook_1set_1scrollable
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1notebook_1set_1scrollable)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1set_1scrollable_FUNC);
	gtk_notebook_set_scrollable((GtkNotebook *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1set_1scrollable_FUNC);
}
#endif

#ifndef NO_gtk_1notebook_1set_1show_1tabs
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1notebook_1set_1show_1tabs)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1set_1show_1tabs_FUNC);
	gtk_notebook_set_show_tabs((GtkNotebook *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1set_1show_1tabs_FUNC);
}
#endif

#ifndef NO_gtk_1notebook_1set_1tab_1pos
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1notebook_1set_1tab_1pos)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1notebook_1set_1tab_1pos_FUNC);
	gtk_notebook_set_tab_pos((GtkNotebook *)arg0, (GtkPositionType)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1notebook_1set_1tab_1pos_FUNC);
}
#endif

#ifndef NO_gtk_1orientable_1set_1orientation
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1orientable_1set_1orientation)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1orientable_1set_1orientation_FUNC);
	gtk_orientable_set_orientation((GtkOrientable *)arg0, (GtkOrientation)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1orientable_1set_1orientation_FUNC);
}
#endif

#ifndef NO_gtk_1page_1setup_1get_1bottom_1margin
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1page_1setup_1get_1bottom_1margin)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1get_1bottom_1margin_FUNC);
	rc = (jdouble)gtk_page_setup_get_bottom_margin((GtkPageSetup *)arg0, (GtkUnit)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1get_1bottom_1margin_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1get_1left_1margin
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1page_1setup_1get_1left_1margin)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1get_1left_1margin_FUNC);
	rc = (jdouble)gtk_page_setup_get_left_margin((GtkPageSetup *)arg0, (GtkUnit)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1get_1left_1margin_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1get_1orientation
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1page_1setup_1get_1orientation)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1get_1orientation_FUNC);
	rc = (jint)gtk_page_setup_get_orientation((GtkPageSetup *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1get_1orientation_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1get_1page_1height
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1page_1setup_1get_1page_1height)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1get_1page_1height_FUNC);
	rc = (jdouble)gtk_page_setup_get_page_height((GtkPageSetup *)arg0, (GtkUnit)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1get_1page_1height_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1get_1page_1width
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1page_1setup_1get_1page_1width)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1get_1page_1width_FUNC);
	rc = (jdouble)gtk_page_setup_get_page_width((GtkPageSetup *)arg0, (GtkUnit)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1get_1page_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1get_1paper_1height
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1page_1setup_1get_1paper_1height)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1get_1paper_1height_FUNC);
	rc = (jdouble)gtk_page_setup_get_paper_height((GtkPageSetup *)arg0, (GtkUnit)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1get_1paper_1height_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1get_1paper_1size
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1page_1setup_1get_1paper_1size)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1get_1paper_1size_FUNC);
	rc = (jlong)gtk_page_setup_get_paper_size((GtkPageSetup *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1get_1paper_1size_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1get_1paper_1width
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1page_1setup_1get_1paper_1width)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1get_1paper_1width_FUNC);
	rc = (jdouble)gtk_page_setup_get_paper_width((GtkPageSetup *)arg0, (GtkUnit)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1get_1paper_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1get_1right_1margin
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1page_1setup_1get_1right_1margin)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1get_1right_1margin_FUNC);
	rc = (jdouble)gtk_page_setup_get_right_margin((GtkPageSetup *)arg0, (GtkUnit)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1get_1right_1margin_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1get_1top_1margin
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1page_1setup_1get_1top_1margin)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1get_1top_1margin_FUNC);
	rc = (jdouble)gtk_page_setup_get_top_margin((GtkPageSetup *)arg0, (GtkUnit)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1get_1top_1margin_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1page_1setup_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1new_FUNC);
	rc = (jlong)gtk_page_setup_new();
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1page_1setup_1set_1bottom_1margin
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1page_1setup_1set_1bottom_1margin)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1set_1bottom_1margin_FUNC);
	gtk_page_setup_set_bottom_margin((GtkPageSetup *)arg0, (gdouble)arg1, (GtkUnit)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1set_1bottom_1margin_FUNC);
}
#endif

#ifndef NO_gtk_1page_1setup_1set_1left_1margin
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1page_1setup_1set_1left_1margin)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1set_1left_1margin_FUNC);
	gtk_page_setup_set_left_margin((GtkPageSetup *)arg0, (gdouble)arg1, (GtkUnit)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1set_1left_1margin_FUNC);
}
#endif

#ifndef NO_gtk_1page_1setup_1set_1orientation
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1page_1setup_1set_1orientation)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1set_1orientation_FUNC);
	gtk_page_setup_set_orientation((GtkPageSetup *)arg0, (GtkPageOrientation)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1set_1orientation_FUNC);
}
#endif

#ifndef NO_gtk_1page_1setup_1set_1paper_1size
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1page_1setup_1set_1paper_1size)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1set_1paper_1size_FUNC);
	gtk_page_setup_set_paper_size((GtkPageSetup *)arg0, (GtkPaperSize *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1set_1paper_1size_FUNC);
}
#endif

#ifndef NO_gtk_1page_1setup_1set_1right_1margin
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1page_1setup_1set_1right_1margin)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1set_1right_1margin_FUNC);
	gtk_page_setup_set_right_margin((GtkPageSetup *)arg0, (gdouble)arg1, (GtkUnit)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1set_1right_1margin_FUNC);
}
#endif

#ifndef NO_gtk_1page_1setup_1set_1top_1margin
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1page_1setup_1set_1top_1margin)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1page_1setup_1set_1top_1margin_FUNC);
	gtk_page_setup_set_top_margin((GtkPageSetup *)arg0, (gdouble)arg1, (GtkUnit)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1page_1setup_1set_1top_1margin_FUNC);
}
#endif

#ifndef NO_gtk_1paper_1size_1free
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1paper_1size_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1paper_1size_1free_FUNC);
	gtk_paper_size_free((GtkPaperSize *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1paper_1size_1free_FUNC);
}
#endif

#ifndef NO_gtk_1paper_1size_1get_1display_1name
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1paper_1size_1get_1display_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1paper_1size_1get_1display_1name_FUNC);
	rc = (jlong)gtk_paper_size_get_display_name((GtkPaperSize *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1paper_1size_1get_1display_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1paper_1size_1get_1height
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1paper_1size_1get_1height)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1paper_1size_1get_1height_FUNC);
	rc = (jdouble)gtk_paper_size_get_height((GtkPaperSize *)arg0, (GtkUnit)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1paper_1size_1get_1height_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1paper_1size_1get_1name
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1paper_1size_1get_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1paper_1size_1get_1name_FUNC);
	rc = (jlong)gtk_paper_size_get_name((GtkPaperSize *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1paper_1size_1get_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1paper_1size_1get_1ppd_1name
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1paper_1size_1get_1ppd_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1paper_1size_1get_1ppd_1name_FUNC);
	rc = (jlong)gtk_paper_size_get_ppd_name((GtkPaperSize *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1paper_1size_1get_1ppd_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1paper_1size_1get_1width
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1paper_1size_1get_1width)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1paper_1size_1get_1width_FUNC);
	rc = (jdouble)gtk_paper_size_get_width((GtkPaperSize *)arg0, (GtkUnit)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1paper_1size_1get_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1paper_1size_1is_1custom
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1paper_1size_1is_1custom)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1paper_1size_1is_1custom_FUNC);
	rc = (jboolean)gtk_paper_size_is_custom((GtkPaperSize *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1paper_1size_1is_1custom_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1paper_1size_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1paper_1size_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1paper_1size_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_paper_size_new((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1paper_1size_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1paper_1size_1new_1custom
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1paper_1size_1new_1custom)
	(JNIEnv *env, jclass that, jbyteArray arg0, jbyteArray arg1, jdouble arg2, jdouble arg3, jint arg4)
{
	jbyte *lparg0=NULL;
	jbyte *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1paper_1size_1new_1custom_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_paper_size_new_custom((const gchar *)lparg0, (const gchar *)lparg1, (gdouble)arg2, (gdouble)arg3, (GtkUnit)arg4);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1paper_1size_1new_1custom_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1paper_1size_1new_1from_1ppd
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1paper_1size_1new_1from_1ppd)
	(JNIEnv *env, jclass that, jbyteArray arg0, jbyteArray arg1, jdouble arg2, jdouble arg3)
{
	jbyte *lparg0=NULL;
	jbyte *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1paper_1size_1new_1from_1ppd_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_paper_size_new_from_ppd((const gchar *)lparg0, (const gchar *)lparg1, (gdouble)arg2, (gdouble)arg3);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1paper_1size_1new_1from_1ppd_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1plug_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1plug_1new)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1plug_1new_FUNC);
	rc = (jlong)gtk_plug_new(arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1plug_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1popover_1popdown
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1popover_1popdown)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1popover_1popdown_FUNC);
	gtk_popover_popdown((GtkPopover *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1popover_1popdown_FUNC);
}
#endif

#ifndef NO_gtk_1popover_1popup
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1popover_1popup)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1popover_1popup_FUNC);
	gtk_popover_popup((GtkPopover *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1popover_1popup_FUNC);
}
#endif

#ifndef NO_gtk_1popover_1set_1pointing_1to
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1popover_1set_1pointing_1to)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1popover_1set_1pointing_1to_FUNC);
	if (arg1) if ((lparg1 = getGdkRectangleFields(env, arg1, &_arg1)) == NULL) goto fail;
	gtk_popover_set_pointing_to((GtkPopover *)arg0, (const GdkRectangle *)lparg1);
fail:
	if (arg1 && lparg1) setGdkRectangleFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1popover_1set_1pointing_1to_FUNC);
}
#endif

#ifndef NO_gtk_1popover_1set_1position
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1popover_1set_1position)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1popover_1set_1position_FUNC);
	gtk_popover_set_position((GtkPopover *)arg0, (GtkPositionType)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1popover_1set_1position_FUNC);
}
#endif

#ifndef NO_gtk_1print_1job_1get_1surface
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1print_1job_1get_1surface)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1job_1get_1surface_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_print_job_get_surface((GtkPrintJob *)arg0, (GError **)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1job_1get_1surface_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1job_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1print_1job_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1, jlong arg2, jlong arg3)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1job_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_print_job_new((const gchar *)lparg0, (GtkPrinter *)arg1, (GtkPrintSettings *)arg2, (GtkPageSetup *)arg3);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1job_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1job_1send
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1job_1send)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1job_1send_FUNC);
	gtk_print_job_send((GtkPrintJob *)arg0, (GtkPrintJobCompleteFunc)arg1, (gpointer)arg2, (GDestroyNotify)arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1job_1send_FUNC);
}
#endif

#ifndef NO_gtk_1print_1settings_1foreach
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1settings_1foreach)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1foreach_FUNC);
	gtk_print_settings_foreach((GtkPrintSettings *)arg0, (GtkPrintSettingsFunc)arg1, (gpointer)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1foreach_FUNC);
}
#endif

#ifndef NO_gtk_1print_1settings_1get
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1print_1settings_1get)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1get_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_print_settings_get((GtkPrintSettings *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1get_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1settings_1get_1collate
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1print_1settings_1get_1collate)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1get_1collate_FUNC);
	rc = (jboolean)gtk_print_settings_get_collate((GtkPrintSettings *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1get_1collate_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1settings_1get_1duplex
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1print_1settings_1get_1duplex)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1get_1duplex_FUNC);
	rc = (jint)gtk_print_settings_get_duplex((GtkPrintSettings *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1get_1duplex_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1settings_1get_1n_1copies
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1print_1settings_1get_1n_1copies)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1get_1n_1copies_FUNC);
	rc = (jint)gtk_print_settings_get_n_copies((GtkPrintSettings *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1get_1n_1copies_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1settings_1get_1page_1ranges
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1print_1settings_1get_1page_1ranges)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1get_1page_1ranges_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_print_settings_get_page_ranges((GtkPrintSettings *)arg0, (gint *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1get_1page_1ranges_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1settings_1get_1print_1pages
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1print_1settings_1get_1print_1pages)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1get_1print_1pages_FUNC);
	rc = (jint)gtk_print_settings_get_print_pages((GtkPrintSettings *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1get_1print_1pages_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1settings_1get_1resolution
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1print_1settings_1get_1resolution)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1get_1resolution_FUNC);
	rc = (jint)gtk_print_settings_get_resolution((GtkPrintSettings *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1get_1resolution_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1settings_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1print_1settings_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1new_FUNC);
	rc = (jlong)gtk_print_settings_new();
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1settings_1set
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1settings_1set)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1set_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_print_settings_set((GtkPrintSettings *)arg0, (const gchar *)lparg1, (const gchar *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1set_FUNC);
}
#endif

#ifndef NO_gtk_1print_1settings_1set_1collate
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1settings_1set_1collate)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1set_1collate_FUNC);
	gtk_print_settings_set_collate((GtkPrintSettings *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1set_1collate_FUNC);
}
#endif

#ifndef NO_gtk_1print_1settings_1set_1duplex
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1settings_1set_1duplex)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1set_1duplex_FUNC);
	gtk_print_settings_set_duplex((GtkPrintSettings *)arg0, (GtkPrintDuplex)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1set_1duplex_FUNC);
}
#endif

#ifndef NO_gtk_1print_1settings_1set_1n_1copies
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1settings_1set_1n_1copies)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1set_1n_1copies_FUNC);
	gtk_print_settings_set_n_copies((GtkPrintSettings *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1set_1n_1copies_FUNC);
}
#endif

#ifndef NO_gtk_1print_1settings_1set_1orientation
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1settings_1set_1orientation)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1set_1orientation_FUNC);
	gtk_print_settings_set_orientation((GtkPrintSettings *)arg0, (GtkPageOrientation)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1set_1orientation_FUNC);
}
#endif

#ifndef NO_gtk_1print_1settings_1set_1page_1ranges
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1settings_1set_1page_1ranges)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jint arg2)
{
	jint *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1set_1page_1ranges_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_print_settings_set_page_ranges((GtkPrintSettings *)arg0, (GtkPageRange *)lparg1, (gint)arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1set_1page_1ranges_FUNC);
}
#endif

#ifndef NO_gtk_1print_1settings_1set_1print_1pages
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1settings_1set_1print_1pages)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1set_1print_1pages_FUNC);
	gtk_print_settings_set_print_pages((GtkPrintSettings *)arg0, (GtkPrintPages)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1set_1print_1pages_FUNC);
}
#endif

#ifndef NO_gtk_1print_1settings_1set_1printer
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1settings_1set_1printer)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1settings_1set_1printer_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_print_settings_set_printer((GtkPrintSettings *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1settings_1set_1printer_FUNC);
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1get_1current_1page
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1get_1current_1page)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1get_1current_1page_FUNC);
	rc = (jint)gtk_print_unix_dialog_get_current_page((GtkPrintUnixDialog *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1get_1current_1page_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1get_1page_1setup
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1get_1page_1setup)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1get_1page_1setup_FUNC);
	rc = (jlong)gtk_print_unix_dialog_get_page_setup((GtkPrintUnixDialog *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1get_1page_1setup_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1get_1selected_1printer
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1get_1selected_1printer)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1get_1selected_1printer_FUNC);
	rc = (jlong)gtk_print_unix_dialog_get_selected_printer((GtkPrintUnixDialog *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1get_1selected_1printer_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1get_1settings
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1get_1settings)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1get_1settings_FUNC);
	rc = (jlong)gtk_print_unix_dialog_get_settings((GtkPrintUnixDialog *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1get_1settings_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_print_unix_dialog_new((const gchar *)lparg0, (GtkWindow *)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1set_1current_1page
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1set_1current_1page)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1set_1current_1page_FUNC);
	gtk_print_unix_dialog_set_current_page((GtkPrintUnixDialog *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1set_1current_1page_FUNC);
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1set_1embed_1page_1setup
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1set_1embed_1page_1setup)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1set_1embed_1page_1setup_FUNC);
	gtk_print_unix_dialog_set_embed_page_setup((GtkPrintUnixDialog *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1set_1embed_1page_1setup_FUNC);
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1set_1has_1selection
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1set_1has_1selection)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1set_1has_1selection_FUNC);
	gtk_print_unix_dialog_set_has_selection((GtkPrintUnixDialog *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1set_1has_1selection_FUNC);
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1set_1manual_1capabilities
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1set_1manual_1capabilities)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1set_1manual_1capabilities_FUNC);
	gtk_print_unix_dialog_set_manual_capabilities((GtkPrintUnixDialog *)arg0, (GtkPrintCapabilities)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1set_1manual_1capabilities_FUNC);
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1set_1page_1setup
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1set_1page_1setup)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1set_1page_1setup_FUNC);
	gtk_print_unix_dialog_set_page_setup((GtkPrintUnixDialog *)arg0, (GtkPageSetup *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1set_1page_1setup_FUNC);
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1set_1settings
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1set_1settings)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1set_1settings_FUNC);
	gtk_print_unix_dialog_set_settings((GtkPrintUnixDialog *)arg0, (GtkPrintSettings *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1set_1settings_FUNC);
}
#endif

#ifndef NO_gtk_1print_1unix_1dialog_1set_1support_1selection
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1print_1unix_1dialog_1set_1support_1selection)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1print_1unix_1dialog_1set_1support_1selection_FUNC);
	gtk_print_unix_dialog_set_support_selection((GtkPrintUnixDialog *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1print_1unix_1dialog_1set_1support_1selection_FUNC);
}
#endif

#ifndef NO_gtk_1printer_1get_1backend
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1printer_1get_1backend)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1printer_1get_1backend_FUNC);
	rc = (jlong)gtk_printer_get_backend((GtkPrinter *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1printer_1get_1backend_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1printer_1get_1name
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1printer_1get_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1printer_1get_1name_FUNC);
	rc = (jlong)gtk_printer_get_name((GtkPrinter *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1printer_1get_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1printer_1is_1default
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1printer_1is_1default)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1printer_1is_1default_FUNC);
	rc = (jboolean)gtk_printer_is_default((GtkPrinter *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1printer_1is_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1printer_1option_1widget_1get_1type
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1printer_1option_1widget_1get_1type)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1printer_1option_1widget_1get_1type_FUNC);
/*
	rc = (jlong)gtk_printer_option_widget_get_type();
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_printer_option_widget_get_type)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1printer_1option_1widget_1get_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1progress_1bar_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1progress_1bar_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1progress_1bar_1new_FUNC);
	rc = (jlong)gtk_progress_bar_new();
	GTK_NATIVE_EXIT(env, that, gtk_1progress_1bar_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1progress_1bar_1pulse
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1progress_1bar_1pulse)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1progress_1bar_1pulse_FUNC);
	gtk_progress_bar_pulse((GtkProgressBar *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1progress_1bar_1pulse_FUNC);
}
#endif

#ifndef NO_gtk_1progress_1bar_1set_1fraction
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1progress_1bar_1set_1fraction)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1progress_1bar_1set_1fraction_FUNC);
	gtk_progress_bar_set_fraction((GtkProgressBar *)arg0, (gdouble)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1progress_1bar_1set_1fraction_FUNC);
}
#endif

#ifndef NO_gtk_1progress_1bar_1set_1inverted
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1progress_1bar_1set_1inverted)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1progress_1bar_1set_1inverted_FUNC);
	gtk_progress_bar_set_inverted((GtkProgressBar *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1progress_1bar_1set_1inverted_FUNC);
}
#endif

#ifndef NO_gtk_1range_1get_1adjustment
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1range_1get_1adjustment)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1range_1get_1adjustment_FUNC);
	rc = (jlong)gtk_range_get_adjustment((GtkRange *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1range_1get_1adjustment_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1range_1get_1slider_1range
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1range_1get_1slider_1range)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1range_1get_1slider_1range_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_range_get_slider_range((GtkRange *)arg0, (gint *)lparg1, (gint *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1range_1get_1slider_1range_FUNC);
}
#endif

#ifndef NO_gtk_1range_1get_1value
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1range_1get_1value)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1range_1get_1value_FUNC);
	rc = (jdouble)gtk_range_get_value((GtkRange *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1range_1get_1value_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1range_1set_1increments
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1range_1set_1increments)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jdouble arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1range_1set_1increments_FUNC);
	gtk_range_set_increments((GtkRange *)arg0, arg1, arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1range_1set_1increments_FUNC);
}
#endif

#ifndef NO_gtk_1range_1set_1inverted
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1range_1set_1inverted)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1range_1set_1inverted_FUNC);
	gtk_range_set_inverted((GtkRange *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1range_1set_1inverted_FUNC);
}
#endif

#ifndef NO_gtk_1range_1set_1range
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1range_1set_1range)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jdouble arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1range_1set_1range_FUNC);
	gtk_range_set_range((GtkRange *)arg0, arg1, arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1range_1set_1range_FUNC);
}
#endif

#ifndef NO_gtk_1range_1set_1value
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1range_1set_1value)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1range_1set_1value_FUNC);
	gtk_range_set_value((GtkRange *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1range_1set_1value_FUNC);
}
#endif

#ifndef NO_gtk_1render_1background
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1render_1background)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3, jdouble arg4, jdouble arg5)
{
	GTK_NATIVE_ENTER(env, that, gtk_1render_1background_FUNC);
	gtk_render_background((GtkStyleContext *)arg0, (cairo_t *)arg1, (gdouble)arg2, (gdouble)arg3, (gdouble)arg4, (gdouble)arg5);
	GTK_NATIVE_EXIT(env, that, gtk_1render_1background_FUNC);
}
#endif

#ifndef NO_gtk_1render_1focus
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1render_1focus)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3, jdouble arg4, jdouble arg5)
{
	GTK_NATIVE_ENTER(env, that, gtk_1render_1focus_FUNC);
	gtk_render_focus((GtkStyleContext *)arg0, (cairo_t *)arg1, (gdouble)arg2, (gdouble)arg3, (gdouble)arg4, (gdouble)arg5);
	GTK_NATIVE_EXIT(env, that, gtk_1render_1focus_FUNC);
}
#endif

#ifndef NO_gtk_1render_1frame
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1render_1frame)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3, jdouble arg4, jdouble arg5)
{
	GTK_NATIVE_ENTER(env, that, gtk_1render_1frame_FUNC);
	gtk_render_frame((GtkStyleContext *)arg0, (cairo_t *)arg1, (gdouble)arg2, (gdouble)arg3, (gdouble)arg4, (gdouble)arg5);
	GTK_NATIVE_EXIT(env, that, gtk_1render_1frame_FUNC);
}
#endif

#ifndef NO_gtk_1render_1handle
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1render_1handle)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3, jdouble arg4, jdouble arg5)
{
	GTK_NATIVE_ENTER(env, that, gtk_1render_1handle_FUNC);
	gtk_render_handle((GtkStyleContext *)arg0, (cairo_t *)arg1, (gdouble)arg2, (gdouble)arg3, (gdouble)arg4, (gdouble)arg5);
	GTK_NATIVE_EXIT(env, that, gtk_1render_1handle_FUNC);
}
#endif

#ifndef NO_gtk_1scale_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1scale_1new)
	(JNIEnv *env, jclass that, jint arg0, jlong arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scale_1new_FUNC);
	rc = (jlong)gtk_scale_new((GtkOrientation)arg0, (GtkAdjustment *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1scale_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1scale_1set_1digits
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scale_1set_1digits)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1scale_1set_1digits_FUNC);
	gtk_scale_set_digits((GtkScale *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1scale_1set_1digits_FUNC);
}
#endif

#ifndef NO_gtk_1scale_1set_1draw_1value
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scale_1set_1draw_1value)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1scale_1set_1draw_1value_FUNC);
	gtk_scale_set_draw_value((GtkScale *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1scale_1set_1draw_1value_FUNC);
}
#endif

#ifndef NO_gtk_1scrollable_1get_1vadjustment
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1scrollable_1get_1vadjustment)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scrollable_1get_1vadjustment_FUNC);
	rc = (jlong)gtk_scrollable_get_vadjustment((GtkScrollable *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1scrollable_1get_1vadjustment_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1scrollbar_1get_1adjustment
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1scrollbar_1get_1adjustment)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scrollbar_1get_1adjustment_FUNC);
/*
	rc = (jlong)gtk_scrollbar_get_adjustment((GtkScrollbar *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_scrollbar_get_adjustment)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkScrollbar *))fp)((GtkScrollbar *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1scrollbar_1get_1adjustment_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1scrollbar_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1scrollbar_1new)
	(JNIEnv *env, jclass that, jint arg0, jlong arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scrollbar_1new_FUNC);
	rc = (jlong)gtk_scrollbar_new((GtkOrientation)arg0, (GtkAdjustment *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1scrollbar_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1scrolled_1window_1get_1hadjustment
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1scrolled_1window_1get_1hadjustment)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1get_1hadjustment_FUNC);
	rc = (jlong)gtk_scrolled_window_get_hadjustment((GtkScrolledWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1get_1hadjustment_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1scrolled_1window_1get_1hscrollbar
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1scrolled_1window_1get_1hscrollbar)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1get_1hscrollbar_FUNC);
	rc = (jlong)gtk_scrolled_window_get_hscrollbar((GtkScrolledWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1get_1hscrollbar_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1scrolled_1window_1get_1overlay_1scrolling
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1scrolled_1window_1get_1overlay_1scrolling)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1get_1overlay_1scrolling_FUNC);
/*
	rc = (jboolean)gtk_scrolled_window_get_overlay_scrolling((GtkScrolledWindow *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_scrolled_window_get_overlay_scrolling)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GtkScrolledWindow *))fp)((GtkScrolledWindow *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1get_1overlay_1scrolling_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1scrolled_1window_1get_1policy
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scrolled_1window_1get_1policy)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1get_1policy_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_scrolled_window_get_policy((GtkScrolledWindow *)arg0, (GtkPolicyType *)lparg1, (GtkPolicyType *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1get_1policy_FUNC);
}
#endif

#ifndef NO_gtk_1scrolled_1window_1get_1vadjustment
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1scrolled_1window_1get_1vadjustment)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1get_1vadjustment_FUNC);
	rc = (jlong)gtk_scrolled_window_get_vadjustment((GtkScrolledWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1get_1vadjustment_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1scrolled_1window_1get_1vscrollbar
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1scrolled_1window_1get_1vscrollbar)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1get_1vscrollbar_FUNC);
	rc = (jlong)gtk_scrolled_window_get_vscrollbar((GtkScrolledWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1get_1vscrollbar_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1scrolled_1window_1set_1hadjustment
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scrolled_1window_1set_1hadjustment)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1set_1hadjustment_FUNC);
	gtk_scrolled_window_set_hadjustment((GtkScrolledWindow *)arg0, (GtkAdjustment *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1set_1hadjustment_FUNC);
}
#endif

#ifndef NO_gtk_1scrolled_1window_1set_1policy
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scrolled_1window_1set_1policy)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1set_1policy_FUNC);
	gtk_scrolled_window_set_policy((GtkScrolledWindow *)arg0, (GtkPolicyType)arg1, (GtkPolicyType)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1set_1policy_FUNC);
}
#endif

#ifndef NO_gtk_1scrolled_1window_1set_1vadjustment
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scrolled_1window_1set_1vadjustment)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1set_1vadjustment_FUNC);
	gtk_scrolled_window_set_vadjustment((GtkScrolledWindow *)arg0, (GtkAdjustment *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1set_1vadjustment_FUNC);
}
#endif

#ifndef NO_gtk_1search_1entry_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1search_1entry_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1search_1entry_1new_FUNC);
	rc = (jlong)gtk_search_entry_new();
	GTK_NATIVE_EXIT(env, that, gtk_1search_1entry_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1separator_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1separator_1new)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1separator_1new_FUNC);
	rc = (jlong)gtk_separator_new((GtkOrientation)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1separator_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1settings_1get_1default
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1settings_1get_1default)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1settings_1get_1default_FUNC);
	rc = (jlong)gtk_settings_get_default();
	GTK_NATIVE_EXIT(env, that, gtk_1settings_1get_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1snapshot_1append_1cairo
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1snapshot_1append_1cairo)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1snapshot_1append_1cairo_FUNC);
	rc = (jlong)gtk_snapshot_append_cairo((GtkSnapshot *)arg0, (const graphene_rect_t *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1snapshot_1append_1cairo_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1socket_1get_1id
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1socket_1get_1id)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1socket_1get_1id_FUNC);
	rc = (jlong)gtk_socket_get_id((GtkSocket *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1socket_1get_1id_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1socket_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1socket_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1socket_1new_FUNC);
	rc = (jlong)gtk_socket_new();
	GTK_NATIVE_EXIT(env, that, gtk_1socket_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1spin_1button_1configure
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1spin_1button_1configure)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jint arg3)
{
	GTK_NATIVE_ENTER(env, that, gtk_1spin_1button_1configure_FUNC);
	gtk_spin_button_configure((GtkSpinButton*)arg0, (GtkAdjustment *)arg1, arg2, arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1spin_1button_1configure_FUNC);
}
#endif

#ifndef NO_gtk_1spin_1button_1get_1adjustment
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1spin_1button_1get_1adjustment)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1spin_1button_1get_1adjustment_FUNC);
	rc = (jlong)gtk_spin_button_get_adjustment((GtkSpinButton*)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1spin_1button_1get_1adjustment_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1spin_1button_1get_1digits
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1spin_1button_1get_1digits)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1spin_1button_1get_1digits_FUNC);
	rc = (jint)gtk_spin_button_get_digits((GtkSpinButton*)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1spin_1button_1get_1digits_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1spin_1button_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1spin_1button_1new)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jint arg2)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1spin_1button_1new_FUNC);
	rc = (jlong)gtk_spin_button_new((GtkAdjustment *)arg0, arg1, arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1spin_1button_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1spin_1button_1set_1increments
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1spin_1button_1set_1increments)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jdouble arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1spin_1button_1set_1increments_FUNC);
	gtk_spin_button_set_increments((GtkSpinButton*)arg0, arg1, arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1spin_1button_1set_1increments_FUNC);
}
#endif

#ifndef NO_gtk_1spin_1button_1set_1numeric
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1spin_1button_1set_1numeric)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1spin_1button_1set_1numeric_FUNC);
	gtk_spin_button_set_numeric((GtkSpinButton*)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1spin_1button_1set_1numeric_FUNC);
}
#endif

#ifndef NO_gtk_1spin_1button_1set_1range
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1spin_1button_1set_1range)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1, jdouble arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1spin_1button_1set_1range_FUNC);
	gtk_spin_button_set_range((GtkSpinButton*)arg0, arg1, arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1spin_1button_1set_1range_FUNC);
}
#endif

#ifndef NO_gtk_1spin_1button_1set_1value
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1spin_1button_1set_1value)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1spin_1button_1set_1value_FUNC);
	gtk_spin_button_set_value((GtkSpinButton*)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1spin_1button_1set_1value_FUNC);
}
#endif

#ifndef NO_gtk_1spin_1button_1set_1wrap
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1spin_1button_1set_1wrap)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1spin_1button_1set_1wrap_FUNC);
	gtk_spin_button_set_wrap((GtkSpinButton*)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1spin_1button_1set_1wrap_FUNC);
}
#endif

#ifndef NO_gtk_1spin_1button_1update
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1spin_1button_1update)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1spin_1button_1update_FUNC);
	gtk_spin_button_update((GtkSpinButton*)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1spin_1button_1update_FUNC);
}
#endif

#ifndef NO_gtk_1status_1icon_1get_1geometry
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1status_1icon_1get_1geometry)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jlong arg3)
{
	GdkRectangle _arg2, *lparg2=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1status_1icon_1get_1geometry_FUNC);
	if (arg2) if ((lparg2 = getGdkRectangleFields(env, arg2, &_arg2)) == NULL) goto fail;
	rc = (jboolean)gtk_status_icon_get_geometry((GtkStatusIcon*)arg0, (GdkScreen**)arg1, (GdkRectangle*)lparg2, (GtkOrientation*)arg3);
fail:
	if (arg2 && lparg2) setGdkRectangleFields(env, arg2, lparg2);
	GTK_NATIVE_EXIT(env, that, gtk_1status_1icon_1get_1geometry_FUNC);
	return rc;
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_gtk_1status_1icon_1position_1menu_1func
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1status_1icon_1position_1menu_1func)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1status_1icon_1position_1menu_1func_FUNC);
	rc = (jlong)gtk_status_icon_position_menu_func();
	GTK_NATIVE_EXIT(env, that, gtk_1status_1icon_1position_1menu_1func_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1style_1context_1add_1class
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1add_1class)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1add_1class_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_style_context_add_class((GtkStyleContext *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1add_1class_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1add_1provider
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1add_1provider)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1add_1provider_FUNC);
	gtk_style_context_add_provider((GtkStyleContext *)arg0, (GtkStyleProvider *)arg1, (guint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1add_1provider_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1add_1provider_1for_1display
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1add_1provider_1for_1display)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1add_1provider_1for_1display_FUNC);
/*
	gtk_style_context_add_provider_for_display((GdkDisplay *)arg0, (GtkStyleProvider *)arg1, (guint)arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_add_provider_for_display)
		if (fp) {
			((void (CALLING_CONVENTION*)(GdkDisplay *, GtkStyleProvider *, guint))fp)((GdkDisplay *)arg0, (GtkStyleProvider *)arg1, (guint)arg2);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1add_1provider_1for_1display_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1add_1provider_1for_1screen
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1add_1provider_1for_1screen)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1add_1provider_1for_1screen_FUNC);
	gtk_style_context_add_provider_for_screen((GdkScreen *)arg0, (GtkStyleProvider *)arg1, (guint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1add_1provider_1for_1screen_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1get__JI_3B_3JJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1get__JI_3B_3JJ)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jbyteArray arg2, jlongArray arg3, jlong arg4)
{
	jbyte *lparg2=NULL;
	jlong *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get__JI_3B_3JJ_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetLongArrayElements(env, arg3, NULL)) == NULL) goto fail;
/*
	gtk_style_context_get(arg0, arg1, (const gchar *)lparg2, lparg3, (const gchar *)NULL);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_get)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jint, const gchar *, jlong *, const gchar *))fp)(arg0, arg1, (const gchar *)lparg2, lparg3, (const gchar *)NULL);
		}
	}
fail:
	if (arg3 && lparg3) (*env)->ReleaseLongArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, JNI_ABORT);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get__JI_3B_3JJ_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1get__J_3B_3JJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1get__J_3B_3JJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlongArray arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	jlong *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get__J_3B_3JJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	gtk_style_context_get(arg0, (const gchar *)lparg1, lparg2, (const gchar *)NULL);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_get)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, const gchar *, jlong *, const gchar *))fp)(arg0, (const gchar *)lparg1, lparg2, (const gchar *)NULL);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get__J_3B_3JJ_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1get_1border__JILorg_eclipse_swt_internal_gtk_GtkBorder_2
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1get_1border__JILorg_eclipse_swt_internal_gtk_GtkBorder_2)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jobject arg2)
{
	GtkBorder _arg2, *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get_1border__JILorg_eclipse_swt_internal_gtk_GtkBorder_2_FUNC);
	if (arg2) if ((lparg2 = &_arg2) == NULL) goto fail;
/*
	gtk_style_context_get_border((GtkStyleContext *)arg0, (GtkStateFlags)arg1, (GtkBorder *)lparg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_get_border)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkStyleContext *, GtkStateFlags, GtkBorder *))fp)((GtkStyleContext *)arg0, (GtkStateFlags)arg1, (GtkBorder *)lparg2);
		}
	}
fail:
	if (arg2 && lparg2) setGtkBorderFields(env, arg2, lparg2);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get_1border__JILorg_eclipse_swt_internal_gtk_GtkBorder_2_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1get_1border__JLorg_eclipse_swt_internal_gtk_GtkBorder_2
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1get_1border__JLorg_eclipse_swt_internal_gtk_GtkBorder_2)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GtkBorder _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get_1border__JLorg_eclipse_swt_internal_gtk_GtkBorder_2_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
/*
	gtk_style_context_get_border((GtkStyleContext *)arg0, (GtkBorder *)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_get_border)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkStyleContext *, GtkBorder *))fp)((GtkStyleContext *)arg0, (GtkBorder *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) setGtkBorderFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get_1border__JLorg_eclipse_swt_internal_gtk_GtkBorder_2_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1get_1color__JILorg_eclipse_swt_internal_gtk_GdkRGBA_2
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1get_1color__JILorg_eclipse_swt_internal_gtk_GdkRGBA_2)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jobject arg2)
{
	GdkRGBA _arg2, *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get_1color__JILorg_eclipse_swt_internal_gtk_GdkRGBA_2_FUNC);
	if (arg2) if ((lparg2 = getGdkRGBAFields(env, arg2, &_arg2)) == NULL) goto fail;
/*
	gtk_style_context_get_color((GtkStyleContext *)arg0, (GtkStateFlags)arg1, (GdkRGBA *)lparg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_get_color)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkStyleContext *, GtkStateFlags, GdkRGBA *))fp)((GtkStyleContext *)arg0, (GtkStateFlags)arg1, (GdkRGBA *)lparg2);
		}
	}
fail:
	if (arg2 && lparg2) setGdkRGBAFields(env, arg2, lparg2);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get_1color__JILorg_eclipse_swt_internal_gtk_GdkRGBA_2_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1get_1color__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1get_1color__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRGBA _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get_1color__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2_FUNC);
	if (arg1) if ((lparg1 = getGdkRGBAFields(env, arg1, &_arg1)) == NULL) goto fail;
/*
	gtk_style_context_get_color((GtkStyleContext *)arg0, (GdkRGBA *)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_get_color)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkStyleContext *, GdkRGBA *))fp)((GtkStyleContext *)arg0, (GdkRGBA *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) setGdkRGBAFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get_1color__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1get_1font
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1style_1context_1get_1font)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get_1font_FUNC);
/*
	rc = (jlong)gtk_style_context_get_font(arg0, arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_get_font)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong, jint))fp)(arg0, arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get_1font_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1style_1context_1get_1margin
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1get_1margin)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GtkBorder _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get_1margin_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
	gtk_style_context_get_margin((GtkStyleContext *)arg0, (GtkBorder *)lparg1);
fail:
	if (arg1 && lparg1) setGtkBorderFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get_1margin_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1get_1padding__JILorg_eclipse_swt_internal_gtk_GtkBorder_2
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1get_1padding__JILorg_eclipse_swt_internal_gtk_GtkBorder_2)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jobject arg2)
{
	GtkBorder _arg2, *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get_1padding__JILorg_eclipse_swt_internal_gtk_GtkBorder_2_FUNC);
	if (arg2) if ((lparg2 = &_arg2) == NULL) goto fail;
/*
	gtk_style_context_get_padding((GtkStyleContext *)arg0, (GtkStateFlags)arg1, (GtkBorder *)lparg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_get_padding)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkStyleContext *, GtkStateFlags, GtkBorder *))fp)((GtkStyleContext *)arg0, (GtkStateFlags)arg1, (GtkBorder *)lparg2);
		}
	}
fail:
	if (arg2 && lparg2) setGtkBorderFields(env, arg2, lparg2);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get_1padding__JILorg_eclipse_swt_internal_gtk_GtkBorder_2_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1get_1padding__JLorg_eclipse_swt_internal_gtk_GtkBorder_2
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1get_1padding__JLorg_eclipse_swt_internal_gtk_GtkBorder_2)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GtkBorder _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get_1padding__JLorg_eclipse_swt_internal_gtk_GtkBorder_2_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
/*
	gtk_style_context_get_padding((GtkStyleContext *)arg0, (GtkBorder *)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_get_padding)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkStyleContext *, GtkBorder *))fp)((GtkStyleContext *)arg0, (GtkBorder *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) setGtkBorderFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get_1padding__JLorg_eclipse_swt_internal_gtk_GtkBorder_2_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1get_1parent
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1style_1context_1get_1parent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1get_1parent_FUNC);
/*
	rc = (jlong)gtk_style_context_get_parent((GtkStyleContext *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_get_parent)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkStyleContext *))fp)((GtkStyleContext *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1get_1parent_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1style_1context_1invalidate
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1invalidate)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1invalidate_FUNC);
/*
	gtk_style_context_invalidate(arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_style_context_invalidate)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong))fp)(arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1invalidate_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1remove_1class
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1remove_1class)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1remove_1class_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_style_context_remove_class((GtkStyleContext *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1remove_1class_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1restore
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1restore)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1restore_FUNC);
	gtk_style_context_restore((GtkStyleContext *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1restore_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1save
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1save)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1save_FUNC);
	gtk_style_context_save((GtkStyleContext *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1save_FUNC);
}
#endif

#ifndef NO_gtk_1style_1context_1set_1state
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1style_1context_1set_1state)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1style_1context_1set_1state_FUNC);
	gtk_style_context_set_state((GtkStyleContext *)arg0, (GtkStateFlags)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1style_1context_1set_1state_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1copy_1clipboard
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1copy_1clipboard)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1copy_1clipboard_FUNC);
/*
	gtk_text_buffer_copy_clipboard((GtkTextBuffer *)arg0, arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_text_buffer_copy_clipboard)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkTextBuffer *, jlong))fp)((GtkTextBuffer *)arg0, arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1copy_1clipboard_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1create_1mark
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1text_1buffer_1create_1mark)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2, jboolean arg3)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1create_1mark_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_text_buffer_create_mark((GtkTextBuffer *)arg0, (const gchar *)lparg1, (GtkTextIter *)lparg2, (gboolean)arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1create_1mark_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1buffer_1cut_1clipboard
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1cut_1clipboard)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1cut_1clipboard_FUNC);
/*
	gtk_text_buffer_cut_clipboard((GtkTextBuffer *)arg0, arg1, (gboolean)arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_text_buffer_cut_clipboard)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkTextBuffer *, jlong, gboolean))fp)((GtkTextBuffer *)arg0, arg1, (gboolean)arg2);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1cut_1clipboard_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1delete
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1delete)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1delete_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_text_buffer_delete((GtkTextBuffer *)arg0, (GtkTextIter *)lparg1, (GtkTextIter *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1delete_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1get_1bounds
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1get_1bounds)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1get_1bounds_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_text_buffer_get_bounds((GtkTextBuffer *)arg0, (GtkTextIter *)lparg1, (GtkTextIter *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1get_1bounds_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1get_1end_1iter
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1get_1end_1iter)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1get_1end_1iter_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_text_buffer_get_end_iter((GtkTextBuffer *)arg0, (GtkTextIter *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1get_1end_1iter_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1get_1insert
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1text_1buffer_1get_1insert)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1get_1insert_FUNC);
	rc = (jlong)gtk_text_buffer_get_insert((GtkTextBuffer *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1get_1insert_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1buffer_1get_1iter_1at_1line
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1get_1iter_1at_1line)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1get_1iter_1at_1line_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_text_buffer_get_iter_at_line((GtkTextBuffer *)arg0, (GtkTextIter *)lparg1, (gint)arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1get_1iter_1at_1line_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1get_1iter_1at_1mark
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1get_1iter_1at_1mark)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1get_1iter_1at_1mark_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_text_buffer_get_iter_at_mark((GtkTextBuffer *)arg0, (GtkTextIter *)lparg1, (GtkTextMark *)arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1get_1iter_1at_1mark_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1get_1iter_1at_1offset
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1get_1iter_1at_1offset)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1get_1iter_1at_1offset_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_text_buffer_get_iter_at_offset((GtkTextBuffer *)arg0, (GtkTextIter *)lparg1, (gint)arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1get_1iter_1at_1offset_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1get_1line_1count
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1text_1buffer_1get_1line_1count)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1get_1line_1count_FUNC);
	rc = (jint)gtk_text_buffer_get_line_count((GtkTextBuffer *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1get_1line_1count_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1buffer_1get_1selection_1bound
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1text_1buffer_1get_1selection_1bound)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1get_1selection_1bound_FUNC);
	rc = (jlong)gtk_text_buffer_get_selection_bound((GtkTextBuffer *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1get_1selection_1bound_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1buffer_1get_1selection_1bounds
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1text_1buffer_1get_1selection_1bounds)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1get_1selection_1bounds_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jboolean)gtk_text_buffer_get_selection_bounds((GtkTextBuffer *)arg0, (GtkTextIter *)lparg1, (GtkTextIter *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1get_1selection_1bounds_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1buffer_1get_1text
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1text_1buffer_1get_1text)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2, jboolean arg3)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1get_1text_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_text_buffer_get_text((GtkTextBuffer *)arg0, (GtkTextIter *)lparg1, (GtkTextIter *)lparg2, (gboolean)arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1get_1text_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1buffer_1insert__JJ_3BI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1insert__JJ_3BI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jbyteArray arg2, jint arg3)
{
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1insert__JJ_3BI_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_text_buffer_insert((GtkTextBuffer *)arg0, (GtkTextIter *)arg1, (const gchar *)lparg2, (gint)arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1insert__JJ_3BI_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1insert__J_3B_3BI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1insert__J_3B_3BI)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2, jint arg3)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1insert__J_3B_3BI_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_text_buffer_insert((GtkTextBuffer *)arg0, (GtkTextIter *)lparg1, (const gchar *)lparg2, (gint)arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1insert__J_3B_3BI_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1paste_1clipboard
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1paste_1clipboard)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jbyteArray arg2, jboolean arg3)
{
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1paste_1clipboard_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	gtk_text_buffer_paste_clipboard((GtkTextBuffer *)arg0, arg1, (GtkTextIter *)lparg2, (gboolean)arg3);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_text_buffer_paste_clipboard)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkTextBuffer *, jlong, GtkTextIter *, gboolean))fp)((GtkTextBuffer *)arg0, arg1, (GtkTextIter *)lparg2, (gboolean)arg3);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1paste_1clipboard_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1place_1cursor
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1place_1cursor)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1place_1cursor_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_text_buffer_place_cursor((GtkTextBuffer *)arg0, (const GtkTextIter *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1place_1cursor_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1select_1range
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1select_1range)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1select_1range_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_text_buffer_select_range((GtkTextBuffer *)arg0, (const GtkTextIter *)lparg1, (const GtkTextIter *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1select_1range_FUNC);
}
#endif

#ifndef NO_gtk_1text_1buffer_1set_1text
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1buffer_1set_1text)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1buffer_1set_1text_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_text_buffer_set_text((GtkTextBuffer *)arg0, (const gchar *)lparg1, (gint)arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1buffer_1set_1text_FUNC);
}
#endif

#ifndef NO_gtk_1text_1iter_1get_1line
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1text_1iter_1get_1line)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1iter_1get_1line_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jint)gtk_text_iter_get_line((const GtkTextIter *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1iter_1get_1line_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1iter_1get_1offset
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1text_1iter_1get_1offset)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1iter_1get_1offset_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jint)gtk_text_iter_get_offset((const GtkTextIter *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1iter_1get_1offset_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1view_1buffer_1to_1window_1coords
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1buffer_1to_1window_1coords)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jintArray arg4, jintArray arg5)
{
	jint *lparg4=NULL;
	jint *lparg5=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1buffer_1to_1window_1coords_FUNC);
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetIntArrayElements(env, arg5, NULL)) == NULL) goto fail;
	gtk_text_view_buffer_to_window_coords((GtkTextView *)arg0, (GtkTextWindowType)arg1, (gint)arg2, (gint)arg3, (gint *)lparg4, (gint *)lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseIntArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1buffer_1to_1window_1coords_FUNC);
}
#endif

#ifndef NO_gtk_1text_1view_1get_1buffer
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1text_1view_1get_1buffer)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1get_1buffer_FUNC);
	rc = (jlong)gtk_text_view_get_buffer((GtkTextView *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1get_1buffer_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1view_1get_1editable
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1text_1view_1get_1editable)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1get_1editable_FUNC);
	rc = (jboolean)gtk_text_view_get_editable((GtkTextView *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1get_1editable_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1view_1get_1iter_1at_1location
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1get_1iter_1at_1location)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2, jint arg3)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1get_1iter_1at_1location_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_text_view_get_iter_at_location((GtkTextView *)arg0, (GtkTextIter *)lparg1, (gint)arg2, (gint)arg3);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1get_1iter_1at_1location_FUNC);
}
#endif

#ifndef NO_gtk_1text_1view_1get_1iter_1location
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1get_1iter_1location)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jobject arg2)
{
	jbyte *lparg1=NULL;
	GdkRectangle _arg2, *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1get_1iter_1location_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = &_arg2) == NULL) goto fail;
	gtk_text_view_get_iter_location((GtkTextView *)arg0, (const GtkTextIter *)lparg1, (GdkRectangle *)lparg2);
fail:
	if (arg2 && lparg2) setGdkRectangleFields(env, arg2, lparg2);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1get_1iter_1location_FUNC);
}
#endif

#ifndef NO_gtk_1text_1view_1get_1line_1at_1y
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1get_1line_1at_1y)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2, jintArray arg3)
{
	jbyte *lparg1=NULL;
	jint *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1get_1line_1at_1y_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	gtk_text_view_get_line_at_y((GtkTextView *)arg0, (GtkTextIter *)lparg1, (gint)arg2, (gint *)lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1get_1line_1at_1y_FUNC);
}
#endif

#ifndef NO_gtk_1text_1view_1get_1line_1yrange
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1get_1line_1yrange)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jintArray arg2, jintArray arg3)
{
	jbyte *lparg1=NULL;
	jint *lparg2=NULL;
	jint *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1get_1line_1yrange_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	gtk_text_view_get_line_yrange((GtkTextView *)arg0, (GtkTextIter *)lparg1, (gint *)lparg2, (gint *)lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1get_1line_1yrange_FUNC);
}
#endif

#ifndef NO_gtk_1text_1view_1get_1visible_1rect
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1get_1visible_1rect)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1get_1visible_1rect_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
	gtk_text_view_get_visible_rect((GtkTextView *)arg0, (GdkRectangle *)lparg1);
fail:
	if (arg1 && lparg1) setGdkRectangleFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1get_1visible_1rect_FUNC);
}
#endif

#ifndef NO_gtk_1text_1view_1get_1window
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1text_1view_1get_1window)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1get_1window_FUNC);
/*
	rc = (jlong)gtk_text_view_get_window((GtkTextView *)arg0, (GtkTextWindowType)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_text_view_get_window)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkTextView *, GtkTextWindowType))fp)((GtkTextView *)arg0, (GtkTextWindowType)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1get_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1view_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1text_1view_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1new_FUNC);
	rc = (jlong)gtk_text_view_new();
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1view_1scroll_1to_1iter
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1text_1view_1scroll_1to_1iter)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jdouble arg2, jboolean arg3, jdouble arg4, jdouble arg5)
{
	jbyte *lparg1=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1scroll_1to_1iter_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gtk_text_view_scroll_to_iter((GtkTextView *)arg0, (GtkTextIter *)lparg1, (gdouble)arg2, (gboolean)arg3, (gdouble)arg4, (gdouble)arg5);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1scroll_1to_1iter_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1text_1view_1scroll_1to_1mark
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1scroll_1to_1mark)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jboolean arg3, jdouble arg4, jdouble arg5)
{
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1scroll_1to_1mark_FUNC);
	gtk_text_view_scroll_to_mark((GtkTextView *)arg0, (GtkTextMark *)arg1, (gdouble)arg2, (gboolean)arg3, (gdouble)arg4, (gdouble)arg5);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1scroll_1to_1mark_FUNC);
}
#endif

#ifndef NO_gtk_1text_1view_1set_1editable
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1set_1editable)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1set_1editable_FUNC);
	gtk_text_view_set_editable((GtkTextView *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1set_1editable_FUNC);
}
#endif

#ifndef NO_gtk_1text_1view_1set_1justification
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1set_1justification)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1set_1justification_FUNC);
	gtk_text_view_set_justification((GtkTextView *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1set_1justification_FUNC);
}
#endif

#ifndef NO_gtk_1text_1view_1set_1tabs
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1set_1tabs)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1set_1tabs_FUNC);
	gtk_text_view_set_tabs((GtkTextView *)arg0, (PangoTabArray *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1set_1tabs_FUNC);
}
#endif

#ifndef NO_gtk_1text_1view_1set_1wrap_1mode
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1set_1wrap_1mode)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1text_1view_1set_1wrap_1mode_FUNC);
	gtk_text_view_set_wrap_mode((GtkTextView *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1text_1view_1set_1wrap_1mode_FUNC);
}
#endif

#ifndef NO_gtk_1toggle_1button_1get_1active
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1toggle_1button_1get_1active)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1toggle_1button_1get_1active_FUNC);
	rc = (jboolean)gtk_toggle_button_get_active((GtkToggleButton *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1toggle_1button_1get_1active_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1toggle_1button_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1toggle_1button_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1toggle_1button_1new_FUNC);
	rc = (jlong)gtk_toggle_button_new();
	GTK_NATIVE_EXIT(env, that, gtk_1toggle_1button_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1toggle_1button_1set_1active
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1toggle_1button_1set_1active)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1toggle_1button_1set_1active_FUNC);
	gtk_toggle_button_set_active((GtkToggleButton *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1toggle_1button_1set_1active_FUNC);
}
#endif

#ifndef NO_gtk_1toggle_1button_1set_1inconsistent
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1toggle_1button_1set_1inconsistent)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1toggle_1button_1set_1inconsistent_FUNC);
/*
	gtk_toggle_button_set_inconsistent((GtkToggleButton *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_toggle_button_set_inconsistent)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkToggleButton *, gboolean))fp)((GtkToggleButton *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1toggle_1button_1set_1inconsistent_FUNC);
}
#endif

#ifndef NO_gtk_1tooltip_1get_1type
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tooltip_1get_1type)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tooltip_1get_1type_FUNC);
	rc = (jlong)gtk_tooltip_get_type();
	GTK_NATIVE_EXIT(env, that, gtk_1tooltip_1get_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tooltip_1set_1custom
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tooltip_1set_1custom)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tooltip_1set_1custom_FUNC);
	gtk_tooltip_set_custom((GtkTooltip *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tooltip_1set_1custom_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1model_1get__JJI_3II
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1model_1get__JJI_3II)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jintArray arg3, jint arg4)
{
	jint *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1get__JJI_3II_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	gtk_tree_model_get((GtkTreeModel *)arg0, (GtkTreeIter *)arg1, arg2, lparg3, arg4);
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1get__JJI_3II_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1model_1get__JJI_3JI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1model_1get__JJI_3JI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jlongArray arg3, jint arg4)
{
	jlong *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1get__JJI_3JI_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetLongArrayElements(env, arg3, NULL)) == NULL) goto fail;
	gtk_tree_model_get((GtkTreeModel *)arg0, (GtkTreeIter *)arg1, arg2, lparg3, arg4);
fail:
	if (arg3 && lparg3) (*env)->ReleaseLongArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1get__JJI_3JI_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1model_1get_1iter
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1model_1get_1iter)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1get_1iter_FUNC);
	rc = (jboolean)gtk_tree_model_get_iter((GtkTreeModel *)arg0, (GtkTreeIter *)arg1, (GtkTreePath *)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1get_1iter_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1model_1get_1iter_1first
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1model_1get_1iter_1first)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1get_1iter_1first_FUNC);
	rc = (jboolean)gtk_tree_model_get_iter_first((GtkTreeModel *)arg0, (GtkTreeIter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1get_1iter_1first_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1model_1get_1n_1columns
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1tree_1model_1get_1n_1columns)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1get_1n_1columns_FUNC);
	rc = (jint)gtk_tree_model_get_n_columns((GtkTreeModel *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1get_1n_1columns_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1model_1get_1path
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1model_1get_1path)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1get_1path_FUNC);
	rc = (jlong)gtk_tree_model_get_path((GtkTreeModel *)arg0, (GtkTreeIter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1get_1path_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1model_1get_1type
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1model_1get_1type)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1get_1type_FUNC);
	rc = (jlong)gtk_tree_model_get_type();
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1get_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1model_1iter_1children
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1model_1iter_1children)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1iter_1children_FUNC);
	rc = (jboolean)gtk_tree_model_iter_children((GtkTreeModel *)arg0, (GtkTreeIter *)arg1, (GtkTreeIter *)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1iter_1children_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1model_1iter_1n_1children
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1tree_1model_1iter_1n_1children)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1iter_1n_1children_FUNC);
	rc = (jint)gtk_tree_model_iter_n_children((GtkTreeModel *)arg0, (GtkTreeIter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1iter_1n_1children_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1model_1iter_1next
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1model_1iter_1next)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1iter_1next_FUNC);
	rc = (jboolean)gtk_tree_model_iter_next((GtkTreeModel *)arg0, (GtkTreeIter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1iter_1next_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1model_1iter_1nth_1child
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1model_1iter_1nth_1child)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jint arg3)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1model_1iter_1nth_1child_FUNC);
	rc = (jboolean)gtk_tree_model_iter_nth_child((GtkTreeModel *)arg0, (GtkTreeIter *)arg1, (GtkTreeIter *)arg2, arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1model_1iter_1nth_1child_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1path_1append_1index
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1path_1append_1index)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1append_1index_FUNC);
	gtk_tree_path_append_index((GtkTreePath *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1append_1index_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1path_1compare
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1path_1compare)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1compare_FUNC);
	rc = (jlong)gtk_tree_path_compare((const GtkTreePath *)arg0, (const GtkTreePath *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1compare_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1path_1free
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1path_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1free_FUNC);
	gtk_tree_path_free((GtkTreePath *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1free_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1path_1get_1depth
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1tree_1path_1get_1depth)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1get_1depth_FUNC);
	rc = (jint)gtk_tree_path_get_depth((GtkTreePath *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1get_1depth_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1path_1get_1indices
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1path_1get_1indices)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1get_1indices_FUNC);
	rc = (jlong)gtk_tree_path_get_indices((GtkTreePath *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1get_1indices_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1path_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1path_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1new_FUNC);
	rc = (jlong)gtk_tree_path_new();
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1path_1new_1from_1string__J
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1path_1new_1from_1string__J)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1new_1from_1string__J_FUNC);
	rc = (jlong)gtk_tree_path_new_from_string((const gchar *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1new_1from_1string__J_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1path_1new_1from_1string___3B
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1path_1new_1from_1string___3B)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1new_1from_1string___3B_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_tree_path_new_from_string((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1new_1from_1string___3B_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1path_1next
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1path_1next)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1next_FUNC);
	gtk_tree_path_next((GtkTreePath *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1next_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1path_1prev
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1path_1prev)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1prev_FUNC);
	rc = (jboolean)gtk_tree_path_prev((GtkTreePath *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1prev_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1path_1up
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1path_1up)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1path_1up_FUNC);
	rc = (jboolean)gtk_tree_path_up((GtkTreePath *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1path_1up_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1selection_1count_1selected_1rows
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1tree_1selection_1count_1selected_1rows)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1selection_1count_1selected_1rows_FUNC);
	rc = (jint)gtk_tree_selection_count_selected_rows((GtkTreeSelection *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1selection_1count_1selected_1rows_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1selection_1get_1selected_1rows
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1selection_1get_1selected_1rows)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1selection_1get_1selected_1rows_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_tree_selection_get_selected_rows((GtkTreeSelection *)arg0, (GtkTreeModel **)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1selection_1get_1selected_1rows_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1selection_1path_1is_1selected
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1selection_1path_1is_1selected)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1selection_1path_1is_1selected_FUNC);
	rc = (jboolean)gtk_tree_selection_path_is_selected((GtkTreeSelection *)arg0, (GtkTreePath *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1selection_1path_1is_1selected_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1selection_1select_1all
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1selection_1select_1all)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1selection_1select_1all_FUNC);
	gtk_tree_selection_select_all((GtkTreeSelection *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1selection_1select_1all_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1selection_1select_1iter
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1selection_1select_1iter)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1selection_1select_1iter_FUNC);
	gtk_tree_selection_select_iter((GtkTreeSelection *)arg0, (GtkTreeIter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1selection_1select_1iter_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1selection_1set_1mode
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1selection_1set_1mode)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1selection_1set_1mode_FUNC);
	gtk_tree_selection_set_mode((GtkTreeSelection *)arg0, (GtkSelectionMode)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1selection_1set_1mode_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1selection_1set_1select_1function
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1selection_1set_1select_1function)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1selection_1set_1select_1function_FUNC);
	gtk_tree_selection_set_select_function((GtkTreeSelection *)arg0, (GtkTreeSelectionFunc)arg1, (gpointer)arg2, (GDestroyNotify)arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1selection_1set_1select_1function_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1selection_1unselect_1all
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1selection_1unselect_1all)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1selection_1unselect_1all_FUNC);
	gtk_tree_selection_unselect_all((GtkTreeSelection *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1selection_1unselect_1all_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1selection_1unselect_1iter
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1selection_1unselect_1iter)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1selection_1unselect_1iter_FUNC);
	gtk_tree_selection_unselect_iter((GtkTreeSelection *)arg0, (GtkTreeIter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1selection_1unselect_1iter_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1selection_1unselect_1path
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1selection_1unselect_1path)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1selection_1unselect_1path_FUNC);
	gtk_tree_selection_unselect_path((GtkTreeSelection *)arg0, (GtkTreePath *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1selection_1unselect_1path_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1store_1append
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1store_1append)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1append_FUNC);
	gtk_tree_store_append((GtkTreeStore *)arg0, (GtkTreeIter *)arg1, (GtkTreeIter *)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1append_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1store_1clear
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1store_1clear)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1clear_FUNC);
	gtk_tree_store_clear((GtkTreeStore *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1clear_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1store_1insert
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1store_1insert)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jint arg3)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1insert_FUNC);
	gtk_tree_store_insert((GtkTreeStore *)arg0, (GtkTreeIter *)arg1, (GtkTreeIter *)arg2, (gint)arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1insert_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1store_1newv
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1store_1newv)
	(JNIEnv *env, jclass that, jint arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1newv_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_tree_store_newv(arg0, (GType *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1newv_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1store_1prepend
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1store_1prepend)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1prepend_FUNC);
	gtk_tree_store_prepend((GtkTreeStore *)arg0, (GtkTreeIter *)arg1, (GtkTreeIter *)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1prepend_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1store_1remove
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1store_1remove)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1remove_FUNC);
	gtk_tree_store_remove((GtkTreeStore *)arg0, (GtkTreeIter *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1remove_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1store_1set__JJIII
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1store_1set__JJIII)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3, jint arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1set__JJIII_FUNC);
	gtk_tree_store_set((GtkTreeStore *)arg0, (GtkTreeIter *)arg1, arg2, arg3, arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1set__JJIII_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1store_1set__JJIJI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1store_1set__JJIJI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jlong arg3, jint arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1set__JJIJI_FUNC);
	gtk_tree_store_set((GtkTreeStore *)arg0, (GtkTreeIter *)arg1, arg2, arg3, arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1set__JJIJI_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1store_1set__JJILorg_eclipse_swt_internal_gtk_GdkRGBA_2I
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1store_1set__JJILorg_eclipse_swt_internal_gtk_GdkRGBA_2I)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jobject arg3, jint arg4)
{
	GdkRGBA _arg3, *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1set__JJILorg_eclipse_swt_internal_gtk_GdkRGBA_2I_FUNC);
	if (arg3) if ((lparg3 = getGdkRGBAFields(env, arg3, &_arg3)) == NULL) goto fail;
	gtk_tree_store_set((GtkTreeStore *)arg0, (GtkTreeIter *)arg1, arg2, lparg3, arg4);
fail:
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1set__JJILorg_eclipse_swt_internal_gtk_GdkRGBA_2I_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1store_1set__JJIZI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1store_1set__JJIZI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jboolean arg3, jint arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1set__JJIZI_FUNC);
	gtk_tree_store_set((GtkTreeStore *)arg0, (GtkTreeIter *)arg1, arg2, arg3, arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1set__JJIZI_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1store_1set__JJI_3BI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1store_1set__JJI_3BI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jbyteArray arg3, jint arg4)
{
	jbyte *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1store_1set__JJI_3BI_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetByteArrayElements(env, arg3, NULL)) == NULL) goto fail;
	gtk_tree_store_set((GtkTreeStore *)arg0, (GtkTreeIter *)arg1, arg2, lparg3, arg4);
fail:
	if (arg3 && lparg3) (*env)->ReleaseByteArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1store_1set__JJI_3BI_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1collapse_1row
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1view_1collapse_1row)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1collapse_1row_FUNC);
	rc = (jboolean)gtk_tree_view_collapse_row((GtkTreeView *)arg0, (GtkTreePath *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1collapse_1row_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1add_1attribute
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1add_1attribute)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jbyteArray arg2, jint arg3)
{
	jbyte *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1add_1attribute_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_tree_view_column_add_attribute((GtkTreeViewColumn *)arg0, (GtkCellRenderer *)arg1, (const gchar *)lparg2, (gint)arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1add_1attribute_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1cell_1get_1position
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1cell_1get_1position)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jintArray arg2, jintArray arg3)
{
	jint *lparg2=NULL;
	jint *lparg3=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1cell_1get_1position_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	rc = (jboolean)gtk_tree_view_column_cell_get_position((GtkTreeViewColumn *)arg0, (GtkCellRenderer *)arg1, (gint *)lparg2, (gint *)lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1cell_1get_1position_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1cell_1get_1size__JLorg_eclipse_swt_internal_gtk_GdkRectangle_2_3I_3I_3I_3I
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1cell_1get_1size__JLorg_eclipse_swt_internal_gtk_GdkRectangle_2_3I_3I_3I_3I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jintArray arg2, jintArray arg3, jintArray arg4, jintArray arg5)
{
	GdkRectangle _arg1, *lparg1=NULL;
	jint *lparg2=NULL;
	jint *lparg3=NULL;
	jint *lparg4=NULL;
	jint *lparg5=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1cell_1get_1size__JLorg_eclipse_swt_internal_gtk_GdkRectangle_2_3I_3I_3I_3I_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetIntArrayElements(env, arg5, NULL)) == NULL) goto fail;
	gtk_tree_view_column_cell_get_size((GtkTreeViewColumn *)arg0, (GdkRectangle *)lparg1, (gint *)lparg2, (gint *)lparg3, (gint *)lparg4, (gint *)lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseIntArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) setGdkRectangleFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1cell_1get_1size__JLorg_eclipse_swt_internal_gtk_GdkRectangle_2_3I_3I_3I_3I_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1cell_1get_1size__J_3I_3I_3I_3I
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1cell_1get_1size__J_3I_3I_3I_3I)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2, jintArray arg3, jintArray arg4)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jint *lparg3=NULL;
	jint *lparg4=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1cell_1get_1size__J_3I_3I_3I_3I_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	gtk_tree_view_column_cell_get_size((GtkTreeViewColumn *)arg0, (int *)lparg1, (int *)lparg2, (int *)lparg3, (int *)lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1cell_1get_1size__J_3I_3I_3I_3I_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1cell_1set_1cell_1data
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1cell_1set_1cell_1data)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jboolean arg3, jboolean arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1cell_1set_1cell_1data_FUNC);
	gtk_tree_view_column_cell_set_cell_data((GtkTreeViewColumn *)arg0, (GtkTreeModel *)arg1, (GtkTreeIter *)arg2, arg3, arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1cell_1set_1cell_1data_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1clear
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1clear)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1clear_FUNC);
	gtk_tree_view_column_clear((GtkTreeViewColumn *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1clear_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1get_1button
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1get_1button)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1get_1button_FUNC);
	rc = (jlong)gtk_tree_view_column_get_button((GtkTreeViewColumn *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1get_1button_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1get_1fixed_1width
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1get_1fixed_1width)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1get_1fixed_1width_FUNC);
	rc = (jint)gtk_tree_view_column_get_fixed_width((GtkTreeViewColumn *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1get_1fixed_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1get_1reorderable
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1get_1reorderable)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1get_1reorderable_FUNC);
	rc = (jboolean)gtk_tree_view_column_get_reorderable((GtkTreeViewColumn *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1get_1reorderable_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1get_1resizable
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1get_1resizable)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1get_1resizable_FUNC);
	rc = (jboolean)gtk_tree_view_column_get_resizable((GtkTreeViewColumn *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1get_1resizable_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1get_1visible
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1get_1visible)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1get_1visible_FUNC);
	rc = (jboolean)gtk_tree_view_column_get_visible((GtkTreeViewColumn *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1get_1visible_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1get_1width
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1get_1width)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1get_1width_FUNC);
	rc = (jint)gtk_tree_view_column_get_width((GtkTreeViewColumn *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1get_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1new_FUNC);
	rc = (jlong)gtk_tree_view_column_new();
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1pack_1end
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1pack_1end)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1pack_1end_FUNC);
	gtk_tree_view_column_pack_end((GtkTreeViewColumn *)arg0, (GtkCellRenderer *)arg1, (gboolean)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1pack_1end_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1pack_1start
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1pack_1start)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1pack_1start_FUNC);
	gtk_tree_view_column_pack_start((GtkTreeViewColumn *)arg0, (GtkCellRenderer *)arg1, (gboolean)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1pack_1start_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1alignment
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1alignment)
	(JNIEnv *env, jclass that, jlong arg0, jfloat arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1alignment_FUNC);
	gtk_tree_view_column_set_alignment((GtkTreeViewColumn *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1alignment_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1cell_1data_1func
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1cell_1data_1func)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1cell_1data_1func_FUNC);
	gtk_tree_view_column_set_cell_data_func((GtkTreeViewColumn *)arg0, (GtkCellRenderer *)arg1, (GtkTreeCellDataFunc)arg2, (gpointer)arg3, (GDestroyNotify)arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1cell_1data_1func_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1clickable
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1clickable)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1clickable_FUNC);
	gtk_tree_view_column_set_clickable((GtkTreeViewColumn *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1clickable_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1fixed_1width
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1fixed_1width)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1fixed_1width_FUNC);
	gtk_tree_view_column_set_fixed_width((GtkTreeViewColumn *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1fixed_1width_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1min_1width
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1min_1width)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1min_1width_FUNC);
	gtk_tree_view_column_set_min_width((GtkTreeViewColumn *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1min_1width_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1reorderable
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1reorderable)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1reorderable_FUNC);
	gtk_tree_view_column_set_reorderable((GtkTreeViewColumn *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1reorderable_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1resizable
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1resizable)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1resizable_FUNC);
	gtk_tree_view_column_set_resizable((GtkTreeViewColumn *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1resizable_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1sizing
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1sizing)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1sizing_FUNC);
	gtk_tree_view_column_set_sizing((GtkTreeViewColumn *)arg0, (GtkTreeViewColumnSizing)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1sizing_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1sort_1indicator
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1sort_1indicator)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1sort_1indicator_FUNC);
	gtk_tree_view_column_set_sort_indicator((GtkTreeViewColumn *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1sort_1indicator_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1sort_1order
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1sort_1order)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1sort_1order_FUNC);
	gtk_tree_view_column_set_sort_order((GtkTreeViewColumn *)arg0, (GtkSortType)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1sort_1order_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1visible
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1visible)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1visible_FUNC);
	gtk_tree_view_column_set_visible((GtkTreeViewColumn *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1visible_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1column_1set_1widget
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1set_1widget)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1column_1set_1widget_FUNC);
	gtk_tree_view_column_set_widget((GtkTreeViewColumn *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1column_1set_1widget_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1convert_1bin_1window_1to_1tree_1coords
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1convert_1bin_1window_1to_1tree_1coords)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jintArray arg3, jintArray arg4)
{
	jint *lparg3=NULL;
	jint *lparg4=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1convert_1bin_1window_1to_1tree_1coords_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	gtk_tree_view_convert_bin_window_to_tree_coords((GtkTreeView *)arg0, (gint)arg1, (gint)arg2, (gint *)lparg3, (gint *)lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1convert_1bin_1window_1to_1tree_1coords_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1convert_1bin_1window_1to_1widget_1coords
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1convert_1bin_1window_1to_1widget_1coords)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jintArray arg3, jintArray arg4)
{
	jint *lparg3=NULL;
	jint *lparg4=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1convert_1bin_1window_1to_1widget_1coords_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	gtk_tree_view_convert_bin_window_to_widget_coords((GtkTreeView *)arg0, arg1, arg2, (int *)lparg3, (int *)lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1convert_1bin_1window_1to_1widget_1coords_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1create_1row_1drag_1icon
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1view_1create_1row_1drag_1icon)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1create_1row_1drag_1icon_FUNC);
	rc = (jlong)gtk_tree_view_create_row_drag_icon((GtkTreeView *)arg0, (GtkTreePath *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1create_1row_1drag_1icon_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1expand_1row
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1view_1expand_1row)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1expand_1row_FUNC);
	rc = (jboolean)gtk_tree_view_expand_row((GtkTreeView *)arg0, (GtkTreePath *)arg1, (gboolean)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1expand_1row_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1background_1area
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1background_1area)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3)
{
	GdkRectangle _arg3, *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1background_1area_FUNC);
	if (arg3) if ((lparg3 = getGdkRectangleFields(env, arg3, &_arg3)) == NULL) goto fail;
	gtk_tree_view_get_background_area((GtkTreeView *)arg0, (GtkTreePath *)arg1, (GtkTreeViewColumn *)arg2, (GdkRectangle *)lparg3);
fail:
	if (arg3 && lparg3) setGdkRectangleFields(env, arg3, lparg3);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1background_1area_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1bin_1window
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1bin_1window)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1bin_1window_FUNC);
	rc = (jlong)gtk_tree_view_get_bin_window((GtkTreeView *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1bin_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1cell_1area
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1cell_1area)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jobject arg3)
{
	GdkRectangle _arg3, *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1cell_1area_FUNC);
	if (arg3) if ((lparg3 = &_arg3) == NULL) goto fail;
	gtk_tree_view_get_cell_area((GtkTreeView *)arg0, (GtkTreePath *)arg1, (GtkTreeViewColumn *)arg2, (GdkRectangle *)lparg3);
fail:
	if (arg3 && lparg3) setGdkRectangleFields(env, arg3, lparg3);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1cell_1area_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1column
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1column)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1column_FUNC);
	rc = (jlong)gtk_tree_view_get_column((GtkTreeView *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1column_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1columns
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1columns)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1columns_FUNC);
	rc = (jlong)gtk_tree_view_get_columns((GtkTreeView *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1columns_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1cursor
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1cursor)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1, jlongArray arg2)
{
	jlong *lparg1=NULL;
	jlong *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1cursor_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_tree_view_get_cursor((GtkTreeView *)arg0, (GtkTreePath **)lparg1, (GtkTreeViewColumn **)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1cursor_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1expander_1column
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1expander_1column)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1expander_1column_FUNC);
	rc = (jlong)gtk_tree_view_get_expander_column((GtkTreeView *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1expander_1column_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1grid_1lines
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1grid_1lines)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1grid_1lines_FUNC);
	rc = (jint)gtk_tree_view_get_grid_lines((GtkTreeView*)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1grid_1lines_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1headers_1visible
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1headers_1visible)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1headers_1visible_FUNC);
	rc = (jboolean)gtk_tree_view_get_headers_visible((GtkTreeView *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1headers_1visible_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1path_1at_1pos
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1path_1at_1pos)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jlongArray arg3, jlongArray arg4, jintArray arg5, jintArray arg6)
{
	jlong *lparg3=NULL;
	jlong *lparg4=NULL;
	jint *lparg5=NULL;
	jint *lparg6=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1path_1at_1pos_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetLongArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetLongArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetIntArrayElements(env, arg5, NULL)) == NULL) goto fail;
	if (arg6) if ((lparg6 = (*env)->GetIntArrayElements(env, arg6, NULL)) == NULL) goto fail;
	rc = (jboolean)gtk_tree_view_get_path_at_pos((GtkTreeView *)arg0, (gint)arg1, (gint)arg2, (GtkTreePath **)lparg3, (GtkTreeViewColumn **)lparg4, (gint *)lparg5, (gint *)lparg6);
fail:
	if (arg6 && lparg6) (*env)->ReleaseIntArrayElements(env, arg6, lparg6, 0);
	if (arg5 && lparg5) (*env)->ReleaseIntArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseLongArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseLongArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1path_1at_1pos_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1selection
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1selection)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1selection_FUNC);
	rc = (jlong)gtk_tree_view_get_selection((GtkTreeView *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1selection_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1get_1visible_1rect
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1get_1visible_1rect)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1get_1visible_1rect_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
	gtk_tree_view_get_visible_rect((GtkTreeView *)arg0, lparg1);
fail:
	if (arg1 && lparg1) setGdkRectangleFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1get_1visible_1rect_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1insert_1column
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1tree_1view_1insert_1column)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1insert_1column_FUNC);
	rc = (jint)gtk_tree_view_insert_column((GtkTreeView *)arg0, (GtkTreeViewColumn *)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1insert_1column_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1move_1column_1after
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1move_1column_1after)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1move_1column_1after_FUNC);
	gtk_tree_view_move_column_after((GtkTreeView *)arg0, (GtkTreeViewColumn *)arg1, (GtkTreeViewColumn *)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1move_1column_1after_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1new_1with_1model
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tree_1view_1new_1with_1model)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1new_1with_1model_FUNC);
	rc = (jlong)gtk_tree_view_new_with_model((GtkTreeModel *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1new_1with_1model_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1remove_1column
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1remove_1column)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1remove_1column_FUNC);
	gtk_tree_view_remove_column((GtkTreeView *)arg0, (GtkTreeViewColumn *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1remove_1column_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1row_1expanded
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1tree_1view_1row_1expanded)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1row_1expanded_FUNC);
	rc = (jboolean)gtk_tree_view_row_expanded((GtkTreeView *)arg0, (GtkTreePath *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1row_1expanded_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tree_1view_1scroll_1to_1cell
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1scroll_1to_1cell)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jboolean arg3, jfloat arg4, jfloat arg5)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1scroll_1to_1cell_FUNC);
	gtk_tree_view_scroll_to_cell((GtkTreeView *)arg0, (GtkTreePath *)arg1, (GtkTreeViewColumn *)arg2, (gboolean)arg3, (gfloat)arg4, (gfloat)arg5);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1scroll_1to_1cell_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1scroll_1to_1point
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1scroll_1to_1point)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1scroll_1to_1point_FUNC);
	gtk_tree_view_scroll_to_point((GtkTreeView *)arg0, (gint)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1scroll_1to_1point_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1set_1cursor
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1set_1cursor)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jboolean arg3)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1set_1cursor_FUNC);
	gtk_tree_view_set_cursor((GtkTreeView *)arg0, (GtkTreePath *)arg1, (GtkTreeViewColumn *)arg2, arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1set_1cursor_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1set_1drag_1dest_1row
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1set_1drag_1dest_1row)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1set_1drag_1dest_1row_FUNC);
	gtk_tree_view_set_drag_dest_row((GtkTreeView *)arg0, (GtkTreePath *)arg1, arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1set_1drag_1dest_1row_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1set_1grid_1lines
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1set_1grid_1lines)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1set_1grid_1lines_FUNC);
	gtk_tree_view_set_grid_lines((GtkTreeView*)arg0, (GtkTreeViewGridLines)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1set_1grid_1lines_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1set_1headers_1visible
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1set_1headers_1visible)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1set_1headers_1visible_FUNC);
	gtk_tree_view_set_headers_visible((GtkTreeView *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1set_1headers_1visible_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1set_1model
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1set_1model)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1set_1model_FUNC);
	gtk_tree_view_set_model((GtkTreeView *)arg0, (GtkTreeModel *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1set_1model_FUNC);
}
#endif

#ifndef NO_gtk_1tree_1view_1set_1search_1column
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1set_1search_1column)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tree_1view_1set_1search_1column_FUNC);
	gtk_tree_view_set_search_column((GtkTreeView *)arg0, (gint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tree_1view_1set_1search_1column_FUNC);
}
#endif

#ifndef NO_gtk_1viewport_1set_1shadow_1type
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1viewport_1set_1shadow_1type)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1viewport_1set_1shadow_1type_FUNC);
	gtk_viewport_set_shadow_type((GtkViewport *)arg0, (GtkShadowType)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1viewport_1set_1shadow_1type_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1action_1set_1enabled
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1action_1set_1enabled)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jboolean arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1action_1set_1enabled_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	gtk_widget_action_set_enabled((GtkWidget *)arg0, (const char *)lparg1, arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_action_set_enabled)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, const char *, jboolean))fp)((GtkWidget *)arg0, (const char *)lparg1, arg2);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1action_1set_1enabled_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1activate
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1activate)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1activate_FUNC);
	rc = (jboolean)gtk_widget_activate((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1activate_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1activate_1action
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1activate_1action)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1activate_1action_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)gtk_widget_activate_action((GtkWidget *)arg0, (const char *)lparg1, (const char *)lparg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_activate_action)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GtkWidget *, const char *, const char *))fp)((GtkWidget *)arg0, (const char *)lparg1, (const char *)lparg2);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1activate_1action_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1add_1accelerator
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1add_1accelerator)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jint arg3, jint arg4, jint arg5)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1add_1accelerator_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_widget_add_accelerator((GtkWidget *)arg0, (const gchar *)lparg1, (GtkAccelGroup *)arg2, (guint)arg3, (GdkModifierType)arg4, arg5);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1add_1accelerator_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1add_1controller
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1add_1controller)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1add_1controller_FUNC);
/*
	gtk_widget_add_controller((GtkWidget *)arg0, (GtkEventController *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_add_controller)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GtkEventController *))fp)((GtkWidget *)arg0, (GtkEventController *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1add_1controller_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1add_1css_1class
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1add_1css_1class)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1add_1css_1class_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	gtk_widget_add_css_class((GtkWidget *)arg0, (const char *)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_add_css_class)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, const char *))fp)((GtkWidget *)arg0, (const char *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1add_1css_1class_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1add_1events
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1add_1events)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1add_1events_FUNC);
/*
	gtk_widget_add_events((GtkWidget *)arg0, (gint)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_add_events)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gint))fp)((GtkWidget *)arg0, (gint)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1add_1events_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1child_1focus
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1child_1focus)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1child_1focus_FUNC);
	rc = (jboolean)gtk_widget_child_focus((GtkWidget *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1child_1focus_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1class_1add_1binding_1signal
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1class_1add_1binding_1signal)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jbyteArray arg3, jbyteArray arg4, jboolean arg5, jboolean arg6, jboolean arg7)
{
	jbyte *lparg3=NULL;
	jbyte *lparg4=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1class_1add_1binding_1signal_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetByteArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetByteArrayElements(env, arg4, NULL)) == NULL) goto fail;
/*
	gtk_widget_class_add_binding_signal((GtkWidgetClass *)arg0, arg1, (GdkModifierType)arg2, (const char *)lparg3, (const char *)lparg4, arg5, arg6, arg7);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_class_add_binding_signal)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidgetClass *, jint, GdkModifierType, const char *, const char *, jboolean, jboolean, jboolean))fp)((GtkWidgetClass *)arg0, arg1, (GdkModifierType)arg2, (const char *)lparg3, (const char *)lparg4, arg5, arg6, arg7);
		}
	}
fail:
	if (arg4 && lparg4) (*env)->ReleaseByteArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseByteArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1class_1add_1binding_1signal_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1class_1get_1css_1name
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1class_1get_1css_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1class_1get_1css_1name_FUNC);
/*
	rc = (jlong)gtk_widget_class_get_css_name((GtkWidgetClass *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_class_get_css_name)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidgetClass *))fp)((GtkWidgetClass *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1class_1get_1css_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1create_1pango_1layout__JJ
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1create_1pango_1layout__JJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1create_1pango_1layout__JJ_FUNC);
	rc = (jlong)gtk_widget_create_pango_layout((GtkWidget *)arg0, (const gchar *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1create_1pango_1layout__JJ_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1create_1pango_1layout__J_3B
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1create_1pango_1layout__J_3B)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1create_1pango_1layout__J_3B_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_widget_create_pango_layout((GtkWidget *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1create_1pango_1layout__J_3B_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1destroy
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1destroy)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1destroy_FUNC);
/*
	gtk_widget_destroy((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_destroy)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1destroy_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1draw
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1draw)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1draw_FUNC);
/*
	gtk_widget_draw((GtkWidget *)arg0, (cairo_t *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_draw)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, cairo_t *))fp)((GtkWidget *)arg0, (cairo_t *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1draw_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1event
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1event)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1event_FUNC);
/*
	rc = (jboolean)gtk_widget_event((GtkWidget *)arg0, (GdkEvent *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_event)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GtkWidget *, GdkEvent *))fp)((GtkWidget *)arg0, (GdkEvent *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1event_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1allocation
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1get_1allocation)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GtkAllocation _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1allocation_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
	gtk_widget_get_allocation((GtkWidget *)arg0, (GtkAllocation *)lparg1);
fail:
	if (arg1 && lparg1) setGtkAllocationFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1allocation_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1get_1can_1default
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1get_1can_1default)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1can_1default_FUNC);
/*
	rc = (jboolean)gtk_widget_get_can_default((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_can_default)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1can_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1child_1visible
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1get_1child_1visible)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1child_1visible_FUNC);
	rc = (jboolean)gtk_widget_get_child_visible((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1child_1visible_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1clip
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1get_1clip)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GtkAllocation _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1clip_FUNC);
	if (arg1) if ((lparg1 = getGtkAllocationFields(env, arg1, &_arg1)) == NULL) goto fail;
/*
	gtk_widget_get_clip((GtkWidget *)arg0, lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_clip)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GtkAllocation *))fp)((GtkWidget *)arg0, lparg1);
		}
	}
fail:
	if (arg1 && lparg1) setGtkAllocationFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1clip_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1get_1events
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1widget_1get_1events)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1events_FUNC);
/*
	rc = (jint)gtk_widget_get_events((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_events)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1events_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1first_1child
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1first_1child)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1first_1child_FUNC);
/*
	rc = (jlong)gtk_widget_get_first_child((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_first_child)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1first_1child_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1has_1window
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1get_1has_1window)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1has_1window_FUNC);
/*
	rc = (jboolean)gtk_widget_get_has_window((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_has_window)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1has_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1last_1child
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1last_1child)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1last_1child_FUNC);
/*
	rc = (jlong)gtk_widget_get_last_child((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_last_child)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1last_1child_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1mapped
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1get_1mapped)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1mapped_FUNC);
	rc = (jboolean)gtk_widget_get_mapped((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1mapped_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1margin_1bottom
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1widget_1get_1margin_1bottom)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1margin_1bottom_FUNC);
/*
	rc = (jint)gtk_widget_get_margin_bottom((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_margin_bottom)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1margin_1bottom_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1margin_1end
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1widget_1get_1margin_1end)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1margin_1end_FUNC);
/*
	rc = (jint)gtk_widget_get_margin_end((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_margin_end)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1margin_1end_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1margin_1start
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1widget_1get_1margin_1start)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1margin_1start_FUNC);
/*
	rc = (jint)gtk_widget_get_margin_start((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_margin_start)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1margin_1start_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1margin_1top
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1widget_1get_1margin_1top)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1margin_1top_FUNC);
/*
	rc = (jint)gtk_widget_get_margin_top((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_margin_top)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1margin_1top_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1name
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1name_FUNC);
	rc = (jlong)gtk_widget_get_name((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1native
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1native)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1native_FUNC);
/*
	rc = (jlong)gtk_widget_get_native((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_native)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1native_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1next_1sibling
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1next_1sibling)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1next_1sibling_FUNC);
/*
	rc = (jlong)gtk_widget_get_next_sibling((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_next_sibling)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1next_1sibling_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1opacity
JNIEXPORT jdouble JNICALL GTK_NATIVE(gtk_1widget_1get_1opacity)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1opacity_FUNC);
/*
	rc = (jdouble)gtk_widget_get_opacity((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_opacity)
		if (fp) {
			rc = (jdouble)((jdouble (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1opacity_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1pango_1context
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1pango_1context)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1pango_1context_FUNC);
	rc = (jlong)gtk_widget_get_pango_context((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1pango_1context_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1parent
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1parent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1parent_FUNC);
	rc = (jlong)gtk_widget_get_parent((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1parent_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1parent_1surface
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1parent_1surface)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1parent_1surface_FUNC);
/*
	rc = (jlong)gtk_widget_get_parent_surface((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_parent_surface)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1parent_1surface_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1parent_1window
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1parent_1window)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1parent_1window_FUNC);
/*
	rc = (jlong)gtk_widget_get_parent_window((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_parent_window)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1parent_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1preferred_1height
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1get_1preferred_1height)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1preferred_1height_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
/*
	gtk_widget_get_preferred_height((GtkWidget *)arg0, (gint *)lparg1, (gint *)lparg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_preferred_height)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gint *, gint *))fp)((GtkWidget *)arg0, (gint *)lparg1, (gint *)lparg2);
		}
	}
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1preferred_1height_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1get_1preferred_1height_1for_1width
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1get_1preferred_1height_1for_1width)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jintArray arg2, jintArray arg3)
{
	jint *lparg2=NULL;
	jint *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1preferred_1height_1for_1width_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
/*
	gtk_widget_get_preferred_height_for_width((GtkWidget *)arg0, (gint)arg1, (gint *)lparg2, (gint *)lparg3);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_preferred_height_for_width)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gint, gint *, gint *))fp)((GtkWidget *)arg0, (gint)arg1, (gint *)lparg2, (gint *)lparg3);
		}
	}
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1preferred_1height_1for_1width_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1get_1preferred_1size
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1get_1preferred_1size)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jobject arg2)
{
	GtkRequisition _arg1, *lparg1=NULL;
	GtkRequisition _arg2, *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1preferred_1size_FUNC);
	if (arg1) if ((lparg1 = getGtkRequisitionFields(env, arg1, &_arg1)) == NULL) goto fail;
	if (arg2) if ((lparg2 = getGtkRequisitionFields(env, arg2, &_arg2)) == NULL) goto fail;
	gtk_widget_get_preferred_size((GtkWidget *)arg0, (GtkRequisition *)lparg1, (GtkRequisition *)lparg2);
fail:
	if (arg2 && lparg2) setGtkRequisitionFields(env, arg2, lparg2);
	if (arg1 && lparg1) setGtkRequisitionFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1preferred_1size_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1get_1preferred_1width_1for_1height
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1get_1preferred_1width_1for_1height)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jintArray arg2, jintArray arg3)
{
	jint *lparg2=NULL;
	jint *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1preferred_1width_1for_1height_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
/*
	gtk_widget_get_preferred_width_for_height((GtkWidget *)arg0, (gint)arg1, (gint *)lparg2, (gint *)lparg3);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_preferred_width_for_height)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gint, gint *, gint *))fp)((GtkWidget *)arg0, (gint)arg1, (gint *)lparg2, (gint *)lparg3);
		}
	}
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1preferred_1width_1for_1height_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1get_1prev_1sibling
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1prev_1sibling)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1prev_1sibling_FUNC);
/*
	rc = (jlong)gtk_widget_get_prev_sibling((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_prev_sibling)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1prev_1sibling_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1realized
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1get_1realized)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1realized_FUNC);
	rc = (jboolean)gtk_widget_get_realized((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1realized_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1receives_1default
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1get_1receives_1default)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1receives_1default_FUNC);
/*
	rc = (jboolean)gtk_widget_get_receives_default((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_receives_default)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1receives_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1root
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1root)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1root_FUNC);
/*
	rc = (jlong)gtk_widget_get_root((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_root)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1root_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1scale_1factor
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1widget_1get_1scale_1factor)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1scale_1factor_FUNC);
	rc = (jint)gtk_widget_get_scale_factor((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1scale_1factor_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1screen
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1screen)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1screen_FUNC);
/*
	rc = (jlong)gtk_widget_get_screen((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_screen)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1screen_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1sensitive
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1get_1sensitive)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1sensitive_FUNC);
	rc = (jboolean)gtk_widget_get_sensitive((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1sensitive_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1size_1request
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1get_1size_1request)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1size_1request_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_widget_get_size_request((GtkWidget *)arg0, (gint *)lparg1, (gint *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1size_1request_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1get_1state_1flags
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1widget_1get_1state_1flags)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1state_1flags_FUNC);
	rc = (jint)gtk_widget_get_state_flags((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1state_1flags_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1style_1context
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1style_1context)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1style_1context_FUNC);
	rc = (jlong)gtk_widget_get_style_context((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1style_1context_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1tooltip_1text
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1tooltip_1text)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1tooltip_1text_FUNC);
	rc = (jlong)gtk_widget_get_tooltip_text((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1tooltip_1text_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1toplevel
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1toplevel)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1toplevel_FUNC);
/*
	rc = (jlong)gtk_widget_get_toplevel((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_toplevel)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1toplevel_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1visible
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1get_1visible)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1visible_FUNC);
	rc = (jboolean)gtk_widget_get_visible((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1visible_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1window
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1window)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1window_FUNC);
/*
	rc = (jlong)gtk_widget_get_window((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_window)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1window_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1grab_1focus
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1grab_1focus)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1grab_1focus_FUNC);
	gtk_widget_grab_focus((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1grab_1focus_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1has_1default
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1has_1default)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1has_1default_FUNC);
	rc = (jboolean)gtk_widget_has_default((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1has_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1has_1focus
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1has_1focus)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1has_1focus_FUNC);
	rc = (jboolean)gtk_widget_has_focus((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1has_1focus_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1hide
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1hide)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1hide_FUNC);
	gtk_widget_hide((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1hide_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1input_1shape_1combine_1region
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1input_1shape_1combine_1region)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1input_1shape_1combine_1region_FUNC);
/*
	gtk_widget_input_shape_combine_region((GtkWidget *)arg0, (cairo_region_t *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_input_shape_combine_region)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, cairo_region_t *))fp)((GtkWidget *)arg0, (cairo_region_t *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1input_1shape_1combine_1region_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1insert_1action_1group
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1insert_1action_1group)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1insert_1action_1group_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_widget_insert_action_group((GtkWidget *)arg0, (const char *)lparg1, (GActionGroup *)arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1insert_1action_1group_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1is_1focus
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1is_1focus)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1is_1focus_FUNC);
	rc = (jboolean)gtk_widget_is_focus((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1is_1focus_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1measure
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1measure)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jintArray arg3, jintArray arg4, jintArray arg5, jintArray arg6)
{
	jint *lparg3=NULL;
	jint *lparg4=NULL;
	jint *lparg5=NULL;
	jint *lparg6=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1measure_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetIntArrayElements(env, arg5, NULL)) == NULL) goto fail;
	if (arg6) if ((lparg6 = (*env)->GetIntArrayElements(env, arg6, NULL)) == NULL) goto fail;
/*
	gtk_widget_measure((GtkWidget *)arg0, (GtkOrientation)arg1, (int)arg2, (int *)lparg3, (int *)lparg4, (int *)lparg5, (int *)lparg6);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_measure)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GtkOrientation, int, int *, int *, int *, int *))fp)((GtkWidget *)arg0, (GtkOrientation)arg1, (int)arg2, (int *)lparg3, (int *)lparg4, (int *)lparg5, (int *)lparg6);
		}
	}
fail:
	if (arg6 && lparg6) (*env)->ReleaseIntArrayElements(env, arg6, lparg6, 0);
	if (arg5 && lparg5) (*env)->ReleaseIntArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1measure_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1mnemonic_1activate
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1mnemonic_1activate)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1mnemonic_1activate_FUNC);
	rc = (jboolean)gtk_widget_mnemonic_activate((GtkWidget *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1mnemonic_1activate_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1override_1font
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1override_1font)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1override_1font_FUNC);
/*
	gtk_widget_override_font(arg0, arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_override_font)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jlong))fp)(arg0, arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1override_1font_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1queue_1draw
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1queue_1draw)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1queue_1draw_FUNC);
	gtk_widget_queue_draw((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1queue_1draw_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1queue_1resize
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1queue_1resize)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1queue_1resize_FUNC);
	gtk_widget_queue_resize((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1queue_1resize_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1realize
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1realize)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1realize_FUNC);
	gtk_widget_realize((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1realize_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1remove_1accelerator
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1remove_1accelerator)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1remove_1accelerator_FUNC);
	gtk_widget_remove_accelerator((GtkWidget *)arg0, (GtkAccelGroup *)arg1, (guint)arg2, (GdkModifierType)arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1remove_1accelerator_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1reparent
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1reparent)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1reparent_FUNC);
/*
	gtk_widget_reparent((GtkWidget *)arg0, (GtkWidget *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_reparent)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GtkWidget *))fp)((GtkWidget *)arg0, (GtkWidget *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1reparent_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1allocation
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1allocation)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GtkAllocation _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1allocation_FUNC);
	if (arg1) if ((lparg1 = getGtkAllocationFields(env, arg1, &_arg1)) == NULL) goto fail;
/*
	gtk_widget_set_allocation((GtkWidget *)arg0, (GtkAllocation *)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_allocation)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GtkAllocation *))fp)((GtkWidget *)arg0, (GtkAllocation *)lparg1);
		}
	}
fail:
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1allocation_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1can_1default
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1can_1default)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1can_1default_FUNC);
/*
	gtk_widget_set_can_default((GtkWidget *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_can_default)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gboolean))fp)((GtkWidget *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1can_1default_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1can_1focus
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1can_1focus)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1can_1focus_FUNC);
	gtk_widget_set_can_focus((GtkWidget *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1can_1focus_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1clip
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1clip)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GtkAllocation _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1clip_FUNC);
	if (arg1) if ((lparg1 = getGtkAllocationFields(env, arg1, &_arg1)) == NULL) goto fail;
/*
	gtk_widget_set_clip((GtkWidget *)arg0, lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_clip)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GtkAllocation *))fp)((GtkWidget *)arg0, lparg1);
		}
	}
fail:
	if (arg1 && lparg1) setGtkAllocationFields(env, arg1, lparg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1clip_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1cursor
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1cursor)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1cursor_FUNC);
/*
	gtk_widget_set_cursor((GtkWidget *)arg0, (GdkCursor *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_cursor)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GdkCursor *))fp)((GtkWidget *)arg0, (GdkCursor *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1cursor_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1default_1direction
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1default_1direction)
	(JNIEnv *env, jclass that, jint arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1default_1direction_FUNC);
	gtk_widget_set_default_direction((GtkTextDirection)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1default_1direction_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1direction
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1direction)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1direction_FUNC);
	gtk_widget_set_direction((GtkWidget *)arg0, (GtkTextDirection)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1direction_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1double_1buffered
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1double_1buffered)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1double_1buffered_FUNC);
/*
	gtk_widget_set_double_buffered((GtkWidget *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_double_buffered)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gboolean))fp)((GtkWidget *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1double_1buffered_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1focus_1on_1click
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1focus_1on_1click)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1focus_1on_1click_FUNC);
/*
	gtk_widget_set_focus_on_click((GtkWidget *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_focus_on_click)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gboolean))fp)((GtkWidget *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1focus_1on_1click_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1halign
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1halign)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1halign_FUNC);
	gtk_widget_set_halign((GtkWidget *)arg0, (GtkAlign)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1halign_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1has_1window
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1has_1window)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1has_1window_FUNC);
/*
	gtk_widget_set_has_window((GtkWidget *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_has_window)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gboolean))fp)((GtkWidget *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1has_1window_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1hexpand
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1hexpand)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1hexpand_FUNC);
	gtk_widget_set_hexpand((GtkWidget *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1hexpand_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1margin_1bottom
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1margin_1bottom)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1margin_1bottom_FUNC);
/*
	gtk_widget_set_margin_bottom((GtkWidget *)arg0, (gint)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_margin_bottom)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gint))fp)((GtkWidget *)arg0, (gint)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1margin_1bottom_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1margin_1end
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1margin_1end)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1margin_1end_FUNC);
/*
	gtk_widget_set_margin_end((GtkWidget *)arg0, (gint)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_margin_end)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gint))fp)((GtkWidget *)arg0, (gint)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1margin_1end_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1margin_1start
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1margin_1start)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1margin_1start_FUNC);
/*
	gtk_widget_set_margin_start((GtkWidget *)arg0, (gint)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_margin_start)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gint))fp)((GtkWidget *)arg0, (gint)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1margin_1start_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1margin_1top
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1margin_1top)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1margin_1top_FUNC);
/*
	gtk_widget_set_margin_top((GtkWidget *)arg0, (gint)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_margin_top)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gint))fp)((GtkWidget *)arg0, (gint)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1margin_1top_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1opacity
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1opacity)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1opacity_FUNC);
/*
	gtk_widget_set_opacity((GtkWidget *)arg0, arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_opacity)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, jdouble))fp)((GtkWidget *)arg0, arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1opacity_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1parent
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1parent)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1parent_FUNC);
/*
	gtk_widget_set_parent((GtkWidget *)arg0, (GtkWidget *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_parent)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GtkWidget *))fp)((GtkWidget *)arg0, (GtkWidget *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1parent_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1parent_1window
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1parent_1window)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1parent_1window_FUNC);
/*
	gtk_widget_set_parent_window((GtkWidget *)arg0, (GdkWindow *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_parent_window)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GdkWindow *))fp)((GtkWidget *)arg0, (GdkWindow *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1parent_1window_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1receives_1default
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1receives_1default)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1receives_1default_FUNC);
	gtk_widget_set_receives_default((GtkWidget *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1receives_1default_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1redraw_1on_1allocate
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1redraw_1on_1allocate)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1redraw_1on_1allocate_FUNC);
/*
	gtk_widget_set_redraw_on_allocate((GtkWidget *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_set_redraw_on_allocate)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, gboolean))fp)((GtkWidget *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1redraw_1on_1allocate_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1sensitive
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1sensitive)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1sensitive_FUNC);
	gtk_widget_set_sensitive((GtkWidget *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1sensitive_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1size_1request
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1size_1request)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1size_1request_FUNC);
	gtk_widget_set_size_request((GtkWidget *)arg0, (gint)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1size_1request_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1tooltip_1text
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1tooltip_1text)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1tooltip_1text_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_widget_set_tooltip_text((GtkWidget *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1tooltip_1text_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1valign
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1valign)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1valign_FUNC);
	gtk_widget_set_valign((GtkWidget *)arg0, (GtkAlign)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1valign_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1vexpand
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1vexpand)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1vexpand_FUNC);
	gtk_widget_set_vexpand((GtkWidget *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1vexpand_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1set_1visible
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1visible)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1visible_FUNC);
	gtk_widget_set_visible((GtkWidget *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1visible_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1shape_1combine_1region
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1shape_1combine_1region)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1shape_1combine_1region_FUNC);
/*
	gtk_widget_shape_combine_region((GtkWidget *)arg0, (cairo_region_t *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_shape_combine_region)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, cairo_region_t *))fp)((GtkWidget *)arg0, (cairo_region_t *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1shape_1combine_1region_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1show
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1show)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1show_FUNC);
	gtk_widget_show((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1show_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1size_1allocate__JLorg_eclipse_swt_internal_gtk_GtkAllocation_2
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1size_1allocate__JLorg_eclipse_swt_internal_gtk_GtkAllocation_2)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GtkAllocation _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1size_1allocate__JLorg_eclipse_swt_internal_gtk_GtkAllocation_2_FUNC);
	if (arg1) if ((lparg1 = getGtkAllocationFields(env, arg1, &_arg1)) == NULL) goto fail;
/*
	gtk_widget_size_allocate((GtkWidget *)arg0, (GtkAllocation *)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_size_allocate)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GtkAllocation *))fp)((GtkWidget *)arg0, (GtkAllocation *)lparg1);
		}
	}
fail:
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1size_1allocate__JLorg_eclipse_swt_internal_gtk_GtkAllocation_2_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1size_1allocate__JLorg_eclipse_swt_internal_gtk_GtkAllocation_2I
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1size_1allocate__JLorg_eclipse_swt_internal_gtk_GtkAllocation_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	GtkAllocation _arg1, *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1size_1allocate__JLorg_eclipse_swt_internal_gtk_GtkAllocation_2I_FUNC);
	if (arg1) if ((lparg1 = getGtkAllocationFields(env, arg1, &_arg1)) == NULL) goto fail;
/*
	gtk_widget_size_allocate((GtkWidget *)arg0, (GtkAllocation *)lparg1, arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_size_allocate)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkWidget *, GtkAllocation *, jint))fp)((GtkWidget *)arg0, (GtkAllocation *)lparg1, arg2);
		}
	}
fail:
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1size_1allocate__JLorg_eclipse_swt_internal_gtk_GtkAllocation_2I_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1snapshot_1child
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1snapshot_1child)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1snapshot_1child_FUNC);
	gtk_widget_snapshot_child((GtkWidget *)arg0, (GtkWidget *)arg1, (GtkSnapshot *)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1snapshot_1child_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1style_1get__J_3B_3IJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1style_1get__J_3B_3IJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jintArray arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1style_1get__J_3B_3IJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_widget_style_get((GtkWidget *)arg0, (const gchar *)lparg1, lparg2, (const gchar *)NULL);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1style_1get__J_3B_3IJ_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1style_1get__J_3B_3JJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1style_1get__J_3B_3JJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlongArray arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	jlong *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1style_1get__J_3B_3JJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_widget_style_get((GtkWidget *)arg0, (const gchar *)lparg1, lparg2, (const gchar *)NULL);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1style_1get__J_3B_3JJ_FUNC);
}
#endif

#ifndef NO_gtk_1widget_1translate_1coordinates__JJDD_3D_3D
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1translate_1coordinates__JJDD_3D_3D)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jdouble arg2, jdouble arg3, jdoubleArray arg4, jdoubleArray arg5)
{
	jdouble *lparg4=NULL;
	jdouble *lparg5=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1translate_1coordinates__JJDD_3D_3D_FUNC);
	if (arg4) if ((lparg4 = (*env)->GetDoubleArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetDoubleArrayElements(env, arg5, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)gtk_widget_translate_coordinates((GtkWidget *)arg0, (GtkWidget *)arg1, arg2, arg3, (double *)lparg4, (double *)lparg5);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_translate_coordinates)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GtkWidget *, GtkWidget *, jdouble, jdouble, double *, double *))fp)((GtkWidget *)arg0, (GtkWidget *)arg1, arg2, arg3, (double *)lparg4, (double *)lparg5);
		}
	}
fail:
	if (arg5 && lparg5) (*env)->ReleaseDoubleArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseDoubleArrayElements(env, arg4, lparg4, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1translate_1coordinates__JJDD_3D_3D_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1translate_1coordinates__JJII_3I_3I
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1translate_1coordinates__JJII_3I_3I)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3, jintArray arg4, jintArray arg5)
{
	jint *lparg4=NULL;
	jint *lparg5=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1translate_1coordinates__JJII_3I_3I_FUNC);
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetIntArrayElements(env, arg5, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)gtk_widget_translate_coordinates((GtkWidget *)arg0, (GtkWidget *)arg1, arg2, arg3, (gint *)lparg4, (gint *)lparg5);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_translate_coordinates)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GtkWidget *, GtkWidget *, jint, jint, gint *, gint *))fp)((GtkWidget *)arg0, (GtkWidget *)arg1, arg2, arg3, (gint *)lparg4, (gint *)lparg5);
		}
	}
fail:
	if (arg5 && lparg5) (*env)->ReleaseIntArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1translate_1coordinates__JJII_3I_3I_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1unparent
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1unparent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1unparent_FUNC);
	gtk_widget_unparent((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1unparent_FUNC);
}
#endif

#ifndef NO_gtk_1window_1fullscreen
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1fullscreen)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1fullscreen_FUNC);
	gtk_window_fullscreen((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1fullscreen_FUNC);
}
#endif

#ifndef NO_gtk_1window_1get_1default_1size
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1get_1default_1size)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1get_1default_1size_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	gtk_window_get_default_size((GtkWindow *)arg0, (gint *)lparg1, (gint *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1get_1default_1size_FUNC);
}
#endif

#ifndef NO_gtk_1window_1get_1default_1widget
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1window_1get_1default_1widget)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1get_1default_1widget_FUNC);
	rc = (jlong)gtk_window_get_default_widget((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1get_1default_1widget_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1get_1focus
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1window_1get_1focus)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1get_1focus_FUNC);
	rc = (jlong)gtk_window_get_focus((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1get_1focus_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1get_1group
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1window_1get_1group)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1get_1group_FUNC);
	rc = (jlong)gtk_window_get_group((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1get_1group_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1get_1modal
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1window_1get_1modal)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1get_1modal_FUNC);
	rc = (jboolean)gtk_window_get_modal((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1get_1modal_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1group_1add_1window
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1group_1add_1window)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1group_1add_1window_FUNC);
	gtk_window_group_add_window((GtkWindowGroup*)arg0, (GtkWindow*)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1group_1add_1window_FUNC);
}
#endif

#ifndef NO_gtk_1window_1group_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1window_1group_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1group_1new_FUNC);
	rc = (jlong)gtk_window_group_new();
	GTK_NATIVE_EXIT(env, that, gtk_1window_1group_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1group_1remove_1window
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1group_1remove_1window)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1group_1remove_1window_FUNC);
	gtk_window_group_remove_window((GtkWindowGroup*)arg0, (GtkWindow*)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1group_1remove_1window_FUNC);
}
#endif

#ifndef NO_gtk_1window_1is_1active
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1window_1is_1active)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1is_1active_FUNC);
	rc = (jboolean)gtk_window_is_active((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1is_1active_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1list_1toplevels
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1window_1list_1toplevels)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1list_1toplevels_FUNC);
	rc = (jlong)gtk_window_list_toplevels();
	GTK_NATIVE_EXIT(env, that, gtk_1window_1list_1toplevels_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1maximize
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1maximize)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1maximize_FUNC);
	gtk_window_maximize((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1maximize_FUNC);
}
#endif

#ifndef NO_gtk_1window_1set_1decorated
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1decorated)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1decorated_FUNC);
	gtk_window_set_decorated((GtkWindow *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1decorated_FUNC);
}
#endif

#ifndef NO_gtk_1window_1set_1default_1size
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1default_1size)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1default_1size_FUNC);
	gtk_window_set_default_size((GtkWindow *)arg0, (gint)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1default_1size_FUNC);
}
#endif

#ifndef NO_gtk_1window_1set_1destroy_1with_1parent
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1destroy_1with_1parent)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1destroy_1with_1parent_FUNC);
	gtk_window_set_destroy_with_parent((GtkWindow *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1destroy_1with_1parent_FUNC);
}
#endif

#ifndef NO_gtk_1window_1set_1geometry_1hints
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1geometry_1hints)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jobject arg2, jint arg3)
{
	GdkGeometry _arg2, *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1geometry_1hints_FUNC);
	if (arg2) if ((lparg2 = getGdkGeometryFields(env, arg2, &_arg2)) == NULL) goto fail;
	gtk_window_set_geometry_hints((GtkWindow *)arg0, (GtkWidget *)arg1, lparg2, arg3);
fail:
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1geometry_1hints_FUNC);
}
#endif

#ifndef NO_gtk_1window_1set_1modal
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1modal)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1modal_FUNC);
	gtk_window_set_modal((GtkWindow *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1modal_FUNC);
}
#endif

#ifndef NO_gtk_1window_1set_1resizable
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1resizable)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1resizable_FUNC);
	gtk_window_set_resizable((GtkWindow *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1resizable_FUNC);
}
#endif

#ifndef NO_gtk_1window_1set_1title
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1title)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1title_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_window_set_title((GtkWindow *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1title_FUNC);
}
#endif

#ifndef NO_gtk_1window_1set_1transient_1for
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1transient_1for)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1transient_1for_FUNC);
	gtk_window_set_transient_for((GtkWindow *)arg0, (GtkWindow *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1transient_1for_FUNC);
}
#endif

#ifndef NO_gtk_1window_1unfullscreen
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1unfullscreen)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1unfullscreen_FUNC);
	gtk_window_unfullscreen((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1unfullscreen_FUNC);
}
#endif

#ifndef NO_gtk_1window_1unmaximize
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1unmaximize)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1unmaximize_FUNC);
	gtk_window_unmaximize((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1unmaximize_FUNC);
}
#endif

#ifndef Graphene_NATIVE
#define Graphene_NATIVE(func) Java_org_eclipse_swt_internal_gtk_Graphene_##func
#endif

#ifndef NO_graphene_1rect_1alloc
JNIEXPORT jlong JNICALL Graphene_NATIVE(graphene_1rect_1alloc)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	Graphene_NATIVE_ENTER(env, that, graphene_1rect_1alloc_FUNC);
	rc = (jlong)graphene_rect_alloc();
	Graphene_NATIVE_EXIT(env, that, graphene_1rect_1alloc_FUNC);
	return rc;
}
#endif

#ifndef NO_graphene_1rect_1free
JNIEXPORT void JNICALL Graphene_NATIVE(graphene_1rect_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	Graphene_NATIVE_ENTER(env, that, graphene_1rect_1free_FUNC);
	graphene_rect_free((graphene_rect_t *)arg0);
	Graphene_NATIVE_EXIT(env, that, graphene_1rect_1free_FUNC);
}
#endif

#ifndef NO_graphene_1rect_1init
JNIEXPORT jlong JNICALL Graphene_NATIVE(graphene_1rect_1init)
	(JNIEnv *env, jclass that, jlong arg0, jfloat arg1, jfloat arg2, jfloat arg3, jfloat arg4)
{
	jlong rc = 0;
	Graphene_NATIVE_ENTER(env, that, graphene_1rect_1init_FUNC);
	rc = (jlong)graphene_rect_init((graphene_rect_t *)arg0, arg1, arg2, arg3, arg4);
	Graphene_NATIVE_EXIT(env, that, graphene_1rect_1init_FUNC);
	return rc;
}
#endif

#ifndef OS_NATIVE
#define OS_NATIVE(func) Java_org_eclipse_swt_internal_gtk_OS_##func
#endif

#ifndef NO_Call__JJII
JNIEXPORT jint JNICALL OS_NATIVE(Call__JJII)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, Call__JJII_FUNC);
	rc = (jint)((jint (*)())arg0)(arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, Call__JJII_FUNC);
	return rc;
}
#endif

#ifndef NO_Call__JJJ
JNIEXPORT jint JNICALL OS_NATIVE(Call__JJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, Call__JJJ_FUNC);
	rc = (jint)((jint (*)())arg0)(arg1, arg2);
	OS_NATIVE_EXIT(env, that, Call__JJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_FcConfigAppFontAddFile
JNIEXPORT jboolean JNICALL OS_NATIVE(FcConfigAppFontAddFile)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, FcConfigAppFontAddFile_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)FcConfigAppFontAddFile(arg0, lparg1);
*/
	{
		OS_LOAD_FUNCTION(fp, FcConfigAppFontAddFile)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong, jbyte *))fp)(arg0, lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, FcConfigAppFontAddFile_FUNC);
	return rc;
}
#endif

#ifndef NO_GPollFD_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(GPollFD_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, GPollFD_1sizeof_FUNC);
	rc = (jint)GPollFD_sizeof();
	OS_NATIVE_EXIT(env, that, GPollFD_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_GTypeInfo_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(GTypeInfo_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, GTypeInfo_1sizeof_FUNC);
	rc = (jint)GTypeInfo_sizeof();
	OS_NATIVE_EXIT(env, that, GTypeInfo_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1OBJECT_1CLASS_1CONSTRUCTOR
JNIEXPORT jlong JNICALL OS_NATIVE(G_1OBJECT_1CLASS_1CONSTRUCTOR)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1OBJECT_1CLASS_1CONSTRUCTOR_FUNC);
	rc = (jlong)G_OBJECT_CLASS_CONSTRUCTOR((GObjectClass *)arg0);
	OS_NATIVE_EXIT(env, that, G_1OBJECT_1CLASS_1CONSTRUCTOR_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1OBJECT_1CLASS_1SET_1CONSTRUCTOR
JNIEXPORT void JNICALL OS_NATIVE(G_1OBJECT_1CLASS_1SET_1CONSTRUCTOR)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, G_1OBJECT_1CLASS_1SET_1CONSTRUCTOR_FUNC);
	G_OBJECT_CLASS_SET_CONSTRUCTOR((GObjectClass *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, G_1OBJECT_1CLASS_1SET_1CONSTRUCTOR_FUNC);
}
#endif

#ifndef NO_G_1OBJECT_1GET_1CLASS
JNIEXPORT jlong JNICALL OS_NATIVE(G_1OBJECT_1GET_1CLASS)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1OBJECT_1GET_1CLASS_FUNC);
	rc = (jlong)G_OBJECT_GET_CLASS(arg0);
	OS_NATIVE_EXIT(env, that, G_1OBJECT_1GET_1CLASS_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1OBJECT_1TYPE
JNIEXPORT jlong JNICALL OS_NATIVE(G_1OBJECT_1TYPE)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1OBJECT_1TYPE_FUNC);
	rc = (jlong)G_OBJECT_TYPE(arg0);
	OS_NATIVE_EXIT(env, that, G_1OBJECT_1TYPE_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1OBJECT_1TYPE_1NAME
JNIEXPORT jlong JNICALL OS_NATIVE(G_1OBJECT_1TYPE_1NAME)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1OBJECT_1TYPE_1NAME_FUNC);
	rc = (jlong)G_OBJECT_TYPE_NAME(arg0);
	OS_NATIVE_EXIT(env, that, G_1OBJECT_1TYPE_1NAME_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1TYPE_1BOOLEAN
JNIEXPORT jlong JNICALL OS_NATIVE(G_1TYPE_1BOOLEAN)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1TYPE_1BOOLEAN_FUNC);
	rc = (jlong)G_TYPE_BOOLEAN;
	OS_NATIVE_EXIT(env, that, G_1TYPE_1BOOLEAN_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1TYPE_1DOUBLE
JNIEXPORT jlong JNICALL OS_NATIVE(G_1TYPE_1DOUBLE)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1TYPE_1DOUBLE_FUNC);
	rc = (jlong)G_TYPE_DOUBLE;
	OS_NATIVE_EXIT(env, that, G_1TYPE_1DOUBLE_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1TYPE_1FLOAT
JNIEXPORT jlong JNICALL OS_NATIVE(G_1TYPE_1FLOAT)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1TYPE_1FLOAT_FUNC);
	rc = (jlong)G_TYPE_FLOAT;
	OS_NATIVE_EXIT(env, that, G_1TYPE_1FLOAT_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1TYPE_1INT
JNIEXPORT jlong JNICALL OS_NATIVE(G_1TYPE_1INT)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1TYPE_1INT_FUNC);
	rc = (jlong)G_TYPE_INT;
	OS_NATIVE_EXIT(env, that, G_1TYPE_1INT_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1TYPE_1INT64
JNIEXPORT jlong JNICALL OS_NATIVE(G_1TYPE_1INT64)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1TYPE_1INT64_FUNC);
	rc = (jlong)G_TYPE_INT64;
	OS_NATIVE_EXIT(env, that, G_1TYPE_1INT64_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1TYPE_1LONG
JNIEXPORT jlong JNICALL OS_NATIVE(G_1TYPE_1LONG)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1TYPE_1LONG_FUNC);
	rc = (jlong)G_TYPE_LONG;
	OS_NATIVE_EXIT(env, that, G_1TYPE_1LONG_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1TYPE_1STRING
JNIEXPORT jlong JNICALL OS_NATIVE(G_1TYPE_1STRING)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1TYPE_1STRING_FUNC);
	rc = (jlong)G_TYPE_STRING;
	OS_NATIVE_EXIT(env, that, G_1TYPE_1STRING_FUNC);
	return rc;
}
#endif

#ifndef NO_G_1VALUE_1TYPE
JNIEXPORT jlong JNICALL OS_NATIVE(G_1VALUE_1TYPE)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, G_1VALUE_1TYPE_FUNC);
	rc = (jlong)G_VALUE_TYPE(arg0);
	OS_NATIVE_EXIT(env, that, G_1VALUE_1TYPE_FUNC);
	return rc;
}
#endif

#ifndef NO_PANGO_1PIXELS
JNIEXPORT jint JNICALL OS_NATIVE(PANGO_1PIXELS)
	(JNIEnv *env, jclass that, jint arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, PANGO_1PIXELS_FUNC);
	rc = (jint)PANGO_PIXELS(arg0);
	OS_NATIVE_EXIT(env, that, PANGO_1PIXELS_FUNC);
	return rc;
}
#endif

#ifndef NO_PANGO_1TYPE_1FONT_1DESCRIPTION
JNIEXPORT jlong JNICALL OS_NATIVE(PANGO_1TYPE_1FONT_1DESCRIPTION)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PANGO_1TYPE_1FONT_1DESCRIPTION_FUNC);
	rc = (jlong)PANGO_TYPE_FONT_DESCRIPTION;
	OS_NATIVE_EXIT(env, that, PANGO_1TYPE_1FONT_1DESCRIPTION_FUNC);
	return rc;
}
#endif

#ifndef NO_PANGO_1TYPE_1FONT_1FACE
JNIEXPORT jlong JNICALL OS_NATIVE(PANGO_1TYPE_1FONT_1FACE)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PANGO_1TYPE_1FONT_1FACE_FUNC);
	rc = (jlong)PANGO_TYPE_FONT_FACE;
	OS_NATIVE_EXIT(env, that, PANGO_1TYPE_1FONT_1FACE_FUNC);
	return rc;
}
#endif

#ifndef NO_PANGO_1TYPE_1FONT_1FAMILY
JNIEXPORT jlong JNICALL OS_NATIVE(PANGO_1TYPE_1FONT_1FAMILY)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PANGO_1TYPE_1FONT_1FAMILY_FUNC);
	rc = (jlong)PANGO_TYPE_FONT_FAMILY;
	OS_NATIVE_EXIT(env, that, PANGO_1TYPE_1FONT_1FAMILY_FUNC);
	return rc;
}
#endif

#ifndef NO_PANGO_1TYPE_1LAYOUT
JNIEXPORT jlong JNICALL OS_NATIVE(PANGO_1TYPE_1LAYOUT)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, PANGO_1TYPE_1LAYOUT_FUNC);
	rc = (jlong)PANGO_TYPE_LAYOUT;
	OS_NATIVE_EXIT(env, that, PANGO_1TYPE_1LAYOUT_FUNC);
	return rc;
}
#endif

#ifndef NO_PangoAttrColor_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(PangoAttrColor_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, PangoAttrColor_1sizeof_FUNC);
	rc = (jint)PangoAttrColor_sizeof();
	OS_NATIVE_EXIT(env, that, PangoAttrColor_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_PangoAttrInt_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(PangoAttrInt_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, PangoAttrInt_1sizeof_FUNC);
	rc = (jint)PangoAttrInt_sizeof();
	OS_NATIVE_EXIT(env, that, PangoAttrInt_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_PangoAttribute_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(PangoAttribute_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, PangoAttribute_1sizeof_FUNC);
	rc = (jint)PangoAttribute_sizeof();
	OS_NATIVE_EXIT(env, that, PangoAttribute_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_PangoItem_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(PangoItem_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, PangoItem_1sizeof_FUNC);
	rc = (jint)PangoItem_sizeof();
	OS_NATIVE_EXIT(env, that, PangoItem_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_PangoLayoutLine_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(PangoLayoutLine_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, PangoLayoutLine_1sizeof_FUNC);
	rc = (jint)PangoLayoutLine_sizeof();
	OS_NATIVE_EXIT(env, that, PangoLayoutLine_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_PangoLayoutRun_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(PangoLayoutRun_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, PangoLayoutRun_1sizeof_FUNC);
	rc = (jint)PangoLayoutRun_sizeof();
	OS_NATIVE_EXIT(env, that, PangoLayoutRun_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_PangoLogAttr_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(PangoLogAttr_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, PangoLogAttr_1sizeof_FUNC);
	rc = (jint)PangoLogAttr_sizeof();
	OS_NATIVE_EXIT(env, that, PangoLogAttr_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_PangoRectangle_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(PangoRectangle_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, PangoRectangle_1sizeof_FUNC);
	rc = (jint)PangoRectangle_sizeof();
	OS_NATIVE_EXIT(env, that, PangoRectangle_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_XAnyEvent_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(XAnyEvent_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, XAnyEvent_1sizeof_FUNC);
	rc = (jint)XAnyEvent_sizeof();
	OS_NATIVE_EXIT(env, that, XAnyEvent_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_XCheckIfEvent
JNIEXPORT jboolean JNICALL OS_NATIVE(XCheckIfEvent)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, XCheckIfEvent_FUNC);
	rc = (jboolean)XCheckIfEvent((Display *)arg0, (XEvent *)arg1, (Bool (*)())arg2, (XPointer)arg3);
	OS_NATIVE_EXIT(env, that, XCheckIfEvent_FUNC);
	return rc;
}
#endif

#ifndef NO_XDefaultRootWindow
JNIEXPORT jlong JNICALL OS_NATIVE(XDefaultRootWindow)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, XDefaultRootWindow_FUNC);
	rc = (jlong)XDefaultRootWindow((Display *)arg0);
	OS_NATIVE_EXIT(env, that, XDefaultRootWindow_FUNC);
	return rc;
}
#endif

#ifndef NO_XDefaultScreen
JNIEXPORT jint JNICALL OS_NATIVE(XDefaultScreen)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, XDefaultScreen_FUNC);
	rc = (jint)XDefaultScreen((Display *)arg0);
	OS_NATIVE_EXIT(env, that, XDefaultScreen_FUNC);
	return rc;
}
#endif

#ifndef NO_XEvent_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(XEvent_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, XEvent_1sizeof_FUNC);
	rc = (jint)XEvent_sizeof();
	OS_NATIVE_EXIT(env, that, XEvent_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_XExposeEvent_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(XExposeEvent_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, XExposeEvent_1sizeof_FUNC);
	rc = (jint)XExposeEvent_sizeof();
	OS_NATIVE_EXIT(env, that, XExposeEvent_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_XFocusChangeEvent_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(XFocusChangeEvent_1sizeof)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, XFocusChangeEvent_1sizeof_FUNC);
	rc = (jint)XFocusChangeEvent_sizeof();
	OS_NATIVE_EXIT(env, that, XFocusChangeEvent_1sizeof_FUNC);
	return rc;
}
#endif

#ifndef NO_XFree
JNIEXPORT void JNICALL OS_NATIVE(XFree)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, XFree_FUNC);
	XFree((void *)arg0);
	OS_NATIVE_EXIT(env, that, XFree_FUNC);
}
#endif

#ifndef NO_XQueryPointer
JNIEXPORT jint JNICALL OS_NATIVE(XQueryPointer)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2, jlongArray arg3, jintArray arg4, jintArray arg5, jintArray arg6, jintArray arg7, jintArray arg8)
{
	jlong *lparg2=NULL;
	jlong *lparg3=NULL;
	jint *lparg4=NULL;
	jint *lparg5=NULL;
	jint *lparg6=NULL;
	jint *lparg7=NULL;
	jint *lparg8=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, XQueryPointer_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetLongArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetIntArrayElements(env, arg5, NULL)) == NULL) goto fail;
	if (arg6) if ((lparg6 = (*env)->GetIntArrayElements(env, arg6, NULL)) == NULL) goto fail;
	if (arg7) if ((lparg7 = (*env)->GetIntArrayElements(env, arg7, NULL)) == NULL) goto fail;
	if (arg8) if ((lparg8 = (*env)->GetIntArrayElements(env, arg8, NULL)) == NULL) goto fail;
	rc = (jint)XQueryPointer((Display *)arg0, (Window)arg1, (Window *)lparg2, (Window *)lparg3, (int *)lparg4, (int *)lparg5, (int *)lparg6, (int *)lparg7, (unsigned int *)lparg8);
fail:
	if (arg8 && lparg8) (*env)->ReleaseIntArrayElements(env, arg8, lparg8, 0);
	if (arg7 && lparg7) (*env)->ReleaseIntArrayElements(env, arg7, lparg7, 0);
	if (arg6 && lparg6) (*env)->ReleaseIntArrayElements(env, arg6, lparg6, 0);
	if (arg5 && lparg5) (*env)->ReleaseIntArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseLongArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, XQueryPointer_FUNC);
	return rc;
}
#endif

#ifndef NO_XSetErrorHandler
JNIEXPORT jlong JNICALL OS_NATIVE(XSetErrorHandler)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, XSetErrorHandler_FUNC);
	rc = (jlong)XSetErrorHandler((XErrorHandler)arg0);
	OS_NATIVE_EXIT(env, that, XSetErrorHandler_FUNC);
	return rc;
}
#endif

#ifndef NO_XSetIOErrorHandler
JNIEXPORT jlong JNICALL OS_NATIVE(XSetIOErrorHandler)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, XSetIOErrorHandler_FUNC);
	rc = (jlong)XSetIOErrorHandler((XIOErrorHandler)arg0);
	OS_NATIVE_EXIT(env, that, XSetIOErrorHandler_FUNC);
	return rc;
}
#endif

#ifndef NO_XSetInputFocus
JNIEXPORT jint JNICALL OS_NATIVE(XSetInputFocus)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, XSetInputFocus_FUNC);
	rc = (jint)XSetInputFocus((Display *)arg0, (Window)arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, XSetInputFocus_FUNC);
	return rc;
}
#endif

#ifndef NO_XSetTransientForHint
JNIEXPORT jint JNICALL OS_NATIVE(XSetTransientForHint)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, XSetTransientForHint_FUNC);
	rc = (jint)XSetTransientForHint((Display *)arg0, (Window)arg1, (Window)arg2);
	OS_NATIVE_EXIT(env, that, XSetTransientForHint_FUNC);
	return rc;
}
#endif

#ifndef NO_XSynchronize
JNIEXPORT jlong JNICALL OS_NATIVE(XSynchronize)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, XSynchronize_FUNC);
	rc = (jlong)XSynchronize((Display *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, XSynchronize_FUNC);
	return rc;
}
#endif

#ifndef NO_X_1EVENT_1TYPE
JNIEXPORT jint JNICALL OS_NATIVE(X_1EVENT_1TYPE)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, X_1EVENT_1TYPE_FUNC);
	rc = (jint)X_EVENT_TYPE((XEvent *)arg0);
	OS_NATIVE_EXIT(env, that, X_1EVENT_1TYPE_FUNC);
	return rc;
}
#endif

#ifndef NO_X_1EVENT_1WINDOW
JNIEXPORT jlong JNICALL OS_NATIVE(X_1EVENT_1WINDOW)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, X_1EVENT_1WINDOW_FUNC);
	rc = (jlong)X_EVENT_WINDOW((XAnyEvent *)arg0);
	OS_NATIVE_EXIT(env, that, X_1EVENT_1WINDOW_FUNC);
	return rc;
}
#endif

#ifndef NO_call__JJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(call__JJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, call__JJJJJ_FUNC);
	rc = (jlong)((jlong (*)())arg0)(arg1, arg2, arg3, arg4);
	OS_NATIVE_EXIT(env, that, call__JJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_call__JJJJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(call__JJJJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, call__JJJJJJJ_FUNC);
	rc = (jlong)((jlong (*)())arg0)(arg1, arg2, arg3, arg4, arg5, arg6);
	OS_NATIVE_EXIT(env, that, call__JJJJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_call__JJJJJJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(call__JJJJJJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6, jlong arg7)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, call__JJJJJJJJ_FUNC);
	rc = (jlong)((jlong (*)())arg0)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
	OS_NATIVE_EXIT(env, that, call__JJJJJJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1action_1get_1enabled
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1action_1get_1enabled)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1action_1get_1enabled_FUNC);
	rc = (jboolean)g_action_get_enabled((GAction *)arg0);
	OS_NATIVE_EXIT(env, that, g_1action_1get_1enabled_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1action_1get_1state
JNIEXPORT jlong JNICALL OS_NATIVE(g_1action_1get_1state)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1action_1get_1state_FUNC);
	rc = (jlong)g_action_get_state((GAction *)arg0);
	OS_NATIVE_EXIT(env, that, g_1action_1get_1state_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1action_1map_1add_1action
JNIEXPORT void JNICALL OS_NATIVE(g_1action_1map_1add_1action)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, g_1action_1map_1add_1action_FUNC);
	g_action_map_add_action((GActionMap *)arg0, (GAction *)arg1);
	OS_NATIVE_EXIT(env, that, g_1action_1map_1add_1action_FUNC);
}
#endif

#ifndef NO_g_1app_1info_1create_1from_1commandline
JNIEXPORT jlong JNICALL OS_NATIVE(g_1app_1info_1create_1from_1commandline)
	(JNIEnv *env, jclass that, jbyteArray arg0, jbyteArray arg1, jlong arg2, jlong arg3)
{
	jbyte *lparg0=NULL;
	jbyte *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1app_1info_1create_1from_1commandline_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_app_info_create_from_commandline((gchar *)lparg0, (gchar *)lparg1, (GAppInfoCreateFlags)arg2, (GError **)arg3);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1app_1info_1create_1from_1commandline_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1app_1info_1get_1all
JNIEXPORT jlong JNICALL OS_NATIVE(g_1app_1info_1get_1all)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1app_1info_1get_1all_FUNC);
	rc = (jlong)g_app_info_get_all();
	OS_NATIVE_EXIT(env, that, g_1app_1info_1get_1all_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1app_1info_1get_1default_1for_1type
JNIEXPORT jlong JNICALL OS_NATIVE(g_1app_1info_1get_1default_1for_1type)
	(JNIEnv *env, jclass that, jbyteArray arg0, jboolean arg1)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1app_1info_1get_1default_1for_1type_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_app_info_get_default_for_type((gchar *)lparg0, (gboolean)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1app_1info_1get_1default_1for_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1app_1info_1get_1executable
JNIEXPORT jlong JNICALL OS_NATIVE(g_1app_1info_1get_1executable)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1app_1info_1get_1executable_FUNC);
	rc = (jlong)g_app_info_get_executable((GAppInfo *)arg0);
	OS_NATIVE_EXIT(env, that, g_1app_1info_1get_1executable_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1app_1info_1get_1icon
JNIEXPORT jlong JNICALL OS_NATIVE(g_1app_1info_1get_1icon)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1app_1info_1get_1icon_FUNC);
	rc = (jlong)g_app_info_get_icon((GAppInfo *)arg0);
	OS_NATIVE_EXIT(env, that, g_1app_1info_1get_1icon_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1app_1info_1get_1name
JNIEXPORT jlong JNICALL OS_NATIVE(g_1app_1info_1get_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1app_1info_1get_1name_FUNC);
	rc = (jlong)g_app_info_get_name((GAppInfo *)arg0);
	OS_NATIVE_EXIT(env, that, g_1app_1info_1get_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1app_1info_1launch
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1app_1info_1launch)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1app_1info_1launch_FUNC);
	rc = (jboolean)g_app_info_launch((GAppInfo *)arg0, (GList *)arg1, (GAppLaunchContext *)arg2, (GError **)arg3);
	OS_NATIVE_EXIT(env, that, g_1app_1info_1launch_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1app_1info_1launch_1default_1for_1uri
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1app_1info_1launch_1default_1for_1uri)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1app_1info_1launch_1default_1for_1uri_FUNC);
	rc = (jboolean)g_app_info_launch_default_for_uri((char *)arg0, (GAppLaunchContext *)arg1, (GError **)arg2);
	OS_NATIVE_EXIT(env, that, g_1app_1info_1launch_1default_1for_1uri_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1app_1info_1supports_1uris
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1app_1info_1supports_1uris)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1app_1info_1supports_1uris_FUNC);
	rc = (jboolean)g_app_info_supports_uris((GAppInfo *)arg0);
	OS_NATIVE_EXIT(env, that, g_1app_1info_1supports_1uris_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1bus_1own_1name
JNIEXPORT jint JNICALL OS_NATIVE(g_1bus_1own_1name)
	(JNIEnv *env, jclass that, jint arg0, jbyteArray arg1, jint arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6, jlong arg7)
{
	jbyte *lparg1=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1bus_1own_1name_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jint)g_bus_own_name((GBusType)arg0, (const gchar *)lparg1, (GBusNameOwnerFlags)arg2, (GBusAcquiredCallback)arg3, (GBusNameAcquiredCallback)arg4, (GBusNameLostCallback)arg5, (gpointer)arg6, (GDestroyNotify)arg7);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1bus_1own_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1bytes_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1bytes_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1bytes_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_bytes_new((gconstpointer)lparg0, (gsize)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1bytes_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1bytes_1unref
JNIEXPORT void JNICALL OS_NATIVE(g_1bytes_1unref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1bytes_1unref_FUNC);
	g_bytes_unref((GBytes *)arg0);
	OS_NATIVE_EXIT(env, that, g_1bytes_1unref_FUNC);
}
#endif

#ifndef NO_g_1cclosure_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1cclosure_1new)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1cclosure_1new_FUNC);
	rc = (jlong)g_cclosure_new((GCallback)arg0, (gpointer)arg1, (GClosureNotify)arg2);
	OS_NATIVE_EXIT(env, that, g_1cclosure_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1closure_1ref
JNIEXPORT jlong JNICALL OS_NATIVE(g_1closure_1ref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1closure_1ref_FUNC);
	rc = (jlong)g_closure_ref((GClosure *)arg0);
	OS_NATIVE_EXIT(env, that, g_1closure_1ref_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1closure_1sink
JNIEXPORT void JNICALL OS_NATIVE(g_1closure_1sink)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1closure_1sink_FUNC);
	g_closure_sink((GClosure *)arg0);
	OS_NATIVE_EXIT(env, that, g_1closure_1sink_FUNC);
}
#endif

#ifndef NO_g_1closure_1unref
JNIEXPORT void JNICALL OS_NATIVE(g_1closure_1unref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1closure_1unref_FUNC);
	g_closure_unref((GClosure *)arg0);
	OS_NATIVE_EXIT(env, that, g_1closure_1unref_FUNC);
}
#endif

#ifndef NO_g_1content_1type_1equals
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1content_1type_1equals)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1content_1type_1equals_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)g_content_type_equals((gchar *)arg0, (gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1content_1type_1equals_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1content_1type_1is_1a
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1content_1type_1is_1a)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1content_1type_1is_1a_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)g_content_type_is_a((gchar *)arg0, (gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1content_1type_1is_1a_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1credentials_1is_1same_1user
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1credentials_1is_1same_1user)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2)
{
	jlong *lparg2=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1credentials_1is_1same_1user_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jboolean)g_credentials_is_same_user((GCredentials *)arg0, (GCredentials *)arg1, (GError **)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, g_1credentials_1is_1same_1user_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1credentials_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1credentials_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1credentials_1new_FUNC);
	rc = (jlong)g_credentials_new();
	OS_NATIVE_EXIT(env, that, g_1credentials_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1date_1time_1get_1ymd
JNIEXPORT void JNICALL OS_NATIVE(g_1date_1time_1get_1ymd)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2, jintArray arg3)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jint *lparg3=NULL;
	OS_NATIVE_ENTER(env, that, g_1date_1time_1get_1ymd_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	g_date_time_get_ymd((GDateTime *)arg0, (gint *)lparg1, (gint *)lparg2, (gint *)lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1date_1time_1get_1ymd_FUNC);
}
#endif

#ifndef NO_g_1date_1time_1new_1local
JNIEXPORT jlong JNICALL OS_NATIVE(g_1date_1time_1new_1local)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3, jint arg4, jdouble arg5)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1date_1time_1new_1local_FUNC);
	rc = (jlong)g_date_time_new_local((gint)arg0, (gint)arg1, (gint)arg2, (gint)arg3, (gint)arg4, (gdouble)arg5);
	OS_NATIVE_EXIT(env, that, g_1date_1time_1new_1local_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1auth_1observer_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1auth_1observer_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1auth_1observer_1new_FUNC);
	rc = (jlong)g_dbus_auth_observer_new();
	OS_NATIVE_EXIT(env, that, g_1dbus_1auth_1observer_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1connection_1call
JNIEXPORT void JNICALL OS_NATIVE(g_1dbus_1connection_1call)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2, jbyteArray arg3, jbyteArray arg4, jlong arg5, jlong arg6, jint arg7, jint arg8, jlong arg9, jlong arg10, jlong arg11)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	jbyte *lparg3=NULL;
	jbyte *lparg4=NULL;
	OS_NATIVE_ENTER(env, that, g_1dbus_1connection_1call_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetByteArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetByteArrayElements(env, arg4, NULL)) == NULL) goto fail;
	g_dbus_connection_call((GDBusConnection *)arg0, (const gchar *)lparg1, (const gchar *)lparg2, (const gchar *)lparg3, (const gchar *)lparg4, (GVariant *)arg5, (const GVariantType *)arg6, arg7, arg8, (GCancellable *)arg9, (GAsyncReadyCallback)arg10, (gpointer)arg11);
fail:
	if (arg4 && lparg4) (*env)->ReleaseByteArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseByteArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1connection_1call_FUNC);
}
#endif

#ifndef NO_g_1dbus_1connection_1call_1finish
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1connection_1call_1finish)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2)
{
	jlong *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1connection_1call_1finish_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)g_dbus_connection_call_finish((GDBusConnection *)arg0, (GAsyncResult *)arg1, (GError **)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1connection_1call_1finish_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1connection_1call_1sync
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1connection_1call_1sync)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2, jbyteArray arg3, jbyteArray arg4, jlong arg5, jlong arg6, jint arg7, jint arg8, jlong arg9, jlongArray arg10)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	jbyte *lparg3=NULL;
	jbyte *lparg4=NULL;
	jlong *lparg10=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1connection_1call_1sync_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetByteArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetByteArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg10) if ((lparg10 = (*env)->GetLongArrayElements(env, arg10, NULL)) == NULL) goto fail;
	rc = (jlong)g_dbus_connection_call_sync((GDBusConnection *)arg0, (const gchar *)lparg1, (const gchar *)lparg2, (const gchar *)lparg3, (const gchar *)lparg4, (GVariant *)arg5, (const GVariantType *)arg6, arg7, arg8, (GCancellable *)arg9, (GError **)lparg10);
fail:
	if (arg10 && lparg10) (*env)->ReleaseLongArrayElements(env, arg10, lparg10, 0);
	if (arg4 && lparg4) (*env)->ReleaseByteArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseByteArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1connection_1call_1sync_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1connection_1close_1sync
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1dbus_1connection_1close_1sync)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2)
{
	jlong *lparg2=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1connection_1close_1sync_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jboolean)g_dbus_connection_close_sync((GDBusConnection *)arg0, (GCancellable *)arg1, (GError **)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1connection_1close_1sync_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1connection_1is_1closed
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1dbus_1connection_1is_1closed)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1connection_1is_1closed_FUNC);
	rc = (jboolean)g_dbus_connection_is_closed((GDBusConnection *)arg0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1connection_1is_1closed_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1connection_1new_1for_1address
JNIEXPORT void JNICALL OS_NATIVE(g_1dbus_1connection_1new_1for_1address)
	(JNIEnv *env, jclass that, jbyteArray arg0, jint arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5)
{
	jbyte *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, g_1dbus_1connection_1new_1for_1address_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	g_dbus_connection_new_for_address((const gchar *)lparg0, arg1, (GDBusAuthObserver *)arg2, (GCancellable *)arg3, (GAsyncReadyCallback)arg4, (gpointer)arg5);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1connection_1new_1for_1address_FUNC);
}
#endif

#ifndef NO_g_1dbus_1connection_1new_1for_1address_1finish
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1connection_1new_1for_1address_1finish)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1connection_1new_1for_1address_1finish_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_dbus_connection_new_for_address_finish((GAsyncResult *)arg0, (GError **)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1connection_1new_1for_1address_1finish_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1connection_1register_1object
JNIEXPORT jint JNICALL OS_NATIVE(g_1dbus_1connection_1register_1object)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jlongArray arg3, jlong arg4, jlong arg5, jlongArray arg6)
{
	jbyte *lparg1=NULL;
	jlong *lparg3=NULL;
	jlong *lparg6=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1connection_1register_1object_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetLongArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg6) if ((lparg6 = (*env)->GetLongArrayElements(env, arg6, NULL)) == NULL) goto fail;
	rc = (jint)g_dbus_connection_register_object((GDBusConnection *)arg0, (const gchar *)lparg1, (GDBusInterfaceInfo *)arg2, (const GDBusInterfaceVTable *)lparg3, (gpointer)arg4, (GDestroyNotify)arg5, (GError **)lparg6);
fail:
	if (arg6 && lparg6) (*env)->ReleaseLongArrayElements(env, arg6, lparg6, 0);
	if (arg3 && lparg3) (*env)->ReleaseLongArrayElements(env, arg3, lparg3, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1connection_1register_1object_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1generate_1guid
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1generate_1guid)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1generate_1guid_FUNC);
	rc = (jlong)g_dbus_generate_guid();
	OS_NATIVE_EXIT(env, that, g_1dbus_1generate_1guid_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1method_1invocation_1return_1value
JNIEXPORT void JNICALL OS_NATIVE(g_1dbus_1method_1invocation_1return_1value)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, g_1dbus_1method_1invocation_1return_1value_FUNC);
	g_dbus_method_invocation_return_value((GDBusMethodInvocation *)arg0, (GVariant *)arg1);
	OS_NATIVE_EXIT(env, that, g_1dbus_1method_1invocation_1return_1value_FUNC);
}
#endif

#ifndef NO_g_1dbus_1node_1info_1lookup_1interface
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1node_1info_1lookup_1interface)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1node_1info_1lookup_1interface_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_dbus_node_info_lookup_interface((GDBusNodeInfo *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1node_1info_1lookup_1interface_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1node_1info_1new_1for_1xml
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1node_1info_1new_1for_1xml)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlongArray arg1)
{
	jbyte *lparg0=NULL;
	jlong *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1node_1info_1new_1for_1xml_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_dbus_node_info_new_for_xml((const gchar *)lparg0, (GError **)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1node_1info_1new_1for_1xml_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1proxy_1call
JNIEXPORT void JNICALL OS_NATIVE(g_1dbus_1proxy_1call)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jint arg3, jint arg4, jlong arg5, jlong arg6, jlongArray arg7)
{
	jbyte *lparg1=NULL;
	jlong *lparg7=NULL;
	OS_NATIVE_ENTER(env, that, g_1dbus_1proxy_1call_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg7) if ((lparg7 = (*env)->GetLongArrayElements(env, arg7, NULL)) == NULL) goto fail;
	g_dbus_proxy_call((GDBusProxy *)arg0, (const gchar *)lparg1, (GVariant *)arg2, arg3, arg4, (GCancellable *)arg5, (GAsyncReadyCallback)arg6, (GError **)lparg7);
fail:
	if (arg7 && lparg7) (*env)->ReleaseLongArrayElements(env, arg7, lparg7, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1proxy_1call_FUNC);
}
#endif

#ifndef NO_g_1dbus_1proxy_1call_1sync
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1proxy_1call_1sync)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jint arg3, jint arg4, jlong arg5, jlongArray arg6)
{
	jbyte *lparg1=NULL;
	jlong *lparg6=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1proxy_1call_1sync_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg6) if ((lparg6 = (*env)->GetLongArrayElements(env, arg6, NULL)) == NULL) goto fail;
	rc = (jlong)g_dbus_proxy_call_sync((GDBusProxy *)arg0, (const gchar *)lparg1, (GVariant *)arg2, arg3, arg4, (GCancellable *)arg5, (GError **)lparg6);
fail:
	if (arg6 && lparg6) (*env)->ReleaseLongArrayElements(env, arg6, lparg6, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1proxy_1call_1sync_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1proxy_1get_1name_1owner
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1proxy_1get_1name_1owner)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1proxy_1get_1name_1owner_FUNC);
	rc = (jlong)g_dbus_proxy_get_name_owner((GDBusProxy *)arg0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1proxy_1get_1name_1owner_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1proxy_1new_1for_1bus_1sync
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1proxy_1new_1for_1bus_1sync)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jlong arg2, jbyteArray arg3, jbyteArray arg4, jbyteArray arg5, jlong arg6, jlongArray arg7)
{
	jbyte *lparg3=NULL;
	jbyte *lparg4=NULL;
	jbyte *lparg5=NULL;
	jlong *lparg7=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1proxy_1new_1for_1bus_1sync_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetByteArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetByteArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetByteArrayElements(env, arg5, NULL)) == NULL) goto fail;
	if (arg7) if ((lparg7 = (*env)->GetLongArrayElements(env, arg7, NULL)) == NULL) goto fail;
	rc = (jlong)g_dbus_proxy_new_for_bus_sync(arg0, arg1, (GDBusInterfaceInfo *)arg2, (const gchar *)lparg3, (const gchar *)lparg4, (const gchar *)lparg5, (GCancellable *)arg6, (GError **)lparg7);
fail:
	if (arg7 && lparg7) (*env)->ReleaseLongArrayElements(env, arg7, lparg7, 0);
	if (arg5 && lparg5) (*env)->ReleaseByteArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseByteArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseByteArrayElements(env, arg3, lparg3, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1proxy_1new_1for_1bus_1sync_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1server_1get_1client_1address
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1server_1get_1client_1address)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1server_1get_1client_1address_FUNC);
	rc = (jlong)g_dbus_server_get_client_address((GDBusServer *)arg0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1server_1get_1client_1address_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1server_1new_1sync
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dbus_1server_1new_1sync)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2, jlong arg3, jlong arg4, jlongArray arg5)
{
	jlong *lparg5=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dbus_1server_1new_1sync_FUNC);
	if (arg5) if ((lparg5 = (*env)->GetLongArrayElements(env, arg5, NULL)) == NULL) goto fail;
	rc = (jlong)g_dbus_server_new_sync((const gchar *)arg0, (GDBusServerFlags)arg1, (const gchar *)arg2, (GDBusAuthObserver *)arg3, (GCancellable *)arg4, (GError **)lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseLongArrayElements(env, arg5, lparg5, 0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1server_1new_1sync_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1dbus_1server_1start
JNIEXPORT void JNICALL OS_NATIVE(g_1dbus_1server_1start)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1dbus_1server_1start_FUNC);
	g_dbus_server_start((GDBusServer *)arg0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1server_1start_FUNC);
}
#endif

#ifndef NO_g_1dbus_1server_1stop
JNIEXPORT void JNICALL OS_NATIVE(g_1dbus_1server_1stop)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1dbus_1server_1stop_FUNC);
	g_dbus_server_stop((GDBusServer *)arg0);
	OS_NATIVE_EXIT(env, that, g_1dbus_1server_1stop_FUNC);
}
#endif

#ifndef NO_g_1dir_1make_1tmp
JNIEXPORT jlong JNICALL OS_NATIVE(g_1dir_1make_1tmp)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1dir_1make_1tmp_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_dir_make_tmp((const gchar *)arg0, (GError **)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1dir_1make_1tmp_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1error_1free
JNIEXPORT void JNICALL OS_NATIVE(g_1error_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1error_1free_FUNC);
	g_error_free((GError *)arg0);
	OS_NATIVE_EXIT(env, that, g_1error_1free_FUNC);
}
#endif

#ifndef NO_g_1error_1get_1message
JNIEXPORT jlong JNICALL OS_NATIVE(g_1error_1get_1message)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1error_1get_1message_FUNC);
	rc = (jlong)g_error_get_message((GError *)arg0);
	OS_NATIVE_EXIT(env, that, g_1error_1get_1message_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1file_1get_1path
JNIEXPORT jlong JNICALL OS_NATIVE(g_1file_1get_1path)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1file_1get_1path_FUNC);
	rc = (jlong)g_file_get_path((GFile *)arg0);
	OS_NATIVE_EXIT(env, that, g_1file_1get_1path_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1file_1get_1uri
JNIEXPORT jlong JNICALL OS_NATIVE(g_1file_1get_1uri)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1file_1get_1uri_FUNC);
	rc = (jlong)g_file_get_uri((GFile *)arg0);
	OS_NATIVE_EXIT(env, that, g_1file_1get_1uri_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1file_1info_1get_1content_1type
JNIEXPORT jlong JNICALL OS_NATIVE(g_1file_1info_1get_1content_1type)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1file_1info_1get_1content_1type_FUNC);
	rc = (jlong)g_file_info_get_content_type((GFileInfo *)arg0);
	OS_NATIVE_EXIT(env, that, g_1file_1info_1get_1content_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1file_1new_1for_1commandline_1arg
JNIEXPORT jlong JNICALL OS_NATIVE(g_1file_1new_1for_1commandline_1arg)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1file_1new_1for_1commandline_1arg_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_file_new_for_commandline_arg((const char *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1file_1new_1for_1commandline_1arg_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1file_1new_1for_1path
JNIEXPORT jlong JNICALL OS_NATIVE(g_1file_1new_1for_1path)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1file_1new_1for_1path_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_file_new_for_path((const char *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1file_1new_1for_1path_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1file_1new_1for_1uri
JNIEXPORT jlong JNICALL OS_NATIVE(g_1file_1new_1for_1uri)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1file_1new_1for_1uri_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_file_new_for_uri((const char *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1file_1new_1for_1uri_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1file_1query_1info
JNIEXPORT jlong JNICALL OS_NATIVE(g_1file_1query_1info)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jlong arg3, jlong arg4)
{
	jbyte *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1file_1query_1info_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_file_query_info((GFile *)arg0, (const char *)lparg1, (GFileQueryInfoFlags)arg2, (GCancellable *)arg3, (GError **)arg4);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1file_1query_1info_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1file_1test
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1file_1test)
	(JNIEnv *env, jclass that, jbyteArray arg0, jint arg1)
{
	jbyte *lparg0=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1file_1test_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jboolean)g_file_test((const gchar *)lparg0, (GFileTest)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1file_1test_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1filename_1display_1name
JNIEXPORT jlong JNICALL OS_NATIVE(g_1filename_1display_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1filename_1display_1name_FUNC);
	rc = (jlong)g_filename_display_name((const gchar *)arg0);
	OS_NATIVE_EXIT(env, that, g_1filename_1display_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1filename_1from_1uri
JNIEXPORT jlong JNICALL OS_NATIVE(g_1filename_1from_1uri)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1, jlongArray arg2)
{
	jlong *lparg1=NULL;
	jlong *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1filename_1from_1uri_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)g_filename_from_uri((const char *)arg0, (char **)lparg1, (GError **)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1filename_1from_1uri_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1filename_1from_1utf8
JNIEXPORT jlong JNICALL OS_NATIVE(g_1filename_1from_1utf8)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2, jlongArray arg3, jlongArray arg4)
{
	jlong *lparg2=NULL;
	jlong *lparg3=NULL;
	jlong *lparg4=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1filename_1from_1utf8_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetLongArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetLongArrayElements(env, arg4, NULL)) == NULL) goto fail;
	rc = (jlong)g_filename_from_utf8((const gchar *)arg0, (gssize)arg1, (gsize *)lparg2, (gsize *)lparg3, (GError **)lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseLongArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseLongArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, g_1filename_1from_1utf8_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1filename_1to_1uri
JNIEXPORT jlong JNICALL OS_NATIVE(g_1filename_1to_1uri)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2)
{
	jlong *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1filename_1to_1uri_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)g_filename_to_uri((const char *)arg0, (const char *)arg1, (GError **)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, g_1filename_1to_1uri_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1filename_1to_1utf8
JNIEXPORT jlong JNICALL OS_NATIVE(g_1filename_1to_1utf8)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2, jlongArray arg3, jlongArray arg4)
{
	jlong *lparg2=NULL;
	jlong *lparg3=NULL;
	jlong *lparg4=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1filename_1to_1utf8_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetLongArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetLongArrayElements(env, arg4, NULL)) == NULL) goto fail;
	rc = (jlong)g_filename_to_utf8((const gchar *)arg0, (gssize)arg1, (gsize *)lparg2, (gsize *)lparg3, (GError **)lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseLongArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseLongArrayElements(env, arg3, lparg3, 0);
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, g_1filename_1to_1utf8_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1free
JNIEXPORT void JNICALL OS_NATIVE(g_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1free_FUNC);
	g_free((gpointer)arg0);
	OS_NATIVE_EXIT(env, that, g_1free_FUNC);
}
#endif

#ifndef NO_g_1get_1current_1time
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT void JNICALL OS_NATIVE(g_1get_1current_1time)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1get_1current_1time_FUNC);
	g_get_current_time((GTimeVal *)arg0);
	OS_NATIVE_EXIT(env, that, g_1get_1current_1time_FUNC);
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_g_1get_1user_1name
JNIEXPORT jlong JNICALL OS_NATIVE(g_1get_1user_1name)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1get_1user_1name_FUNC);
	rc = (jlong)g_get_user_name();
	OS_NATIVE_EXIT(env, that, g_1get_1user_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1getenv
JNIEXPORT jlong JNICALL OS_NATIVE(g_1getenv)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1getenv_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_getenv((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1getenv_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1icon_1new_1for_1string
JNIEXPORT jlong JNICALL OS_NATIVE(g_1icon_1new_1for_1string)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlongArray arg1)
{
	jbyte *lparg0=NULL;
	jlong *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1icon_1new_1for_1string_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_icon_new_for_string((const gchar *)lparg0, (GError **)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1icon_1new_1for_1string_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1icon_1to_1string
JNIEXPORT jlong JNICALL OS_NATIVE(g_1icon_1to_1string)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1icon_1to_1string_FUNC);
	rc = (jlong)g_icon_to_string((GIcon *)arg0);
	OS_NATIVE_EXIT(env, that, g_1icon_1to_1string_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1idle_1add
JNIEXPORT jint JNICALL OS_NATIVE(g_1idle_1add)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1idle_1add_FUNC);
	rc = (jint)g_idle_add((GSourceFunc)arg0, (gpointer)arg1);
	OS_NATIVE_EXIT(env, that, g_1idle_1add_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1list_1append
JNIEXPORT jlong JNICALL OS_NATIVE(g_1list_1append)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1list_1append_FUNC);
	rc = (jlong)g_list_append((GList *)arg0, (gpointer)arg1);
	OS_NATIVE_EXIT(env, that, g_1list_1append_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1list_1data
JNIEXPORT jlong JNICALL OS_NATIVE(g_1list_1data)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1list_1data_FUNC);
	rc = (jlong)g_list_data((GList *)arg0);
	OS_NATIVE_EXIT(env, that, g_1list_1data_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1list_1free
JNIEXPORT void JNICALL OS_NATIVE(g_1list_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1list_1free_FUNC);
	g_list_free((GList *)arg0);
	OS_NATIVE_EXIT(env, that, g_1list_1free_FUNC);
}
#endif

#ifndef NO_g_1list_1last
JNIEXPORT jlong JNICALL OS_NATIVE(g_1list_1last)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1list_1last_FUNC);
	rc = (jlong)g_list_last((GList *)arg0);
	OS_NATIVE_EXIT(env, that, g_1list_1last_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1list_1length
JNIEXPORT jint JNICALL OS_NATIVE(g_1list_1length)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1list_1length_FUNC);
	rc = (jint)g_list_length((GList *)arg0);
	OS_NATIVE_EXIT(env, that, g_1list_1length_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1list_1model_1get_1item
JNIEXPORT jlong JNICALL OS_NATIVE(g_1list_1model_1get_1item)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1list_1model_1get_1item_FUNC);
	rc = (jlong)g_list_model_get_item((GListModel *)arg0, (guint)arg1);
	OS_NATIVE_EXIT(env, that, g_1list_1model_1get_1item_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1list_1model_1get_1n_1items
JNIEXPORT jint JNICALL OS_NATIVE(g_1list_1model_1get_1n_1items)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1list_1model_1get_1n_1items_FUNC);
	rc = (jint)g_list_model_get_n_items((GListModel *)arg0);
	OS_NATIVE_EXIT(env, that, g_1list_1model_1get_1n_1items_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1list_1next
JNIEXPORT jlong JNICALL OS_NATIVE(g_1list_1next)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1list_1next_FUNC);
	rc = (jlong)g_list_next(arg0);
	OS_NATIVE_EXIT(env, that, g_1list_1next_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1list_1nth_1data
JNIEXPORT jlong JNICALL OS_NATIVE(g_1list_1nth_1data)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1list_1nth_1data_FUNC);
	rc = (jlong)g_list_nth_data((GList *)arg0, (guint)arg1);
	OS_NATIVE_EXIT(env, that, g_1list_1nth_1data_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1list_1previous
JNIEXPORT jlong JNICALL OS_NATIVE(g_1list_1previous)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1list_1previous_FUNC);
	rc = (jlong)g_list_previous(arg0);
	OS_NATIVE_EXIT(env, that, g_1list_1previous_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1log_1default_1handler
JNIEXPORT void JNICALL OS_NATIVE(g_1log_1default_1handler)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2, jlong arg3)
{
	OS_NATIVE_ENTER(env, that, g_1log_1default_1handler_FUNC);
	g_log_default_handler((gchar *)arg0, (GLogLevelFlags)arg1, (gchar *)arg2, (gpointer)arg3);
	OS_NATIVE_EXIT(env, that, g_1log_1default_1handler_FUNC);
}
#endif

#ifndef NO_g_1log_1remove_1handler
JNIEXPORT void JNICALL OS_NATIVE(g_1log_1remove_1handler)
	(JNIEnv *env, jclass that, jbyteArray arg0, jint arg1)
{
	jbyte *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, g_1log_1remove_1handler_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	g_log_remove_handler((gchar *)lparg0, (gint)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1log_1remove_1handler_FUNC);
}
#endif

#ifndef NO_g_1log_1set_1handler
JNIEXPORT jint JNICALL OS_NATIVE(g_1log_1set_1handler)
	(JNIEnv *env, jclass that, jbyteArray arg0, jint arg1, jlong arg2, jlong arg3)
{
	jbyte *lparg0=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1log_1set_1handler_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jint)g_log_set_handler((gchar *)lparg0, (GLogLevelFlags)arg1, (GLogFunc)arg2, (gpointer)arg3);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1log_1set_1handler_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1main_1context_1acquire
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1main_1context_1acquire)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1main_1context_1acquire_FUNC);
	rc = (jboolean)g_main_context_acquire((GMainContext *)arg0);
	OS_NATIVE_EXIT(env, that, g_1main_1context_1acquire_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1main_1context_1check
JNIEXPORT jint JNICALL OS_NATIVE(g_1main_1context_1check)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2, jint arg3)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1main_1context_1check_FUNC);
	rc = (jint)g_main_context_check((GMainContext *)arg0, arg1, (GPollFD *)arg2, arg3);
	OS_NATIVE_EXIT(env, that, g_1main_1context_1check_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1main_1context_1default
JNIEXPORT jlong JNICALL OS_NATIVE(g_1main_1context_1default)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1main_1context_1default_FUNC);
	rc = (jlong)g_main_context_default();
	OS_NATIVE_EXIT(env, that, g_1main_1context_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1main_1context_1get_1poll_1func
JNIEXPORT jlong JNICALL OS_NATIVE(g_1main_1context_1get_1poll_1func)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1main_1context_1get_1poll_1func_FUNC);
	rc = (jlong)g_main_context_get_poll_func((GMainContext *)arg0);
	OS_NATIVE_EXIT(env, that, g_1main_1context_1get_1poll_1func_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1main_1context_1iteration
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1main_1context_1iteration)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1main_1context_1iteration_FUNC);
	rc = (jboolean)g_main_context_iteration((GMainContext *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1main_1context_1iteration_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1main_1context_1prepare
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1main_1context_1prepare)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1main_1context_1prepare_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)g_main_context_prepare((GMainContext *)arg0, (gint *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1main_1context_1prepare_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1main_1context_1query
JNIEXPORT jint JNICALL OS_NATIVE(g_1main_1context_1query)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jintArray arg2, jlong arg3, jint arg4)
{
	jint *lparg2=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1main_1context_1query_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jint)g_main_context_query((GMainContext *)arg0, arg1, (gint *)lparg2, (GPollFD *)arg3, arg4);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, g_1main_1context_1query_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1main_1context_1release
JNIEXPORT void JNICALL OS_NATIVE(g_1main_1context_1release)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1main_1context_1release_FUNC);
	g_main_context_release((GMainContext *)arg0);
	OS_NATIVE_EXIT(env, that, g_1main_1context_1release_FUNC);
}
#endif

#ifndef NO_g_1main_1context_1wakeup
JNIEXPORT void JNICALL OS_NATIVE(g_1main_1context_1wakeup)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1main_1context_1wakeup_FUNC);
	g_main_context_wakeup((GMainContext *)arg0);
	OS_NATIVE_EXIT(env, that, g_1main_1context_1wakeup_FUNC);
}
#endif

#ifndef NO_g_1malloc
JNIEXPORT jlong JNICALL OS_NATIVE(g_1malloc)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1malloc_FUNC);
	rc = (jlong)g_malloc((gulong)arg0);
	OS_NATIVE_EXIT(env, that, g_1malloc_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1menu_1insert_1item
JNIEXPORT void JNICALL OS_NATIVE(g_1menu_1insert_1item)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2)
{
	OS_NATIVE_ENTER(env, that, g_1menu_1insert_1item_FUNC);
	g_menu_insert_item((GMenu *)arg0, arg1, (GMenuItem *)arg2);
	OS_NATIVE_EXIT(env, that, g_1menu_1insert_1item_FUNC);
}
#endif

#ifndef NO_g_1menu_1item_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1menu_1item_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0, jbyteArray arg1)
{
	jbyte *lparg0=NULL;
	jbyte *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1menu_1item_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_menu_item_new((const gchar *)lparg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1menu_1item_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1menu_1item_1new_1section
JNIEXPORT jlong JNICALL OS_NATIVE(g_1menu_1item_1new_1section)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1menu_1item_1new_1section_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_menu_item_new_section((const gchar *)lparg0, (GMenuModel *)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1menu_1item_1new_1section_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1menu_1item_1new_1submenu
JNIEXPORT jlong JNICALL OS_NATIVE(g_1menu_1item_1new_1submenu)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1menu_1item_1new_1submenu_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_menu_item_new_submenu((const gchar *)lparg0, (GMenuModel *)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1menu_1item_1new_1submenu_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1menu_1item_1set_1attribute
JNIEXPORT void JNICALL OS_NATIVE(g_1menu_1item_1set_1attribute)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, g_1menu_1item_1set_1attribute_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	g_menu_item_set_attribute((GMenuItem *)arg0, (const gchar *)lparg1, (const gchar *)lparg2, (const gchar *)arg3);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1menu_1item_1set_1attribute_FUNC);
}
#endif

#ifndef NO_g_1menu_1item_1set_1label
JNIEXPORT void JNICALL OS_NATIVE(g_1menu_1item_1set_1label)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, g_1menu_1item_1set_1label_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	g_menu_item_set_label((GMenuItem *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1menu_1item_1set_1label_FUNC);
}
#endif

#ifndef NO_g_1menu_1item_1set_1submenu
JNIEXPORT void JNICALL OS_NATIVE(g_1menu_1item_1set_1submenu)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, g_1menu_1item_1set_1submenu_FUNC);
	g_menu_item_set_submenu((GMenuItem *)arg0, (GMenuModel *)arg1);
	OS_NATIVE_EXIT(env, that, g_1menu_1item_1set_1submenu_FUNC);
}
#endif

#ifndef NO_g_1menu_1model_1get_1n_1items
JNIEXPORT jint JNICALL OS_NATIVE(g_1menu_1model_1get_1n_1items)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1menu_1model_1get_1n_1items_FUNC);
	rc = (jint)g_menu_model_get_n_items((GMenuModel *)arg0);
	OS_NATIVE_EXIT(env, that, g_1menu_1model_1get_1n_1items_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1menu_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1menu_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1menu_1new_FUNC);
	rc = (jlong)g_menu_new();
	OS_NATIVE_EXIT(env, that, g_1menu_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1menu_1remove
JNIEXPORT void JNICALL OS_NATIVE(g_1menu_1remove)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, g_1menu_1remove_FUNC);
	g_menu_remove((GMenu *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1menu_1remove_FUNC);
}
#endif

#ifndef NO_g_1object_1get__J_3B_3IJ
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1get__J_3B_3IJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jintArray arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	jint *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, g_1object_1get__J_3B_3IJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	g_object_get((GObject *)arg0, (const gchar *)lparg1, lparg2, (const gchar *)NULL);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1object_1get__J_3B_3IJ_FUNC);
}
#endif

#ifndef NO_g_1object_1get__J_3B_3JJ
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1get__J_3B_3JJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlongArray arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	jlong *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, g_1object_1get__J_3B_3JJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
	g_object_get((GObject *)arg0, (const gchar *)lparg1, lparg2, (const gchar *)NULL);
fail:
	if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1object_1get__J_3B_3JJ_FUNC);
}
#endif

#ifndef NO_g_1object_1get_1qdata
JNIEXPORT jlong JNICALL OS_NATIVE(g_1object_1get_1qdata)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1object_1get_1qdata_FUNC);
	rc = (jlong)g_object_get_qdata((GObject *)arg0, (GQuark)arg1);
	OS_NATIVE_EXIT(env, that, g_1object_1get_1qdata_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1object_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1object_1new)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1object_1new_FUNC);
	rc = (jlong)g_object_new((GType)arg0, (const gchar *)arg1);
	OS_NATIVE_EXIT(env, that, g_1object_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1object_1notify
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1notify)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, g_1object_1notify_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	g_object_notify((GObject *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1object_1notify_FUNC);
}
#endif

#ifndef NO_g_1object_1ref
JNIEXPORT jlong JNICALL OS_NATIVE(g_1object_1ref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1object_1ref_FUNC);
	rc = (jlong)g_object_ref((gpointer)arg0);
	OS_NATIVE_EXIT(env, that, g_1object_1ref_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1object_1ref_1sink
JNIEXPORT jlong JNICALL OS_NATIVE(g_1object_1ref_1sink)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1object_1ref_1sink_FUNC);
	rc = (jlong)g_object_ref_sink((GObject *)arg0);
	OS_NATIVE_EXIT(env, that, g_1object_1ref_1sink_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1object_1set__J_3BFJ
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1set__J_3BFJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jfloat arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, g_1object_1set__J_3BFJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	g_object_set((gpointer)arg0, (const gchar *)lparg1, arg2, (const gchar *)NULL);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1object_1set__J_3BFJ_FUNC);
}
#endif

#ifndef NO_g_1object_1set__J_3BIJ
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1set__J_3BIJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, g_1object_1set__J_3BIJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	g_object_set((gpointer)arg0, (const gchar *)lparg1, arg2, (const gchar *)NULL);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1object_1set__J_3BIJ_FUNC);
}
#endif

#ifndef NO_g_1object_1set__J_3BJJ
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1set__J_3BJJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, g_1object_1set__J_3BJJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	g_object_set((gpointer)arg0, (const gchar *)lparg1, arg2, (const gchar *)NULL);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1object_1set__J_3BJJ_FUNC);
}
#endif

#ifndef NO_g_1object_1set__J_3BLorg_eclipse_swt_internal_gtk_GdkRGBA_2J
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1set__J_3BLorg_eclipse_swt_internal_gtk_GdkRGBA_2J)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jobject arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	GdkRGBA _arg2, *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, g_1object_1set__J_3BLorg_eclipse_swt_internal_gtk_GdkRGBA_2J_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = getGdkRGBAFields(env, arg2, &_arg2)) == NULL) goto fail;
	g_object_set((gpointer)arg0, (const gchar *)lparg1, lparg2, (const gchar *)NULL);
fail:
	if (arg2 && lparg2) setGdkRGBAFields(env, arg2, lparg2);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1object_1set__J_3BLorg_eclipse_swt_internal_gtk_GdkRGBA_2J_FUNC);
}
#endif

#ifndef NO_g_1object_1set__J_3BZJ
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1set__J_3BZJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jboolean arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, g_1object_1set__J_3BZJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	g_object_set((gpointer)arg0, (const gchar *)lparg1, arg2, (const gchar *)NULL);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1object_1set__J_3BZJ_FUNC);
}
#endif

#ifndef NO_g_1object_1set__J_3B_3BJ
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1set__J_3B_3BJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, g_1object_1set__J_3B_3BJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	g_object_set((gpointer)arg0, (const gchar *)lparg1, lparg2, (const gchar *)NULL);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1object_1set__J_3B_3BJ_FUNC);
}
#endif

#ifndef NO_g_1object_1set_1qdata
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1set_1qdata)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2)
{
	OS_NATIVE_ENTER(env, that, g_1object_1set_1qdata_FUNC);
	g_object_set_qdata((GObject *)arg0, (GQuark)arg1, (gpointer)arg2);
	OS_NATIVE_EXIT(env, that, g_1object_1set_1qdata_FUNC);
}
#endif

#ifndef NO_g_1object_1unref
JNIEXPORT void JNICALL OS_NATIVE(g_1object_1unref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1object_1unref_FUNC);
	g_object_unref((gpointer)arg0);
	OS_NATIVE_EXIT(env, that, g_1object_1unref_FUNC);
}
#endif

#ifndef NO_g_1quark_1from_1string
JNIEXPORT jint JNICALL OS_NATIVE(g_1quark_1from_1string)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1quark_1from_1string_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jint)g_quark_from_string((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1quark_1from_1string_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1set_1prgname
JNIEXPORT void JNICALL OS_NATIVE(g_1set_1prgname)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, g_1set_1prgname_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	g_set_prgname((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1set_1prgname_FUNC);
}
#endif

#ifndef NO_g_1signal_1add_1emission_1hook
JNIEXPORT jlong JNICALL OS_NATIVE(g_1signal_1add_1emission_1hook)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jlong arg2, jlong arg3, jlong arg4)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1signal_1add_1emission_1hook_FUNC);
	rc = (jlong)g_signal_add_emission_hook((guint)arg0, (GQuark)arg1, (GSignalEmissionHook)arg2, (gpointer)arg3, (GDestroyNotify)arg4);
	OS_NATIVE_EXIT(env, that, g_1signal_1add_1emission_1hook_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1signal_1connect
JNIEXPORT jint JNICALL OS_NATIVE(g_1signal_1connect)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1signal_1connect_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jint)g_signal_connect((gpointer)arg0, (const gchar *)lparg1, (GCallback)arg2, (gpointer)arg3);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1signal_1connect_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1signal_1connect_1closure
JNIEXPORT jint JNICALL OS_NATIVE(g_1signal_1connect_1closure)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jboolean arg3)
{
	jbyte *lparg1=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1signal_1connect_1closure_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jint)g_signal_connect_closure((gpointer)arg0, (const gchar *)lparg1, (GClosure *)arg2, (gboolean)arg3);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1signal_1connect_1closure_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1signal_1connect_1closure_1by_1id
JNIEXPORT jint JNICALL OS_NATIVE(g_1signal_1connect_1closure_1by_1id)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jlong arg3, jboolean arg4)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1signal_1connect_1closure_1by_1id_FUNC);
	rc = (jint)g_signal_connect_closure_by_id((gpointer)arg0, (guint)arg1, (GQuark)arg2, (GClosure *)arg3, (gboolean)arg4);
	OS_NATIVE_EXIT(env, that, g_1signal_1connect_1closure_1by_1id_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1signal_1emit_1by_1name__J_3B
JNIEXPORT void JNICALL OS_NATIVE(g_1signal_1emit_1by_1name__J_3B)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, g_1signal_1emit_1by_1name__J_3B_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	g_signal_emit_by_name((gpointer)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1signal_1emit_1by_1name__J_3B_FUNC);
}
#endif

#ifndef NO_g_1signal_1emit_1by_1name__J_3BJ
JNIEXPORT void JNICALL OS_NATIVE(g_1signal_1emit_1by_1name__J_3BJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, g_1signal_1emit_1by_1name__J_3BJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	g_signal_emit_by_name((gpointer)arg0, (const gchar *)lparg1, arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1signal_1emit_1by_1name__J_3BJ_FUNC);
}
#endif

#ifndef NO_g_1signal_1emit_1by_1name__J_3BJJ
JNIEXPORT void JNICALL OS_NATIVE(g_1signal_1emit_1by_1name__J_3BJJ)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jlong arg3)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, g_1signal_1emit_1by_1name__J_3BJJ_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	g_signal_emit_by_name((gpointer)arg0, (const gchar *)lparg1, arg2, arg3);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1signal_1emit_1by_1name__J_3BJJ_FUNC);
}
#endif

#ifndef NO_g_1signal_1emit_1by_1name__J_3BLorg_eclipse_swt_internal_gtk_GdkRectangle_2
JNIEXPORT void JNICALL OS_NATIVE(g_1signal_1emit_1by_1name__J_3BLorg_eclipse_swt_internal_gtk_GdkRectangle_2)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jobject arg2)
{
	jbyte *lparg1=NULL;
	GdkRectangle _arg2, *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, g_1signal_1emit_1by_1name__J_3BLorg_eclipse_swt_internal_gtk_GdkRectangle_2_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = getGdkRectangleFields(env, arg2, &_arg2)) == NULL) goto fail;
	g_signal_emit_by_name((gpointer)arg0, (const gchar *)lparg1, lparg2);
fail:
	if (arg2 && lparg2) setGdkRectangleFields(env, arg2, lparg2);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1signal_1emit_1by_1name__J_3BLorg_eclipse_swt_internal_gtk_GdkRectangle_2_FUNC);
}
#endif

#ifndef NO_g_1signal_1emit_1by_1name__J_3B_3B
JNIEXPORT void JNICALL OS_NATIVE(g_1signal_1emit_1by_1name__J_3B_3B)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jbyteArray arg2)
{
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, g_1signal_1emit_1by_1name__J_3B_3B_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	g_signal_emit_by_name((gpointer)arg0, (const gchar *)lparg1, lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1signal_1emit_1by_1name__J_3B_3B_FUNC);
}
#endif

#ifndef NO_g_1signal_1handler_1disconnect
JNIEXPORT void JNICALL OS_NATIVE(g_1signal_1handler_1disconnect)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, g_1signal_1handler_1disconnect_FUNC);
	g_signal_handler_disconnect((gpointer)arg0, (gulong)arg1);
	OS_NATIVE_EXIT(env, that, g_1signal_1handler_1disconnect_FUNC);
}
#endif

#ifndef NO_g_1signal_1handlers_1block_1matched
JNIEXPORT jint JNICALL OS_NATIVE(g_1signal_1handlers_1block_1matched)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jlong arg4, jlong arg5, jlong arg6)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1signal_1handlers_1block_1matched_FUNC);
	rc = (jint)g_signal_handlers_block_matched((gpointer)arg0, (GSignalMatchType)arg1, (guint)arg2, (GQuark)arg3, (GClosure *)arg4, (gpointer)arg5, (gpointer)arg6);
	OS_NATIVE_EXIT(env, that, g_1signal_1handlers_1block_1matched_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1signal_1handlers_1unblock_1matched
JNIEXPORT jint JNICALL OS_NATIVE(g_1signal_1handlers_1unblock_1matched)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jlong arg4, jlong arg5, jlong arg6)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1signal_1handlers_1unblock_1matched_FUNC);
	rc = (jint)g_signal_handlers_unblock_matched((gpointer)arg0, (GSignalMatchType)arg1, (guint)arg2, (GQuark)arg3, (GClosure *)arg4, (gpointer)arg5, (gpointer)arg6);
	OS_NATIVE_EXIT(env, that, g_1signal_1handlers_1unblock_1matched_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1signal_1lookup
JNIEXPORT jint JNICALL OS_NATIVE(g_1signal_1lookup)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1)
{
	jbyte *lparg0=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1signal_1lookup_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jint)g_signal_lookup((const gchar *)lparg0, arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1signal_1lookup_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1signal_1remove_1emission_1hook
JNIEXPORT void JNICALL OS_NATIVE(g_1signal_1remove_1emission_1hook)
	(JNIEnv *env, jclass that, jint arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, g_1signal_1remove_1emission_1hook_FUNC);
	g_signal_remove_emission_hook((guint)arg0, (gulong)arg1);
	OS_NATIVE_EXIT(env, that, g_1signal_1remove_1emission_1hook_FUNC);
}
#endif

#ifndef NO_g_1signal_1stop_1emission_1by_1name
JNIEXPORT void JNICALL OS_NATIVE(g_1signal_1stop_1emission_1by_1name)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, g_1signal_1stop_1emission_1by_1name_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	g_signal_stop_emission_by_name((gpointer)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1signal_1stop_1emission_1by_1name_FUNC);
}
#endif

#ifndef NO_g_1simple_1action_1group_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1simple_1action_1group_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1simple_1action_1group_1new_FUNC);
	rc = (jlong)g_simple_action_group_new();
	OS_NATIVE_EXIT(env, that, g_1simple_1action_1group_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1simple_1action_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1simple_1action_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1simple_1action_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_simple_action_new((const gchar *)lparg0, (const GVariantType *)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1simple_1action_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1simple_1action_1new_1stateful
JNIEXPORT jlong JNICALL OS_NATIVE(g_1simple_1action_1new_1stateful)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1, jlong arg2)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1simple_1action_1new_1stateful_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_simple_action_new_stateful((const gchar *)lparg0, (const GVariantType *)arg1, (GVariant *)arg2);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1simple_1action_1new_1stateful_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1simple_1action_1set_1enabled
JNIEXPORT void JNICALL OS_NATIVE(g_1simple_1action_1set_1enabled)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	OS_NATIVE_ENTER(env, that, g_1simple_1action_1set_1enabled_FUNC);
	g_simple_action_set_enabled((GSimpleAction *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1simple_1action_1set_1enabled_FUNC);
}
#endif

#ifndef NO_g_1simple_1action_1set_1state
JNIEXPORT void JNICALL OS_NATIVE(g_1simple_1action_1set_1state)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, g_1simple_1action_1set_1state_FUNC);
	g_simple_action_set_state((GSimpleAction *)arg0, (GVariant *)arg1);
	OS_NATIVE_EXIT(env, that, g_1simple_1action_1set_1state_FUNC);
}
#endif

#ifndef NO_g_1slist_1append
JNIEXPORT jlong JNICALL OS_NATIVE(g_1slist_1append)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1slist_1append_FUNC);
	rc = (jlong)g_slist_append((GSList *)arg0, (gpointer)arg1);
	OS_NATIVE_EXIT(env, that, g_1slist_1append_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1slist_1data
JNIEXPORT jlong JNICALL OS_NATIVE(g_1slist_1data)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1slist_1data_FUNC);
	rc = (jlong)g_slist_data((GSList *)arg0);
	OS_NATIVE_EXIT(env, that, g_1slist_1data_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1slist_1free
JNIEXPORT void JNICALL OS_NATIVE(g_1slist_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1slist_1free_FUNC);
	g_slist_free((GSList *)arg0);
	OS_NATIVE_EXIT(env, that, g_1slist_1free_FUNC);
}
#endif

#ifndef NO_g_1slist_1length
JNIEXPORT jint JNICALL OS_NATIVE(g_1slist_1length)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1slist_1length_FUNC);
	rc = (jint)g_slist_length((GSList *)arg0);
	OS_NATIVE_EXIT(env, that, g_1slist_1length_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1slist_1next
JNIEXPORT jlong JNICALL OS_NATIVE(g_1slist_1next)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1slist_1next_FUNC);
	rc = (jlong)g_slist_next((GSList *)arg0);
	OS_NATIVE_EXIT(env, that, g_1slist_1next_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1source_1remove
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1source_1remove)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1source_1remove_FUNC);
	rc = (jboolean)g_source_remove((guint)arg0);
	OS_NATIVE_EXIT(env, that, g_1source_1remove_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1strconcat__JJJ
JNIEXPORT jlong JNICALL OS_NATIVE(g_1strconcat__JJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1strconcat__JJJ_FUNC);
	rc = (jlong)g_strconcat((const gchar *)arg0, (const gchar *)arg1, (const gchar *)NULL);
	OS_NATIVE_EXIT(env, that, g_1strconcat__JJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1strconcat__JJJJ
JNIEXPORT jlong JNICALL OS_NATIVE(g_1strconcat__JJJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jlong arg3)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1strconcat__JJJJ_FUNC);
	rc = (jlong)g_strconcat((const gchar *)arg0, (const gchar *)arg1, (const gchar *)arg2, (const gchar *)NULL);
	OS_NATIVE_EXIT(env, that, g_1strconcat__JJJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1strdup
JNIEXPORT jlong JNICALL OS_NATIVE(g_1strdup)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1strdup_FUNC);
	rc = (jlong)g_strdup((char *)arg0);
	OS_NATIVE_EXIT(env, that, g_1strdup_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1strfreev
JNIEXPORT void JNICALL OS_NATIVE(g_1strfreev)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1strfreev_FUNC);
	g_strfreev((gchar **)arg0);
	OS_NATIVE_EXIT(env, that, g_1strfreev_FUNC);
}
#endif

#ifndef NO_g_1strtod
JNIEXPORT jdouble JNICALL OS_NATIVE(g_1strtod)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jdouble rc = 0;
	OS_NATIVE_ENTER(env, that, g_1strtod_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jdouble)g_strtod((const gchar *)arg0, (gchar **)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1strtod_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1time_1val_1add
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
JNIEXPORT void JNICALL OS_NATIVE(g_1time_1val_1add)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, g_1time_1val_1add_FUNC);
	g_time_val_add((GTimeVal *)arg0, (glong)arg1);
	OS_NATIVE_EXIT(env, that, g_1time_1val_1add_FUNC);
}
G_GNUC_END_IGNORE_DEPRECATIONS
#endif

#ifndef NO_g_1timeout_1add
JNIEXPORT jint JNICALL OS_NATIVE(g_1timeout_1add)
	(JNIEnv *env, jclass that, jint arg0, jlong arg1, jlong arg2)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1timeout_1add_FUNC);
	rc = (jint)g_timeout_add((guint32)arg0, (GSourceFunc)arg1, (gpointer)arg2);
	OS_NATIVE_EXIT(env, that, g_1timeout_1add_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1type_1class_1peek
JNIEXPORT jlong JNICALL OS_NATIVE(g_1type_1class_1peek)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1type_1class_1peek_FUNC);
	rc = (jlong)g_type_class_peek((GType)arg0);
	OS_NATIVE_EXIT(env, that, g_1type_1class_1peek_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1type_1class_1peek_1parent
JNIEXPORT jlong JNICALL OS_NATIVE(g_1type_1class_1peek_1parent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1type_1class_1peek_1parent_FUNC);
	rc = (jlong)g_type_class_peek_parent((gpointer)arg0);
	OS_NATIVE_EXIT(env, that, g_1type_1class_1peek_1parent_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1type_1class_1ref
JNIEXPORT jlong JNICALL OS_NATIVE(g_1type_1class_1ref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1type_1class_1ref_FUNC);
	rc = (jlong)g_type_class_ref((GType)arg0);
	OS_NATIVE_EXIT(env, that, g_1type_1class_1ref_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1type_1class_1unref
JNIEXPORT void JNICALL OS_NATIVE(g_1type_1class_1unref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1type_1class_1unref_FUNC);
	g_type_class_unref((gpointer)arg0);
	OS_NATIVE_EXIT(env, that, g_1type_1class_1unref_FUNC);
}
#endif

#ifndef NO_g_1type_1interface_1peek_1parent
JNIEXPORT jlong JNICALL OS_NATIVE(g_1type_1interface_1peek_1parent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1type_1interface_1peek_1parent_FUNC);
	rc = (jlong)g_type_interface_peek_parent((gpointer)arg0);
	OS_NATIVE_EXIT(env, that, g_1type_1interface_1peek_1parent_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1type_1is_1a
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1type_1is_1a)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1type_1is_1a_FUNC);
	rc = (jboolean)g_type_is_a((GType)arg0, (GType)arg1);
	OS_NATIVE_EXIT(env, that, g_1type_1is_1a_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1type_1parent
JNIEXPORT jlong JNICALL OS_NATIVE(g_1type_1parent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1type_1parent_FUNC);
	rc = (jlong)g_type_parent((GType)arg0);
	OS_NATIVE_EXIT(env, that, g_1type_1parent_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1type_1register_1static
JNIEXPORT jlong JNICALL OS_NATIVE(g_1type_1register_1static)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jint arg3)
{
	jbyte *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1type_1register_1static_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_type_register_static((GType)arg0, (const gchar *)lparg1, (const GTypeInfo *)arg2, (GTypeFlags)arg3);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1type_1register_1static_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1unsetenv
JNIEXPORT void JNICALL OS_NATIVE(g_1unsetenv)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, g_1unsetenv_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	g_unsetenv((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1unsetenv_FUNC);
}
#endif

#ifndef NO_g_1utf16_1offset_1to_1pointer
JNIEXPORT jlong JNICALL OS_NATIVE(g_1utf16_1offset_1to_1pointer)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1utf16_1offset_1to_1pointer_FUNC);
	rc = (jlong)g_utf16_offset_to_pointer((const gchar *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1utf16_1offset_1to_1pointer_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1utf16_1offset_1to_1utf8_1offset
JNIEXPORT jlong JNICALL OS_NATIVE(g_1utf16_1offset_1to_1utf8_1offset)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1utf16_1offset_1to_1utf8_1offset_FUNC);
	rc = (jlong)g_utf16_offset_to_utf8_offset((const gchar *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1utf16_1offset_1to_1utf8_1offset_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1utf16_1pointer_1to_1offset
JNIEXPORT jlong JNICALL OS_NATIVE(g_1utf16_1pointer_1to_1offset)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1utf16_1pointer_1to_1offset_FUNC);
	rc = (jlong)g_utf16_pointer_to_offset((const gchar *)arg0, (const gchar *)arg1);
	OS_NATIVE_EXIT(env, that, g_1utf16_1pointer_1to_1offset_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1utf16_1strlen
JNIEXPORT jlong JNICALL OS_NATIVE(g_1utf16_1strlen)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1utf16_1strlen_FUNC);
	rc = (jlong)g_utf16_strlen((const gchar *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1utf16_1strlen_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1utf16_1to_1utf8
JNIEXPORT jlong JNICALL OS_NATIVE(g_1utf16_1to_1utf8)
	(JNIEnv *env, jclass that, jcharArray arg0, jlong arg1, jlongArray arg2, jlongArray arg3, jlongArray arg4)
{
	jchar *lparg0=NULL;
	jlong *lparg2=NULL;
	jlong *lparg3=NULL;
	jlong *lparg4=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1utf16_1to_1utf8_FUNC);
		if (arg0) if ((lparg0 = (*env)->GetPrimitiveArrayCritical(env, arg0, NULL)) == NULL) goto fail;
		if (arg2) if ((lparg2 = (*env)->GetPrimitiveArrayCritical(env, arg2, NULL)) == NULL) goto fail;
		if (arg3) if ((lparg3 = (*env)->GetPrimitiveArrayCritical(env, arg3, NULL)) == NULL) goto fail;
		if (arg4) if ((lparg4 = (*env)->GetPrimitiveArrayCritical(env, arg4, NULL)) == NULL) goto fail;
	rc = (jlong)g_utf16_to_utf8((const gunichar2 *)lparg0, (glong)arg1, (glong *)lparg2, (glong *)lparg3, (GError **)lparg4);
fail:
		if (arg4 && lparg4) (*env)->ReleasePrimitiveArrayCritical(env, arg4, lparg4, 0);
		if (arg3 && lparg3) (*env)->ReleasePrimitiveArrayCritical(env, arg3, lparg3, 0);
		if (arg2 && lparg2) (*env)->ReleasePrimitiveArrayCritical(env, arg2, lparg2, 0);
		if (arg0 && lparg0) (*env)->ReleasePrimitiveArrayCritical(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1utf16_1to_1utf8_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1utf8_1offset_1to_1utf16_1offset
JNIEXPORT jlong JNICALL OS_NATIVE(g_1utf8_1offset_1to_1utf16_1offset)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1utf8_1offset_1to_1utf16_1offset_FUNC);
	rc = (jlong)g_utf8_offset_to_utf16_offset((const gchar *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1utf8_1offset_1to_1utf16_1offset_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1utf8_1pointer_1to_1offset
JNIEXPORT jlong JNICALL OS_NATIVE(g_1utf8_1pointer_1to_1offset)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1utf8_1pointer_1to_1offset_FUNC);
	rc = (jlong)g_utf8_pointer_to_offset((const gchar *)arg0, (const gchar *)arg1);
	OS_NATIVE_EXIT(env, that, g_1utf8_1pointer_1to_1offset_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1utf8_1strlen
JNIEXPORT jlong JNICALL OS_NATIVE(g_1utf8_1strlen)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1utf8_1strlen_FUNC);
	rc = (jlong)g_utf8_strlen((const gchar *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1utf8_1strlen_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1utf8_1to_1utf16__JJ_3J_3J_3J
JNIEXPORT jlong JNICALL OS_NATIVE(g_1utf8_1to_1utf16__JJ_3J_3J_3J)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2, jlongArray arg3, jlongArray arg4)
{
	jlong *lparg2=NULL;
	jlong *lparg3=NULL;
	jlong *lparg4=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1utf8_1to_1utf16__JJ_3J_3J_3J_FUNC);
		if (arg2) if ((lparg2 = (*env)->GetPrimitiveArrayCritical(env, arg2, NULL)) == NULL) goto fail;
		if (arg3) if ((lparg3 = (*env)->GetPrimitiveArrayCritical(env, arg3, NULL)) == NULL) goto fail;
		if (arg4) if ((lparg4 = (*env)->GetPrimitiveArrayCritical(env, arg4, NULL)) == NULL) goto fail;
	rc = (jlong)g_utf8_to_utf16((const gchar *)arg0, (glong)arg1, (glong *)lparg2, (glong *)lparg3, (GError **)lparg4);
fail:
		if (arg4 && lparg4) (*env)->ReleasePrimitiveArrayCritical(env, arg4, lparg4, 0);
		if (arg3 && lparg3) (*env)->ReleasePrimitiveArrayCritical(env, arg3, lparg3, 0);
		if (arg2 && lparg2) (*env)->ReleasePrimitiveArrayCritical(env, arg2, lparg2, 0);
	OS_NATIVE_EXIT(env, that, g_1utf8_1to_1utf16__JJ_3J_3J_3J_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1utf8_1to_1utf16___3BJ_3J_3J_3J
JNIEXPORT jlong JNICALL OS_NATIVE(g_1utf8_1to_1utf16___3BJ_3J_3J_3J)
	(JNIEnv *env, jclass that, jbyteArray arg0, jlong arg1, jlongArray arg2, jlongArray arg3, jlongArray arg4)
{
	jbyte *lparg0=NULL;
	jlong *lparg2=NULL;
	jlong *lparg3=NULL;
	jlong *lparg4=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1utf8_1to_1utf16___3BJ_3J_3J_3J_FUNC);
		if (arg0) if ((lparg0 = (*env)->GetPrimitiveArrayCritical(env, arg0, NULL)) == NULL) goto fail;
		if (arg2) if ((lparg2 = (*env)->GetPrimitiveArrayCritical(env, arg2, NULL)) == NULL) goto fail;
		if (arg3) if ((lparg3 = (*env)->GetPrimitiveArrayCritical(env, arg3, NULL)) == NULL) goto fail;
		if (arg4) if ((lparg4 = (*env)->GetPrimitiveArrayCritical(env, arg4, NULL)) == NULL) goto fail;
	rc = (jlong)g_utf8_to_utf16((const gchar *)lparg0, (glong)arg1, (glong *)lparg2, (glong *)lparg3, (GError **)lparg4);
fail:
		if (arg4 && lparg4) (*env)->ReleasePrimitiveArrayCritical(env, arg4, lparg4, 0);
		if (arg3 && lparg3) (*env)->ReleasePrimitiveArrayCritical(env, arg3, lparg3, 0);
		if (arg2 && lparg2) (*env)->ReleasePrimitiveArrayCritical(env, arg2, lparg2, 0);
		if (arg0 && lparg0) (*env)->ReleasePrimitiveArrayCritical(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1utf8_1to_1utf16___3BJ_3J_3J_3J_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1value_1get_1double
JNIEXPORT jdouble JNICALL OS_NATIVE(g_1value_1get_1double)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	OS_NATIVE_ENTER(env, that, g_1value_1get_1double_FUNC);
	rc = (jdouble)g_value_get_double((GValue *)arg0);
	OS_NATIVE_EXIT(env, that, g_1value_1get_1double_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1value_1get_1float
JNIEXPORT jfloat JNICALL OS_NATIVE(g_1value_1get_1float)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jfloat rc = 0;
	OS_NATIVE_ENTER(env, that, g_1value_1get_1float_FUNC);
	rc = (jfloat)g_value_get_float((GValue *)arg0);
	OS_NATIVE_EXIT(env, that, g_1value_1get_1float_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1value_1get_1int
JNIEXPORT jint JNICALL OS_NATIVE(g_1value_1get_1int)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1value_1get_1int_FUNC);
	rc = (jint)g_value_get_int((GValue *)arg0);
	OS_NATIVE_EXIT(env, that, g_1value_1get_1int_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1value_1get_1int64
JNIEXPORT jlong JNICALL OS_NATIVE(g_1value_1get_1int64)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1value_1get_1int64_FUNC);
	rc = (jlong)g_value_get_int64((GValue *)arg0);
	OS_NATIVE_EXIT(env, that, g_1value_1get_1int64_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1value_1init
JNIEXPORT jlong JNICALL OS_NATIVE(g_1value_1init)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1value_1init_FUNC);
	rc = (jlong)g_value_init((GValue *)arg0, (GType)arg1);
	OS_NATIVE_EXIT(env, that, g_1value_1init_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1value_1peek_1pointer
JNIEXPORT jlong JNICALL OS_NATIVE(g_1value_1peek_1pointer)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1value_1peek_1pointer_FUNC);
	rc = (jlong)g_value_peek_pointer((const GValue *)arg0);
	OS_NATIVE_EXIT(env, that, g_1value_1peek_1pointer_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1value_1set_1double
JNIEXPORT void JNICALL OS_NATIVE(g_1value_1set_1double)
	(JNIEnv *env, jclass that, jlong arg0, jdouble arg1)
{
	OS_NATIVE_ENTER(env, that, g_1value_1set_1double_FUNC);
	g_value_set_double((GValue *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1value_1set_1double_FUNC);
}
#endif

#ifndef NO_g_1value_1set_1float
JNIEXPORT void JNICALL OS_NATIVE(g_1value_1set_1float)
	(JNIEnv *env, jclass that, jlong arg0, jfloat arg1)
{
	OS_NATIVE_ENTER(env, that, g_1value_1set_1float_FUNC);
	g_value_set_float((GValue *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1value_1set_1float_FUNC);
}
#endif

#ifndef NO_g_1value_1set_1int
JNIEXPORT void JNICALL OS_NATIVE(g_1value_1set_1int)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, g_1value_1set_1int_FUNC);
	g_value_set_int((GValue *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1value_1set_1int_FUNC);
}
#endif

#ifndef NO_g_1value_1set_1int64
JNIEXPORT void JNICALL OS_NATIVE(g_1value_1set_1int64)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, g_1value_1set_1int64_FUNC);
	g_value_set_int64((GValue *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, g_1value_1set_1int64_FUNC);
}
#endif

#ifndef NO_g_1value_1unset
JNIEXPORT void JNICALL OS_NATIVE(g_1value_1unset)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1value_1unset_FUNC);
	g_value_unset((GValue *)arg0);
	OS_NATIVE_EXIT(env, that, g_1value_1unset_FUNC);
}
#endif

#ifndef NO_g_1variant_1builder_1add_1value
JNIEXPORT void JNICALL OS_NATIVE(g_1variant_1builder_1add_1value)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, g_1variant_1builder_1add_1value_FUNC);
	g_variant_builder_add_value((GVariantBuilder *)arg0, (GVariant *)arg1);
	OS_NATIVE_EXIT(env, that, g_1variant_1builder_1add_1value_FUNC);
}
#endif

#ifndef NO_g_1variant_1builder_1end
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1builder_1end)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1builder_1end_FUNC);
	rc = (jlong)g_variant_builder_end((GVariantBuilder *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1builder_1end_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1builder_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1builder_1new)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1builder_1new_FUNC);
	rc = (jlong)g_variant_builder_new((const GVariantType *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1builder_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1builder_1unref
JNIEXPORT void JNICALL OS_NATIVE(g_1variant_1builder_1unref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1variant_1builder_1unref_FUNC);
	g_variant_builder_unref((GVariantBuilder *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1builder_1unref_FUNC);
}
#endif

#ifndef NO_g_1variant_1get_1boolean
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1variant_1get_1boolean)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1get_1boolean_FUNC);
	rc = (jboolean)g_variant_get_boolean((GVariant *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1get_1boolean_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1get_1byte
JNIEXPORT jbyte JNICALL OS_NATIVE(g_1variant_1get_1byte)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jbyte rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1get_1byte_FUNC);
	rc = (jbyte)g_variant_get_byte((GVariant *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1get_1byte_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1get_1child_1value
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1get_1child_1value)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1get_1child_1value_FUNC);
	rc = (jlong)g_variant_get_child_value((GVariant *)arg0, (gsize)arg1);
	OS_NATIVE_EXIT(env, that, g_1variant_1get_1child_1value_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1get_1double
JNIEXPORT jdouble JNICALL OS_NATIVE(g_1variant_1get_1double)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jdouble rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1get_1double_FUNC);
	rc = (jdouble)g_variant_get_double((GVariant *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1get_1double_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1get_1int32
JNIEXPORT jint JNICALL OS_NATIVE(g_1variant_1get_1int32)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1get_1int32_FUNC);
	rc = (jint)g_variant_get_int32((GVariant *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1get_1int32_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1get_1string
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1get_1string)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1get_1string_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_variant_get_string((GVariant *)arg0, (gsize *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1variant_1get_1string_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1get_1type_1string
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1get_1type_1string)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1get_1type_1string_FUNC);
	rc = (jlong)g_variant_get_type_string((GVariant *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1get_1type_1string_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1get_1uint64
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1get_1uint64)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1get_1uint64_FUNC);
	rc = (jlong)g_variant_get_uint64((GVariant *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1get_1uint64_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1is_1of_1type
JNIEXPORT jboolean JNICALL OS_NATIVE(g_1variant_1is_1of_1type)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1is_1of_1type_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)g_variant_is_of_type((GVariant *)arg0, (const GVariantType *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, g_1variant_1is_1of_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1n_1children
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1n_1children)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1n_1children_FUNC);
	rc = (jlong)g_variant_n_children((GVariant *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1n_1children_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new___3BZ_3B
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new___3BZ_3B)
	(JNIEnv *env, jclass that, jbyteArray arg0, jboolean arg1, jbyteArray arg2)
{
	jbyte *lparg0=NULL;
	jbyte *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new___3BZ_3B_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)g_variant_new((const gchar *)lparg0, (gboolean)arg1, (const gchar *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, JNI_ABORT);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1variant_1new___3BZ_3B_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new___3B_3B
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new___3B_3B)
	(JNIEnv *env, jclass that, jbyteArray arg0, jbyteArray arg1)
{
	jbyte *lparg0=NULL;
	jbyte *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new___3B_3B_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)g_variant_new((const gchar *)lparg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1variant_1new___3B_3B_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new___3B_3B_3B
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new___3B_3B_3B)
	(JNIEnv *env, jclass that, jbyteArray arg0, jbyteArray arg1, jbyteArray arg2)
{
	jbyte *lparg0=NULL;
	jbyte *lparg1=NULL;
	jbyte *lparg2=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new___3B_3B_3B_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jlong)g_variant_new((const gchar *)lparg0, (const gchar *)lparg1, (const gchar *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, JNI_ABORT);
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, g_1variant_1new___3B_3B_3B_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new_1boolean
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new_1boolean)
	(JNIEnv *env, jclass that, jboolean arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new_1boolean_FUNC);
	rc = (jlong)g_variant_new_boolean((gboolean)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1new_1boolean_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new_1byte
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new_1byte)
	(JNIEnv *env, jclass that, jbyte arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new_1byte_FUNC);
	rc = (jlong)g_variant_new_byte((guchar)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1new_1byte_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new_1double
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new_1double)
	(JNIEnv *env, jclass that, jdouble arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new_1double_FUNC);
	rc = (jlong)g_variant_new_double((gboolean)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1new_1double_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new_1int32
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new_1int32)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new_1int32_FUNC);
	rc = (jlong)g_variant_new_int32((gint32)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1new_1int32_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new_1string__J
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new_1string__J)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new_1string__J_FUNC);
	rc = (jlong)g_variant_new_string((const gchar *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1new_1string__J_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new_1string___3B
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new_1string___3B)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new_1string___3B_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_variant_new_string((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1variant_1new_1string___3B_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new_1tuple
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new_1tuple)
	(JNIEnv *env, jclass that, jlongArray arg0, jlong arg1)
{
	jlong *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new_1tuple_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetLongArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_variant_new_tuple((GVariant * const *)lparg0, (gsize)arg1);
fail:
	if (arg0 && lparg0) (*env)->ReleaseLongArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1variant_1new_1tuple_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1new_1uint64
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1new_1uint64)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1new_1uint64_FUNC);
	rc = (jlong)g_variant_new_uint64(arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1new_1uint64_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1type_1free
JNIEXPORT void JNICALL OS_NATIVE(g_1variant_1type_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1variant_1type_1free_FUNC);
	g_variant_type_free((GVariantType *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1type_1free_FUNC);
}
#endif

#ifndef NO_g_1variant_1type_1new
JNIEXPORT jlong JNICALL OS_NATIVE(g_1variant_1type_1new)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, g_1variant_1type_1new_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)g_variant_type_new((const gchar *)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, g_1variant_1type_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_g_1variant_1unref
JNIEXPORT void JNICALL OS_NATIVE(g_1variant_1unref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, g_1variant_1unref_FUNC);
	g_variant_unref((GVariant *)arg0);
	OS_NATIVE_EXIT(env, that, g_1variant_1unref_FUNC);
}
#endif

#ifndef NO_glib_1major_1version
JNIEXPORT jint JNICALL OS_NATIVE(glib_1major_1version)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, glib_1major_1version_FUNC);
	rc = (jint)glib_major_version;
	OS_NATIVE_EXIT(env, that, glib_1major_1version_FUNC);
	return rc;
}
#endif

#ifndef NO_glib_1micro_1version
JNIEXPORT jint JNICALL OS_NATIVE(glib_1micro_1version)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, glib_1micro_1version_FUNC);
	rc = (jint)glib_micro_version;
	OS_NATIVE_EXIT(env, that, glib_1micro_1version_FUNC);
	return rc;
}
#endif

#ifndef NO_glib_1minor_1version
JNIEXPORT jint JNICALL OS_NATIVE(glib_1minor_1version)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, glib_1minor_1version_FUNC);
	rc = (jint)glib_minor_version;
	OS_NATIVE_EXIT(env, that, glib_1minor_1version_FUNC);
	return rc;
}
#endif

#ifndef NO_localeconv_1decimal_1point
JNIEXPORT jlong JNICALL OS_NATIVE(localeconv_1decimal_1point)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, localeconv_1decimal_1point_FUNC);
	rc = (jlong)localeconv_decimal_point();
	OS_NATIVE_EXIT(env, that, localeconv_1decimal_1point_FUNC);
	return rc;
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_gtk_GTypeInfo_2I
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_GTypeInfo_2I)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jint arg2)
{
	GTypeInfo _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GTypeInfo_2I_FUNC);
	if (arg1) if ((lparg1 = getGTypeInfoFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GTypeInfo_2I_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventButton_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_GdkEventButton_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	GdkEventButton _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GdkEventButton_2J_FUNC);
	if (arg1) if ((lparg1 = getGdkEventButtonFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GdkEventButton_2J_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventKey_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_GdkEventKey_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	GdkEventKey _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GdkEventKey_2J_FUNC);
	if (arg1) if ((lparg1 = getGdkEventKeyFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GdkEventKey_2J_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	GdkRGBA _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2J_FUNC);
	if (arg1) if ((lparg1 = getGdkRGBAFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2J_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_gtk_GtkCellRendererClass_2
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_GtkCellRendererClass_2)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GtkCellRendererClass_2_FUNC);
	if (arg1) getGtkCellRendererClassFields(env, arg1, (GtkCellRendererClass *)arg0);
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GtkCellRendererClass_2_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_gtk_GtkTargetEntry_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_GtkTargetEntry_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	GtkTargetEntry _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GtkTargetEntry_2J_FUNC);
	if (arg1) if ((lparg1 = getGtkTargetEntryFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GtkTargetEntry_2J_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_gtk_GtkWidgetClass_2
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_GtkWidgetClass_2)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GtkWidgetClass_2_FUNC);
	if (arg1) getGtkWidgetClassFields(env, arg1, (GtkWidgetClass *)arg0);
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GtkWidgetClass_2_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_gtk_PangoAttribute_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_PangoAttribute_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	PangoAttribute _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_PangoAttribute_2J_FUNC);
	if (arg1) if ((lparg1 = getPangoAttributeFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_PangoAttribute_2J_FUNC);
}
#endif

#ifndef NO_memmove__JLorg_eclipse_swt_internal_gtk_XExposeEvent_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_XExposeEvent_2J)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jlong arg2)
{
	XExposeEvent _arg1, *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_XExposeEvent_2J_FUNC);
	if (arg1) if ((lparg1 = getXExposeEventFields(env, arg1, &_arg1)) == NULL) goto fail;
	memmove((void *)arg0, (const void *)lparg1, (size_t)arg2);
fail:
	OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_XExposeEvent_2J_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	GdkEventButton _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setGdkEventButtonFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventCrossing_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEventCrossing_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	GdkEventCrossing _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventCrossing_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setGdkEventCrossingFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventCrossing_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventFocus_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEventFocus_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	GdkEventFocus _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventFocus_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setGdkEventFocusFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventFocus_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventKey_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEventKey_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	GdkEventKey _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventKey_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setGdkEventKeyFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventKey_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventMotion_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEventMotion_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	GdkEventMotion _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventMotion_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setGdkEventMotionFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventMotion_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventWindowState_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEventWindowState_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	GdkEventWindowState _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventWindowState_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setGdkEventWindowStateFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventWindowState_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	GdkKeymapKey _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setGdkKeymapKeyFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkRGBA_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkRGBA_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	GdkRGBA _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkRGBA_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setGdkRGBAFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkRGBA_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkRectangle_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkRectangle_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	GdkRectangle _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkRectangle_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setGdkRectangleFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkRectangle_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GtkBorder_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GtkBorder_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	GtkBorder _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GtkBorder_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setGtkBorderFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GtkBorder_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GtkCellRendererClass_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GtkCellRendererClass_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GtkCellRendererClass_2J_FUNC);
	if (arg0) setGtkCellRendererClassFields(env, arg0, (GtkCellRendererClass *)arg1);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GtkCellRendererClass_2J_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_GtkWidgetClass_2J
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GtkWidgetClass_2J)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GtkWidgetClass_2J_FUNC);
	if (arg0) setGtkWidgetClassFields(env, arg0, (GtkWidgetClass *)arg1);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GtkWidgetClass_2J_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_PangoAttrColor_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_PangoAttrColor_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	PangoAttrColor _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoAttrColor_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setPangoAttrColorFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoAttrColor_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_PangoAttrInt_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_PangoAttrInt_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	PangoAttrInt _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoAttrInt_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setPangoAttrIntFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoAttrInt_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_PangoAttribute_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_PangoAttribute_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	PangoAttribute _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoAttribute_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setPangoAttributeFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoAttribute_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_PangoItem_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_PangoItem_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	PangoItem _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoItem_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setPangoItemFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoItem_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_PangoLayoutLine_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_PangoLayoutLine_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	PangoLayoutLine _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoLayoutLine_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setPangoLayoutLineFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoLayoutLine_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_PangoLayoutRun_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_PangoLayoutRun_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	PangoLayoutRun _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoLayoutRun_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setPangoLayoutRunFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoLayoutRun_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_PangoLogAttr_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_PangoLogAttr_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	PangoLogAttr _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoLogAttr_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setPangoLogAttrFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_PangoLogAttr_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_XExposeEvent_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_XExposeEvent_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	XExposeEvent _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_XExposeEvent_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setXExposeEventFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_XExposeEvent_2JJ_FUNC);
}
#endif

#ifndef NO_memmove__Lorg_eclipse_swt_internal_gtk_XFocusChangeEvent_2JJ
JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_XFocusChangeEvent_2JJ)
	(JNIEnv *env, jclass that, jobject arg0, jlong arg1, jlong arg2)
{
	XFocusChangeEvent _arg0, *lparg0=NULL;
	OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_XFocusChangeEvent_2JJ_FUNC);
	if (arg0) if ((lparg0 = &_arg0) == NULL) goto fail;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
fail:
	if (arg0 && lparg0) setXFocusChangeEventFields(env, arg0, lparg0);
	OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_XFocusChangeEvent_2JJ_FUNC);
}
#endif

#ifndef NO_pango_1attr_1background_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1background_1new)
	(JNIEnv *env, jclass that, jshort arg0, jshort arg1, jshort arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1background_1new_FUNC);
	rc = (jlong)pango_attr_background_new(arg0, arg1, arg2);
	OS_NATIVE_EXIT(env, that, pango_1attr_1background_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1font_1desc_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1font_1desc_1new)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1font_1desc_1new_FUNC);
	rc = (jlong)pango_attr_font_desc_new((const PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1attr_1font_1desc_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1foreground_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1foreground_1new)
	(JNIEnv *env, jclass that, jshort arg0, jshort arg1, jshort arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1foreground_1new_FUNC);
	rc = (jlong)pango_attr_foreground_new(arg0, arg1, arg2);
	OS_NATIVE_EXIT(env, that, pango_1attr_1foreground_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1iterator_1destroy
JNIEXPORT void JNICALL OS_NATIVE(pango_1attr_1iterator_1destroy)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, pango_1attr_1iterator_1destroy_FUNC);
	pango_attr_iterator_destroy((PangoAttrIterator *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1attr_1iterator_1destroy_FUNC);
}
#endif

#ifndef NO_pango_1attr_1iterator_1get
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1iterator_1get)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1iterator_1get_FUNC);
	rc = (jlong)pango_attr_iterator_get((PangoAttrIterator *)arg0, (PangoAttrType)arg1);
	OS_NATIVE_EXIT(env, that, pango_1attr_1iterator_1get_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1iterator_1next
JNIEXPORT jboolean JNICALL OS_NATIVE(pango_1attr_1iterator_1next)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1iterator_1next_FUNC);
	rc = (jboolean)pango_attr_iterator_next((PangoAttrIterator *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1attr_1iterator_1next_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1iterator_1range
JNIEXPORT void JNICALL OS_NATIVE(pango_1attr_1iterator_1range)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, pango_1attr_1iterator_1range_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	pango_attr_iterator_range((PangoAttrIterator *)arg0, (gint *)lparg1, (gint *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, pango_1attr_1iterator_1range_FUNC);
}
#endif

#ifndef NO_pango_1attr_1list_1get_1iterator
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1list_1get_1iterator)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1list_1get_1iterator_FUNC);
	rc = (jlong)pango_attr_list_get_iterator((PangoAttrList *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1attr_1list_1get_1iterator_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1list_1insert
JNIEXPORT void JNICALL OS_NATIVE(pango_1attr_1list_1insert)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1attr_1list_1insert_FUNC);
	pango_attr_list_insert((PangoAttrList *)arg0, (PangoAttribute *)arg1);
	OS_NATIVE_EXIT(env, that, pango_1attr_1list_1insert_FUNC);
}
#endif

#ifndef NO_pango_1attr_1list_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1list_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1list_1new_FUNC);
	rc = (jlong)pango_attr_list_new();
	OS_NATIVE_EXIT(env, that, pango_1attr_1list_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1list_1unref
JNIEXPORT void JNICALL OS_NATIVE(pango_1attr_1list_1unref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, pango_1attr_1list_1unref_FUNC);
	pango_attr_list_unref((PangoAttrList *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1attr_1list_1unref_FUNC);
}
#endif

#ifndef NO_pango_1attr_1rise_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1rise_1new)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1rise_1new_FUNC);
	rc = (jlong)pango_attr_rise_new(arg0);
	OS_NATIVE_EXIT(env, that, pango_1attr_1rise_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1shape_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1shape_1new)
	(JNIEnv *env, jclass that, jobject arg0, jobject arg1)
{
	PangoRectangle _arg0, *lparg0=NULL;
	PangoRectangle _arg1, *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1shape_1new_FUNC);
	if (arg0) if ((lparg0 = getPangoRectangleFields(env, arg0, &_arg0)) == NULL) goto fail;
	if (arg1) if ((lparg1 = getPangoRectangleFields(env, arg1, &_arg1)) == NULL) goto fail;
	rc = (jlong)pango_attr_shape_new(lparg0, lparg1);
fail:
	OS_NATIVE_EXIT(env, that, pango_1attr_1shape_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1strikethrough_1color_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1strikethrough_1color_1new)
	(JNIEnv *env, jclass that, jshort arg0, jshort arg1, jshort arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1strikethrough_1color_1new_FUNC);
	rc = (jlong)pango_attr_strikethrough_color_new(arg0, arg1, arg2);
	OS_NATIVE_EXIT(env, that, pango_1attr_1strikethrough_1color_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1strikethrough_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1strikethrough_1new)
	(JNIEnv *env, jclass that, jboolean arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1strikethrough_1new_FUNC);
	rc = (jlong)pango_attr_strikethrough_new(arg0);
	OS_NATIVE_EXIT(env, that, pango_1attr_1strikethrough_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1underline_1color_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1underline_1color_1new)
	(JNIEnv *env, jclass that, jshort arg0, jshort arg1, jshort arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1underline_1color_1new_FUNC);
	rc = (jlong)pango_attr_underline_color_new(arg0, arg1, arg2);
	OS_NATIVE_EXIT(env, that, pango_1attr_1underline_1color_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1underline_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1underline_1new)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1underline_1new_FUNC);
	rc = (jlong)pango_attr_underline_new(arg0);
	OS_NATIVE_EXIT(env, that, pango_1attr_1underline_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attr_1weight_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attr_1weight_1new)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attr_1weight_1new_FUNC);
	rc = (jlong)pango_attr_weight_new(arg0);
	OS_NATIVE_EXIT(env, that, pango_1attr_1weight_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1attribute_1copy
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1attribute_1copy)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1attribute_1copy_FUNC);
	rc = (jlong)pango_attribute_copy((const PangoAttribute *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1attribute_1copy_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1cairo_1context_1get_1font_1options
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1cairo_1context_1get_1font_1options)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1cairo_1context_1get_1font_1options_FUNC);
	rc = (jlong)pango_cairo_context_get_font_options((PangoContext *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1cairo_1context_1get_1font_1options_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1cairo_1context_1set_1font_1options
JNIEXPORT void JNICALL OS_NATIVE(pango_1cairo_1context_1set_1font_1options)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1cairo_1context_1set_1font_1options_FUNC);
	pango_cairo_context_set_font_options((PangoContext *)arg0, ( cairo_font_options_t *)arg1);
	OS_NATIVE_EXIT(env, that, pango_1cairo_1context_1set_1font_1options_FUNC);
}
#endif

#ifndef NO_pango_1cairo_1create_1layout
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1cairo_1create_1layout)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1cairo_1create_1layout_FUNC);
	rc = (jlong)pango_cairo_create_layout((cairo_t *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1cairo_1create_1layout_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1cairo_1font_1map_1get_1default
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1cairo_1font_1map_1get_1default)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1cairo_1font_1map_1get_1default_FUNC);
	rc = (jlong)pango_cairo_font_map_get_default();
	OS_NATIVE_EXIT(env, that, pango_1cairo_1font_1map_1get_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1cairo_1layout_1path
JNIEXPORT void JNICALL OS_NATIVE(pango_1cairo_1layout_1path)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1cairo_1layout_1path_FUNC);
	pango_cairo_layout_path((cairo_t *)arg0, (PangoLayout *)arg1);
	OS_NATIVE_EXIT(env, that, pango_1cairo_1layout_1path_FUNC);
}
#endif

#ifndef NO_pango_1cairo_1show_1layout
JNIEXPORT void JNICALL OS_NATIVE(pango_1cairo_1show_1layout)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1cairo_1show_1layout_FUNC);
	pango_cairo_show_layout((cairo_t *)arg0, (PangoLayout *)arg1);
	OS_NATIVE_EXIT(env, that, pango_1cairo_1show_1layout_FUNC);
}
#endif

#ifndef NO_pango_1context_1get_1base_1dir
JNIEXPORT jint JNICALL OS_NATIVE(pango_1context_1get_1base_1dir)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1context_1get_1base_1dir_FUNC);
	rc = (jint)pango_context_get_base_dir((PangoContext *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1context_1get_1base_1dir_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1context_1get_1language
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1context_1get_1language)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1context_1get_1language_FUNC);
	rc = (jlong)pango_context_get_language((PangoContext *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1context_1get_1language_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1context_1get_1metrics
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1context_1get_1metrics)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1context_1get_1metrics_FUNC);
	rc = (jlong)pango_context_get_metrics((PangoContext *)arg0, (const PangoFontDescription *)arg1, (PangoLanguage *)arg2);
	OS_NATIVE_EXIT(env, that, pango_1context_1get_1metrics_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1context_1list_1families
JNIEXPORT void JNICALL OS_NATIVE(pango_1context_1list_1families)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1, jintArray arg2)
{
	jlong *lparg1=NULL;
	jint *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, pango_1context_1list_1families_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	pango_context_list_families((PangoContext *)arg0, (PangoFontFamily ***)lparg1, (int *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, pango_1context_1list_1families_FUNC);
}
#endif

#ifndef NO_pango_1context_1set_1base_1dir
JNIEXPORT void JNICALL OS_NATIVE(pango_1context_1set_1base_1dir)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1context_1set_1base_1dir_FUNC);
	pango_context_set_base_dir((PangoContext *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, pango_1context_1set_1base_1dir_FUNC);
}
#endif

#ifndef NO_pango_1context_1set_1language
JNIEXPORT void JNICALL OS_NATIVE(pango_1context_1set_1language)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1context_1set_1language_FUNC);
	pango_context_set_language((PangoContext *)arg0, (PangoLanguage *)arg1);
	OS_NATIVE_EXIT(env, that, pango_1context_1set_1language_FUNC);
}
#endif

#ifndef NO_pango_1font_1description_1copy
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1font_1description_1copy)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1copy_FUNC);
	rc = (jlong)pango_font_description_copy((PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1copy_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1description_1free
JNIEXPORT void JNICALL OS_NATIVE(pango_1font_1description_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1free_FUNC);
	pango_font_description_free((PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1free_FUNC);
}
#endif

#ifndef NO_pango_1font_1description_1from_1string
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1font_1description_1from_1string)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1from_1string_FUNC);
		if (arg0) if ((lparg0 = (*env)->GetPrimitiveArrayCritical(env, arg0, NULL)) == NULL) goto fail;
	rc = (jlong)pango_font_description_from_string((const char *)lparg0);
fail:
		if (arg0 && lparg0) (*env)->ReleasePrimitiveArrayCritical(env, arg0, lparg0, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1from_1string_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1description_1get_1family
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1font_1description_1get_1family)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1get_1family_FUNC);
	rc = (jlong)pango_font_description_get_family((PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1get_1family_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1description_1get_1set_1fields
JNIEXPORT jint JNICALL OS_NATIVE(pango_1font_1description_1get_1set_1fields)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1get_1set_1fields_FUNC);
	rc = (jint)pango_font_description_get_set_fields((PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1get_1set_1fields_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1description_1get_1size
JNIEXPORT jint JNICALL OS_NATIVE(pango_1font_1description_1get_1size)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1get_1size_FUNC);
	rc = (jint)pango_font_description_get_size((PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1get_1size_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1description_1get_1stretch
JNIEXPORT jint JNICALL OS_NATIVE(pango_1font_1description_1get_1stretch)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1get_1stretch_FUNC);
	rc = (jint)pango_font_description_get_stretch((PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1get_1stretch_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1description_1get_1style
JNIEXPORT jint JNICALL OS_NATIVE(pango_1font_1description_1get_1style)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1get_1style_FUNC);
	rc = (jint)pango_font_description_get_style((PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1get_1style_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1description_1get_1variant
JNIEXPORT jint JNICALL OS_NATIVE(pango_1font_1description_1get_1variant)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1get_1variant_FUNC);
	rc = (jint)pango_font_description_get_variant((PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1get_1variant_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1description_1get_1weight
JNIEXPORT jint JNICALL OS_NATIVE(pango_1font_1description_1get_1weight)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1get_1weight_FUNC);
	rc = (jint)pango_font_description_get_weight((PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1get_1weight_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1description_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1font_1description_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1new_FUNC);
	rc = (jlong)pango_font_description_new();
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1description_1set_1family
JNIEXPORT void JNICALL OS_NATIVE(pango_1font_1description_1set_1family)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1set_1family_FUNC);
		if (arg1) if ((lparg1 = (*env)->GetPrimitiveArrayCritical(env, arg1, NULL)) == NULL) goto fail;
	pango_font_description_set_family((PangoFontDescription *)arg0, (const char *)lparg1);
fail:
		if (arg1 && lparg1) (*env)->ReleasePrimitiveArrayCritical(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1set_1family_FUNC);
}
#endif

#ifndef NO_pango_1font_1description_1set_1size
JNIEXPORT void JNICALL OS_NATIVE(pango_1font_1description_1set_1size)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1set_1size_FUNC);
	pango_font_description_set_size((PangoFontDescription *)arg0, (gint)arg1);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1set_1size_FUNC);
}
#endif

#ifndef NO_pango_1font_1description_1set_1stretch
JNIEXPORT void JNICALL OS_NATIVE(pango_1font_1description_1set_1stretch)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1set_1stretch_FUNC);
	pango_font_description_set_stretch((PangoFontDescription *)arg0, (PangoStretch)arg1);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1set_1stretch_FUNC);
}
#endif

#ifndef NO_pango_1font_1description_1set_1style
JNIEXPORT void JNICALL OS_NATIVE(pango_1font_1description_1set_1style)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1set_1style_FUNC);
	pango_font_description_set_style((PangoFontDescription *)arg0, (PangoStyle)arg1);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1set_1style_FUNC);
}
#endif

#ifndef NO_pango_1font_1description_1set_1variant
JNIEXPORT void JNICALL OS_NATIVE(pango_1font_1description_1set_1variant)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1set_1variant_FUNC);
	pango_font_description_set_variant((PangoFontDescription *)arg0, (PangoVariant)arg1);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1set_1variant_FUNC);
}
#endif

#ifndef NO_pango_1font_1description_1set_1weight
JNIEXPORT void JNICALL OS_NATIVE(pango_1font_1description_1set_1weight)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1set_1weight_FUNC);
	pango_font_description_set_weight((PangoFontDescription *)arg0, (PangoWeight)arg1);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1set_1weight_FUNC);
}
#endif

#ifndef NO_pango_1font_1description_1to_1string
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1font_1description_1to_1string)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1description_1to_1string_FUNC);
	rc = (jlong)pango_font_description_to_string((PangoFontDescription *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1description_1to_1string_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1face_1describe
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1font_1face_1describe)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1face_1describe_FUNC);
	rc = (jlong)pango_font_face_describe((PangoFontFace *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1face_1describe_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1family_1get_1name
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1font_1family_1get_1name)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1family_1get_1name_FUNC);
	rc = (jlong)pango_font_family_get_name((PangoFontFamily *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1family_1get_1name_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1family_1list_1faces
JNIEXPORT void JNICALL OS_NATIVE(pango_1font_1family_1list_1faces)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1, jintArray arg2)
{
	jlong *lparg1=NULL;
	jint *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, pango_1font_1family_1list_1faces_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	pango_font_family_list_faces((PangoFontFamily *)arg0, (PangoFontFace ***)lparg1, (int *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, pango_1font_1family_1list_1faces_FUNC);
}
#endif

#ifndef NO_pango_1font_1map_1create_1context
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1font_1map_1create_1context)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1map_1create_1context_FUNC);
	rc = (jlong)pango_font_map_create_context((PangoFontMap *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1map_1create_1context_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1metrics_1get_1approximate_1char_1width
JNIEXPORT jint JNICALL OS_NATIVE(pango_1font_1metrics_1get_1approximate_1char_1width)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1metrics_1get_1approximate_1char_1width_FUNC);
	rc = (jint)pango_font_metrics_get_approximate_char_width((PangoFontMetrics *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1metrics_1get_1approximate_1char_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1metrics_1get_1ascent
JNIEXPORT jint JNICALL OS_NATIVE(pango_1font_1metrics_1get_1ascent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1metrics_1get_1ascent_FUNC);
	rc = (jint)pango_font_metrics_get_ascent((PangoFontMetrics *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1metrics_1get_1ascent_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1metrics_1get_1descent
JNIEXPORT jint JNICALL OS_NATIVE(pango_1font_1metrics_1get_1descent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1font_1metrics_1get_1descent_FUNC);
	rc = (jint)pango_font_metrics_get_descent((PangoFontMetrics *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1metrics_1get_1descent_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1font_1metrics_1unref
JNIEXPORT void JNICALL OS_NATIVE(pango_1font_1metrics_1unref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, pango_1font_1metrics_1unref_FUNC);
	pango_font_metrics_unref((PangoFontMetrics *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1font_1metrics_1unref_FUNC);
}
#endif

#ifndef NO_pango_1layout_1context_1changed
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1context_1changed)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1context_1changed_FUNC);
	pango_layout_context_changed((PangoLayout *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1context_1changed_FUNC);
}
#endif

#ifndef NO_pango_1layout_1get_1alignment
JNIEXPORT jint JNICALL OS_NATIVE(pango_1layout_1get_1alignment)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1alignment_FUNC);
	rc = (jint)pango_layout_get_alignment((PangoLayout*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1alignment_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1get_1context
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1layout_1get_1context)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1context_FUNC);
	rc = (jlong)pango_layout_get_context((PangoLayout *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1context_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1get_1indent
JNIEXPORT jint JNICALL OS_NATIVE(pango_1layout_1get_1indent)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1indent_FUNC);
	rc = (jint)pango_layout_get_indent((PangoLayout*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1indent_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1get_1iter
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1layout_1get_1iter)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1iter_FUNC);
	rc = (jlong)pango_layout_get_iter((PangoLayout*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1iter_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1get_1justify
JNIEXPORT jboolean JNICALL OS_NATIVE(pango_1layout_1get_1justify)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1justify_FUNC);
	rc = (jboolean)pango_layout_get_justify((PangoLayout*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1justify_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1get_1line
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1layout_1get_1line)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1line_FUNC);
	rc = (jlong)pango_layout_get_line((PangoLayout *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1line_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1get_1line_1count
JNIEXPORT jint JNICALL OS_NATIVE(pango_1layout_1get_1line_1count)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1line_1count_FUNC);
	rc = (jint)pango_layout_get_line_count((PangoLayout*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1line_1count_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1get_1log_1attrs
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1get_1log_1attrs)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1, jintArray arg2)
{
	jlong *lparg1=NULL;
	jint *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1log_1attrs_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	pango_layout_get_log_attrs((PangoLayout*)arg0, (PangoLogAttr **)lparg1, (int *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1log_1attrs_FUNC);
}
#endif

#ifndef NO_pango_1layout_1get_1pixel_1size
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1get_1pixel_1size)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1pixel_1size_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	pango_layout_get_pixel_size((PangoLayout *)arg0, (int *)lparg1, (int *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1pixel_1size_FUNC);
}
#endif

#ifndef NO_pango_1layout_1get_1size
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1get_1size)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1size_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	pango_layout_get_size((PangoLayout *)arg0, (int *)lparg1, (int *)lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1size_FUNC);
}
#endif

#ifndef NO_pango_1layout_1get_1spacing
JNIEXPORT jint JNICALL OS_NATIVE(pango_1layout_1get_1spacing)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1spacing_FUNC);
	rc = (jint)pango_layout_get_spacing((PangoLayout*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1spacing_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1get_1text
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1layout_1get_1text)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1text_FUNC);
	rc = (jlong)pango_layout_get_text((PangoLayout *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1text_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1get_1width
JNIEXPORT jint JNICALL OS_NATIVE(pango_1layout_1get_1width)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1get_1width_FUNC);
	rc = (jint)pango_layout_get_width((PangoLayout *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1get_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1index_1to_1pos
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1index_1to_1pos)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jobject arg2)
{
	PangoRectangle _arg2, *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, pango_1layout_1index_1to_1pos_FUNC);
	if (arg2) if ((lparg2 = &_arg2) == NULL) goto fail;
	pango_layout_index_to_pos((PangoLayout*)arg0, arg1, lparg2);
fail:
	if (arg2 && lparg2) setPangoRectangleFields(env, arg2, lparg2);
	OS_NATIVE_EXIT(env, that, pango_1layout_1index_1to_1pos_FUNC);
}
#endif

#ifndef NO_pango_1layout_1iter_1free
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1iter_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1iter_1free_FUNC);
	pango_layout_iter_free((PangoLayoutIter*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1iter_1free_FUNC);
}
#endif

#ifndef NO_pango_1layout_1iter_1get_1index
JNIEXPORT jint JNICALL OS_NATIVE(pango_1layout_1iter_1get_1index)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1iter_1get_1index_FUNC);
	rc = (jint)pango_layout_iter_get_index((PangoLayoutIter*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1iter_1get_1index_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1iter_1get_1line_1extents
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1iter_1get_1line_1extents)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jobject arg2)
{
	PangoRectangle _arg1, *lparg1=NULL;
	PangoRectangle _arg2, *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, pango_1layout_1iter_1get_1line_1extents_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
	if (arg2) if ((lparg2 = &_arg2) == NULL) goto fail;
	pango_layout_iter_get_line_extents((PangoLayoutIter*)arg0, lparg1, lparg2);
fail:
	if (arg2 && lparg2) setPangoRectangleFields(env, arg2, lparg2);
	if (arg1 && lparg1) setPangoRectangleFields(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1iter_1get_1line_1extents_FUNC);
}
#endif

#ifndef NO_pango_1layout_1iter_1get_1run
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1layout_1iter_1get_1run)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1iter_1get_1run_FUNC);
	rc = (jlong)pango_layout_iter_get_run((PangoLayoutIter*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1iter_1get_1run_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1iter_1next_1line
JNIEXPORT jboolean JNICALL OS_NATIVE(pango_1layout_1iter_1next_1line)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1iter_1next_1line_FUNC);
	rc = (jboolean)pango_layout_iter_next_line((PangoLayoutIter*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1iter_1next_1line_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1iter_1next_1run
JNIEXPORT jboolean JNICALL OS_NATIVE(pango_1layout_1iter_1next_1run)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1iter_1next_1run_FUNC);
	rc = (jboolean)pango_layout_iter_next_run((PangoLayoutIter*)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1iter_1next_1run_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1line_1get_1extents
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1line_1get_1extents)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1, jobject arg2)
{
	PangoRectangle _arg1, *lparg1=NULL;
	PangoRectangle _arg2, *lparg2=NULL;
	OS_NATIVE_ENTER(env, that, pango_1layout_1line_1get_1extents_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
	if (arg2) if ((lparg2 = &_arg2) == NULL) goto fail;
	pango_layout_line_get_extents((PangoLayoutLine*)arg0, (PangoRectangle *)lparg1, (PangoRectangle *)lparg2);
fail:
	if (arg2 && lparg2) setPangoRectangleFields(env, arg2, lparg2);
	if (arg1 && lparg1) setPangoRectangleFields(env, arg1, lparg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1line_1get_1extents_FUNC);
}
#endif

#ifndef NO_pango_1layout_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1layout_1new)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1new_FUNC);
	rc = (jlong)pango_layout_new((PangoContext *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1layout_1set_1alignment
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1alignment)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1alignment_FUNC);
	pango_layout_set_alignment((PangoLayout *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1alignment_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1attributes
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1attributes)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1attributes_FUNC);
	pango_layout_set_attributes((PangoLayout *)arg0, (PangoAttrList *)arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1attributes_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1auto_1dir
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1auto_1dir)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1auto_1dir_FUNC);
	pango_layout_set_auto_dir((PangoLayout *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1auto_1dir_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1font_1description
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1font_1description)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1font_1description_FUNC);
	pango_layout_set_font_description((PangoLayout *)arg0, (PangoFontDescription *)arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1font_1description_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1indent
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1indent)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1indent_FUNC);
	pango_layout_set_indent((PangoLayout*)arg0, arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1indent_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1justify
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1justify)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1justify_FUNC);
	pango_layout_set_justify((PangoLayout*)arg0, arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1justify_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1single_1paragraph_1mode
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1single_1paragraph_1mode)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1single_1paragraph_1mode_FUNC);
	pango_layout_set_single_paragraph_mode((PangoLayout *)arg0, (gboolean)arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1single_1paragraph_1mode_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1spacing
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1spacing)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1spacing_FUNC);
	pango_layout_set_spacing((PangoLayout *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1spacing_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1tabs
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1tabs)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1tabs_FUNC);
	pango_layout_set_tabs((PangoLayout *)arg0, (PangoTabArray *)arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1tabs_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1text
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1text)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2)
{
	jbyte *lparg1=NULL;
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1text_FUNC);
		if (arg1) if ((lparg1 = (*env)->GetPrimitiveArrayCritical(env, arg1, NULL)) == NULL) goto fail;
	pango_layout_set_text((PangoLayout *)arg0, (const char *)lparg1, (int)arg2);
fail:
		if (arg1 && lparg1) (*env)->ReleasePrimitiveArrayCritical(env, arg1, lparg1, JNI_ABORT);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1text_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1width
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1width)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1width_FUNC);
	pango_layout_set_width((PangoLayout *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1width_FUNC);
}
#endif

#ifndef NO_pango_1layout_1set_1wrap
JNIEXPORT void JNICALL OS_NATIVE(pango_1layout_1set_1wrap)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	OS_NATIVE_ENTER(env, that, pango_1layout_1set_1wrap_FUNC);
	pango_layout_set_wrap((PangoLayout *)arg0, arg1);
	OS_NATIVE_EXIT(env, that, pango_1layout_1set_1wrap_FUNC);
}
#endif

#ifndef NO_pango_1layout_1xy_1to_1index
JNIEXPORT jboolean JNICALL OS_NATIVE(pango_1layout_1xy_1to_1index)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jintArray arg3, jintArray arg4)
{
	jint *lparg3=NULL;
	jint *lparg4=NULL;
	jboolean rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1layout_1xy_1to_1index_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL)) == NULL) goto fail;
	rc = (jboolean)pango_layout_xy_to_index((PangoLayout *)arg0, arg1, arg2, (int *)lparg3, (int *)lparg4);
fail:
	if (arg4 && lparg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	OS_NATIVE_EXIT(env, that, pango_1layout_1xy_1to_1index_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1tab_1array_1free
JNIEXPORT void JNICALL OS_NATIVE(pango_1tab_1array_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	OS_NATIVE_ENTER(env, that, pango_1tab_1array_1free_FUNC);
	pango_tab_array_free((PangoTabArray *)arg0);
	OS_NATIVE_EXIT(env, that, pango_1tab_1array_1free_FUNC);
}
#endif

#ifndef NO_pango_1tab_1array_1new
JNIEXPORT jlong JNICALL OS_NATIVE(pango_1tab_1array_1new)
	(JNIEnv *env, jclass that, jint arg0, jboolean arg1)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, pango_1tab_1array_1new_FUNC);
	rc = (jlong)pango_tab_array_new((gint)arg0, (gboolean)arg1);
	OS_NATIVE_EXIT(env, that, pango_1tab_1array_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_pango_1tab_1array_1set_1tab
JNIEXPORT void JNICALL OS_NATIVE(pango_1tab_1array_1set_1tab)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2, jint arg3)
{
	OS_NATIVE_ENTER(env, that, pango_1tab_1array_1set_1tab_FUNC);
	pango_tab_array_set_tab((PangoTabArray *)arg0, (gint)arg1, (PangoTabAlign)arg2, (gint)arg3);
	OS_NATIVE_EXIT(env, that, pango_1tab_1array_1set_1tab_FUNC);
}
#endif

#ifndef NO_realpath
JNIEXPORT jlong JNICALL OS_NATIVE(realpath)
	(JNIEnv *env, jclass that, jbyteArray arg0, jbyteArray arg1)
{
	jbyte *lparg0=NULL;
	jbyte *lparg1=NULL;
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, realpath_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)realpath((const char *)lparg0, (char *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	OS_NATIVE_EXIT(env, that, realpath_FUNC);
	return rc;
}
#endif

#ifndef NO_strcmp
JNIEXPORT jint JNICALL OS_NATIVE(strcmp)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	jint rc = 0;
	OS_NATIVE_ENTER(env, that, strcmp_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jint)strcmp((const char*)arg0, (const char*)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	OS_NATIVE_EXIT(env, that, strcmp_FUNC);
	return rc;
}
#endif

#ifndef NO_swt_1debug_1on_1fatal_1warnings
JNIEXPORT void JNICALL OS_NATIVE(swt_1debug_1on_1fatal_1warnings)
	(JNIEnv *env, jclass that)
{
	OS_NATIVE_ENTER(env, that, swt_1debug_1on_1fatal_1warnings_FUNC);
	swt_debug_on_fatal_warnings();
	OS_NATIVE_EXIT(env, that, swt_1debug_1on_1fatal_1warnings_FUNC);
}
#endif

#ifndef NO_swt_1fixed_1accessible_1get_1type
JNIEXPORT jlong JNICALL OS_NATIVE(swt_1fixed_1accessible_1get_1type)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, swt_1fixed_1accessible_1get_1type_FUNC);
	rc = (jlong)swt_fixed_accessible_get_type();
	OS_NATIVE_EXIT(env, that, swt_1fixed_1accessible_1get_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_swt_1fixed_1accessible_1register_1accessible
JNIEXPORT void JNICALL OS_NATIVE(swt_1fixed_1accessible_1register_1accessible)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1, jlong arg2)
{
	OS_NATIVE_ENTER(env, that, swt_1fixed_1accessible_1register_1accessible_FUNC);
	swt_fixed_accessible_register_accessible((AtkObject*)arg0, (gboolean)arg1, (GtkWidget *)arg2);
	OS_NATIVE_EXIT(env, that, swt_1fixed_1accessible_1register_1accessible_FUNC);
}
#endif

#ifndef NO_swt_1fixed_1add
JNIEXPORT void JNICALL OS_NATIVE(swt_1fixed_1add)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, swt_1fixed_1add_FUNC);
	swt_fixed_add((SwtFixed*)arg0, (GtkWidget*)arg1);
	OS_NATIVE_EXIT(env, that, swt_1fixed_1add_FUNC);
}
#endif

#ifndef NO_swt_1fixed_1get_1type
JNIEXPORT jlong JNICALL OS_NATIVE(swt_1fixed_1get_1type)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, swt_1fixed_1get_1type_FUNC);
	rc = (jlong)swt_fixed_get_type();
	OS_NATIVE_EXIT(env, that, swt_1fixed_1get_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_swt_1fixed_1move
JNIEXPORT void JNICALL OS_NATIVE(swt_1fixed_1move)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3)
{
	OS_NATIVE_ENTER(env, that, swt_1fixed_1move_FUNC);
	swt_fixed_move((SwtFixed*)arg0, (GtkWidget*)arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, swt_1fixed_1move_FUNC);
}
#endif

#ifndef NO_swt_1fixed_1remove
JNIEXPORT void JNICALL OS_NATIVE(swt_1fixed_1remove)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	OS_NATIVE_ENTER(env, that, swt_1fixed_1remove_FUNC);
	swt_fixed_remove((SwtFixed*)arg0, (GtkWidget*)arg1);
	OS_NATIVE_EXIT(env, that, swt_1fixed_1remove_FUNC);
}
#endif

#ifndef NO_swt_1fixed_1resize
JNIEXPORT void JNICALL OS_NATIVE(swt_1fixed_1resize)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3)
{
	OS_NATIVE_ENTER(env, that, swt_1fixed_1resize_FUNC);
	swt_fixed_resize((SwtFixed*)arg0, (GtkWidget*)arg1, arg2, arg3);
	OS_NATIVE_EXIT(env, that, swt_1fixed_1resize_FUNC);
}
#endif

#ifndef NO_swt_1fixed_1restack
JNIEXPORT void JNICALL OS_NATIVE(swt_1fixed_1restack)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jboolean arg3)
{
	OS_NATIVE_ENTER(env, that, swt_1fixed_1restack_FUNC);
	swt_fixed_restack((SwtFixed*)arg0, (GtkWidget*)arg1, (GtkWidget*)arg2, arg3);
	OS_NATIVE_EXIT(env, that, swt_1fixed_1restack_FUNC);
}
#endif

#ifndef NO_swt_1set_1lock_1functions
JNIEXPORT void JNICALL OS_NATIVE(swt_1set_1lock_1functions)
	(JNIEnv *env, jclass that)
{
	OS_NATIVE_ENTER(env, that, swt_1set_1lock_1functions_FUNC);
	swt_set_lock_functions();
	OS_NATIVE_EXIT(env, that, swt_1set_1lock_1functions_FUNC);
}
#endif

#ifndef NO_ubuntu_1menu_1proxy_1get
JNIEXPORT jlong JNICALL OS_NATIVE(ubuntu_1menu_1proxy_1get)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	OS_NATIVE_ENTER(env, that, ubuntu_1menu_1proxy_1get_FUNC);
/*
	rc = (jlong)ubuntu_menu_proxy_get();
*/
	{
		OS_LOAD_FUNCTION(fp, ubuntu_menu_proxy_get)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)())fp)();
		}
	}
	OS_NATIVE_EXIT(env, that, ubuntu_1menu_1proxy_1get_FUNC);
	return rc;
}
#endif

