/*******************************************************************************
 * Copyright (c) 2000, 2020 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_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);
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_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_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_LOAD_FUNCTION(fp, gdk_device_get_seat)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GdkDevice *))fp)((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, 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_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);
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__JII
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1device_1warp__JII)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GDK_NATIVE_ENTER(env, that, gdk_1device_1warp__JII_FUNC);
	gdk_device_warp((GdkDevice *)arg0, (gint)arg1, (gint)arg2);
	GDK_NATIVE_EXIT(env, that, gdk_1device_1warp__JII_FUNC);
}
#endif

#ifndef NO_gdk_1device_1warp__JJII
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1device_1warp__JJII)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3)
{
	GDK_NATIVE_ENTER(env, that, gdk_1device_1warp__JJII_FUNC);
	gdk_device_warp((GdkDevice *)arg0, (GdkScreen *)arg1, (gint)arg2, (gint)arg3);
	GDK_NATIVE_EXIT(env, that, gdk_1device_1warp__JJII_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_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_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(arg0, arg1);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_monitor)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong, jint))fp)(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(arg0, arg1, arg2);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_monitor_at_point)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong, jint, jint))fp)(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_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(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_n_monitors)
		if (fp) {
			rc = (jint)((jint (CALLING_CONVENTION*)(jlong))fp)(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_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(arg0);
*/
	{
		GDK_LOAD_FUNCTION(fp, gdk_display_get_primary_monitor)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(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_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_1peek_1event
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1display_1peek_1event)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1display_1peek_1event_FUNC);
	rc = (jlong)gdk_display_peek_event((GdkDisplay *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1display_1peek_1event_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, (const 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_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_1crossing_1mode
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1crossing_1mode)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1crossing_1mode_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_crossing_mode((GdkEvent *)arg0, (GdkCrossingMode *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1crossing_1mode_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_1focus_1in
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1focus_1in)
	(JNIEnv *env, jclass that, jlong arg0, jbooleanArray arg1)
{
	jboolean *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1focus_1in_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetBooleanArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_focus_in((GdkEvent *)arg0, (gboolean *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseBooleanArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1focus_1in_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1event_1get_1key_1group
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1key_1group)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1)
{
	jint *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1key_1group_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_key_group((GdkEvent *)arg0, (guint *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1key_1group_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_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_1string
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1string)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1string_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jboolean)gdk_event_get_string((GdkEvent *)arg0, (const char **)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1string_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_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_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_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_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
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;
}
#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
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;
}
#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_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_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_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_1origin
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1surface_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_1surface_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_surface_get_origin((GdkSurface *)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_1surface_1get_1origin_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, jint arg1, jint arg2)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1new_1toplevel_FUNC);
	rc = (jlong)gdk_surface_new_toplevel((GdkDisplay *)arg0, arg1, arg2);
	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_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_1threads_1leave
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);
}
#endif

#ifndef NO_gdk_1toplevel_1focus
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1toplevel_1focus)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1toplevel_1focus_FUNC);
	gdk_toplevel_focus((GdkToplevel *)arg0, arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1toplevel_1focus_FUNC);
}
#endif

#ifndef NO_gdk_1toplevel_1get_1state
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1toplevel_1get_1state)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1toplevel_1get_1state_FUNC);
	rc = (jint)gdk_toplevel_get_state((GdkToplevel *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1toplevel_1get_1state_FUNC);
	return rc;
}
#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_1lower
JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1toplevel_1lower)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1toplevel_1lower_FUNC);
	rc = (jboolean)gdk_toplevel_lower((GdkToplevel *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1toplevel_1lower_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);
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
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);
}
#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_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_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_1MENU_1ITEM
JNIEXPORT jboolean JNICALL GTK_NATIVE(GTK_1IS_1MENU_1ITEM)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1IS_1MENU_1ITEM_FUNC);
	rc = (jboolean)GTK_IS_MENU_ITEM(arg0);
	GTK_NATIVE_EXIT(env, that, GTK_1IS_1MENU_1ITEM_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_1MENU
JNIEXPORT jlong JNICALL GTK_NATIVE(GTK_1TYPE_1MENU)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, GTK_1TYPE_1MENU_FUNC);
	rc = (jlong)GTK_TYPE_MENU;
	GTK_NATIVE_EXIT(env, that, GTK_1TYPE_1MENU_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_NATIVE_EXIT(env, that, gtk_1accel_1group_1new_FUNC);
	return rc;
}
#endif

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

#ifndef NO_gtk_1accel_1label_1set_1accel
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1accel_1label_1set_1accel)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1accel_1label_1set_1accel_FUNC);
/*
	gtk_accel_label_set_accel((GtkAccelLabel *)arg0, (guint)arg1, (GdkModifierType)arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_accel_label_set_accel)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkAccelLabel *, guint, GdkModifierType))fp)((GtkAccelLabel *)arg0, (guint)arg1, (GdkModifierType)arg2);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1accel_1label_1set_1accel_FUNC);
}
#endif

#ifndef NO_gtk_1accel_1label_1set_1accel_1widget
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1accel_1label_1set_1accel_1widget)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1accel_1label_1set_1accel_1widget_FUNC);
	gtk_accel_label_set_accel_widget((GtkAccelLabel *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1accel_1label_1set_1accel_1widget_FUNC);
}
#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_1parse
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1accelerator_1parse)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1accelerator_1parse_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_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_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_1bin_1get_1child
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1bin_1get_1child)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1bin_1get_1child_FUNC);
	rc = (jlong)gtk_bin_get_child((GtkBin *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1bin_1get_1child_FUNC);
	return rc;
}
#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_1pack_1end__JJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1box_1pack_1end__JJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1box_1pack_1end__JJ_FUNC);
/*
	gtk_box_pack_end((GtkBox *)arg0, (GtkWidget *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_box_pack_end)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkBox *, GtkWidget *))fp)((GtkBox *)arg0, (GtkWidget *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1box_1pack_1end__JJ_FUNC);
}
#endif

#ifndef NO_gtk_1box_1pack_1end__JJZZI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1box_1pack_1end__JJZZI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2, jboolean arg3, jint arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1box_1pack_1end__JJZZI_FUNC);
/*
	gtk_box_pack_end((GtkBox *)arg0, (GtkWidget *)arg1, (gboolean)arg2, (gboolean)arg3, (guint)arg4);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_box_pack_end)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkBox *, GtkWidget *, gboolean, gboolean, guint))fp)((GtkBox *)arg0, (GtkWidget *)arg1, (gboolean)arg2, (gboolean)arg3, (guint)arg4);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1box_1pack_1end__JJZZI_FUNC);
}
#endif

#ifndef NO_gtk_1box_1reorder_1child
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1box_1reorder_1child)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1box_1reorder_1child_FUNC);
	gtk_box_reorder_child((GtkBox *)arg0, (GtkWidget *)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1box_1reorder_1child_FUNC);
}
#endif

#ifndef NO_gtk_1box_1set_1child_1packing__JJI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1box_1set_1child_1packing__JJI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1box_1set_1child_1packing__JJI_FUNC);
/*
	gtk_box_set_child_packing((GtkBox *)arg0, (GtkWidget *)arg1, arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_box_set_child_packing)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkBox *, GtkWidget *, jint))fp)((GtkBox *)arg0, (GtkWidget *)arg1, arg2);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1box_1set_1child_1packing__JJI_FUNC);
}
#endif

#ifndef NO_gtk_1box_1set_1child_1packing__JJZZII
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1box_1set_1child_1packing__JJZZII)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2, jboolean arg3, jint arg4, jint arg5)
{
	GTK_NATIVE_ENTER(env, that, gtk_1box_1set_1child_1packing__JJZZII_FUNC);
/*
	gtk_box_set_child_packing((GtkBox *)arg0, (GtkWidget *)arg1, arg2, arg3, arg4, arg5);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_box_set_child_packing)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkBox *, GtkWidget *, jboolean, jboolean, jint, jint))fp)((GtkBox *)arg0, (GtkWidget *)arg1, arg2, arg3, arg4, arg5);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1box_1set_1child_1packing__JJZZII_FUNC);
}
#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_1image
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1button_1set_1image)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1button_1set_1image_FUNC);
/*
	gtk_button_set_image((GtkButton *)arg0, (GtkWidget *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_button_set_image)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkButton *, GtkWidget *))fp)((GtkButton *)arg0, (GtkWidget *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1button_1set_1image_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_1get_1date__J
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1calendar_1get_1date__J)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1get_1date__J_FUNC);
/*
	rc = (jlong)gtk_calendar_get_date((GtkCalendar *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_calendar_get_date)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkCalendar *))fp)((GtkCalendar *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1get_1date__J_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1calendar_1get_1date__J_3I_3I_3I
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1get_1date__J_3I_3I_3I)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2, jintArray arg3)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jint *lparg3=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1get_1date__J_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;
/*
	gtk_calendar_get_date((GtkCalendar *)arg0, (guint *)lparg1, (guint *)lparg2, (guint *)lparg3);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_calendar_get_date)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkCalendar *, guint *, guint *, guint *))fp)((GtkCalendar *)arg0, (guint *)lparg1, (guint *)lparg2, (guint *)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);
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1get_1date__J_3I_3I_3I_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_1calendar_1select_1day__JI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1select_1day__JI)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1select_1day__JI_FUNC);
/*
	gtk_calendar_select_day((GtkCalendar *)arg0, (guint)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_calendar_select_day)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkCalendar *, guint))fp)((GtkCalendar *)arg0, (guint)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1select_1day__JI_FUNC);
}
#endif

#ifndef NO_gtk_1calendar_1select_1day__JJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1select_1day__JJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1select_1day__JJ_FUNC);
/*
	gtk_calendar_select_day((GtkCalendar *)arg0, (GDateTime *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_calendar_select_day)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkCalendar *, GDateTime *))fp)((GtkCalendar *)arg0, (GDateTime *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1select_1day__JJ_FUNC);
}
#endif

#ifndef NO_gtk_1calendar_1select_1month
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1select_1month)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1select_1month_FUNC);
/*
	gtk_calendar_select_month((GtkCalendar *)arg0, (guint)arg1, (guint)arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_calendar_select_month)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkCalendar *, guint, guint))fp)((GtkCalendar *)arg0, (guint)arg1, (guint)arg2);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1select_1month_FUNC);
}
#endif

#ifndef NO_gtk_1calendar_1set_1display_1options
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1set_1display_1options)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1set_1display_1options_FUNC);
/*
	gtk_calendar_set_display_options((GtkCalendar *)arg0, (GtkCalendarDisplayOptions)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_calendar_set_display_options)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkCalendar *, GtkCalendarDisplayOptions))fp)((GtkCalendar *)arg0, (GtkCalendarDisplayOptions)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1set_1display_1options_FUNC);
}
#endif

#ifndef NO_gtk_1calendar_1set_1show_1day_1names
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1set_1show_1day_1names)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1set_1show_1day_1names_FUNC);
/*
	gtk_calendar_set_show_day_names((GtkCalendar *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_calendar_set_show_day_names)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkCalendar *, gboolean))fp)((GtkCalendar *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1set_1show_1day_1names_FUNC);
}
#endif

#ifndef NO_gtk_1calendar_1set_1show_1heading
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1set_1show_1heading)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1set_1show_1heading_FUNC);
/*
	gtk_calendar_set_show_heading((GtkCalendar *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_calendar_set_show_heading)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkCalendar *, gboolean))fp)((GtkCalendar *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1set_1show_1heading_FUNC);
}
#endif

#ifndef NO_gtk_1calendar_1set_1show_1week_1numbers
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1set_1show_1week_1numbers)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1set_1show_1week_1numbers_FUNC);
/*
	gtk_calendar_set_show_week_numbers((GtkCalendar *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_calendar_set_show_week_numbers)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkCalendar *, gboolean))fp)((GtkCalendar *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1set_1show_1week_1numbers_FUNC);
}
#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_1menu_1item_1get_1active
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1check_1menu_1item_1get_1active)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1check_1menu_1item_1get_1active_FUNC);
	rc = (jboolean)gtk_check_menu_item_get_active((GtkCheckMenuItem *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1check_1menu_1item_1get_1active_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1check_1menu_1item_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1check_1menu_1item_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1check_1menu_1item_1new_FUNC);
	rc = (jlong)gtk_check_menu_item_new();
	GTK_NATIVE_EXIT(env, that, gtk_1check_1menu_1item_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1check_1menu_1item_1set_1active
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1check_1menu_1item_1set_1active)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1check_1menu_1item_1set_1active_FUNC);
	gtk_check_menu_item_set_active((GtkCheckMenuItem *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1check_1menu_1item_1set_1active_FUNC);
}
#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_1clipboard_1clear
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1clipboard_1clear)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1clipboard_1clear_FUNC);
	gtk_clipboard_clear((GtkClipboard *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1clipboard_1clear_FUNC);
}
#endif

#ifndef NO_gtk_1clipboard_1get
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1clipboard_1get)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1clipboard_1get_FUNC);
	rc = (jlong)gtk_clipboard_get((GdkAtom)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1clipboard_1get_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1clipboard_1set_1can_1store
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1clipboard_1set_1can_1store)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1clipboard_1set_1can_1store_FUNC);
	gtk_clipboard_set_can_store((GtkClipboard *)arg0, (const GtkTargetEntry *)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1clipboard_1set_1can_1store_FUNC);
}
#endif

#ifndef NO_gtk_1clipboard_1set_1with_1owner
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1clipboard_1set_1with_1owner)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jlong arg3, jlong arg4, jlong arg5)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1clipboard_1set_1with_1owner_FUNC);
	rc = (jboolean)gtk_clipboard_set_with_owner((GtkClipboard *)arg0, (const GtkTargetEntry *)arg1, (guint)arg2, (GtkClipboardGetFunc)arg3, (GtkClipboardClearFunc)arg4, (GObject *)arg5);
	GTK_NATIVE_EXIT(env, that, gtk_1clipboard_1set_1with_1owner_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1clipboard_1store
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1clipboard_1store)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1clipboard_1store_FUNC);
	gtk_clipboard_store((GtkClipboard *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1clipboard_1store_FUNC);
}
#endif

#ifndef NO_gtk_1clipboard_1wait_1for_1contents
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1clipboard_1wait_1for_1contents)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1clipboard_1wait_1for_1contents_FUNC);
	rc = (jlong)gtk_clipboard_wait_for_contents((GtkClipboard *)arg0, (GdkAtom)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1clipboard_1wait_1for_1contents_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_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_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_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_1container_1add
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1container_1add)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1container_1add_FUNC);
	gtk_container_add((GtkContainer *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1container_1add_FUNC);
}
#endif

#ifndef NO_gtk_1container_1forall
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1container_1forall)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1container_1forall_FUNC);
	gtk_container_forall((GtkContainer *)arg0, (GtkCallback)arg1, (gpointer)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1container_1forall_FUNC);
}
#endif

#ifndef NO_gtk_1container_1get_1border_1width
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1container_1get_1border_1width)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1container_1get_1border_1width_FUNC);
	rc = (jint)gtk_container_get_border_width((GtkContainer *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1container_1get_1border_1width_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1container_1get_1children
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1container_1get_1children)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1container_1get_1children_FUNC);
	rc = (jlong)gtk_container_get_children((GtkContainer *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1container_1get_1children_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1container_1propagate_1draw
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1container_1propagate_1draw)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1container_1propagate_1draw_FUNC);
	gtk_container_propagate_draw((GtkContainer *)arg0, (GtkWidget *)arg1, (cairo_t *)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1container_1propagate_1draw_FUNC);
}
#endif

#ifndef NO_gtk_1container_1remove
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1container_1remove)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1container_1remove_FUNC);
	gtk_container_remove((GtkContainer *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1container_1remove_FUNC);
}
#endif

#ifndef NO_gtk_1container_1set_1border_1width
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1container_1set_1border_1width)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1container_1set_1border_1width_FUNC);
	gtk_container_set_border_width((GtkContainer *)arg0, (guint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1container_1set_1border_1width_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_1dialog_1run
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1dialog_1run)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1dialog_1run_FUNC);
	rc = (jint)gtk_dialog_run((GtkDialog *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1dialog_1run_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1drag_1begin_1with_1coordinates__JJIIJII
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1drag_1begin_1with_1coordinates__JJIIJII)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3, jlong arg4, jint arg5, jint arg6)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1drag_1begin_1with_1coordinates__JJIIJII_FUNC);
/*
	rc = (jlong)gtk_drag_begin_with_coordinates((GtkWidget *)arg0, (GtkTargetList *)arg1, (GdkDragAction)arg2, (gint)arg3, (GdkEvent *)arg4, (gint)arg5, (gint)arg6);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_drag_begin_with_coordinates)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *, GtkTargetList *, GdkDragAction, gint, GdkEvent *, gint, gint))fp)((GtkWidget *)arg0, (GtkTargetList *)arg1, (GdkDragAction)arg2, (gint)arg3, (GdkEvent *)arg4, (gint)arg5, (gint)arg6);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1drag_1begin_1with_1coordinates__JJIIJII_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1drag_1begin_1with_1coordinates__JJJIII
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1drag_1begin_1with_1coordinates__JJJIII)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jint arg3, jint arg4, jint arg5)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1drag_1begin_1with_1coordinates__JJJIII_FUNC);
	rc = (jlong)gtk_drag_begin_with_coordinates((GtkWidget *)arg0, (GdkDevice *)arg1, (GdkContentFormats *)arg2, (GdkDragAction)arg3, (gint)arg4, (gint)arg5);
	GTK_NATIVE_EXIT(env, that, gtk_1drag_1begin_1with_1coordinates__JJJIII_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1drag_1check_1threshold
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1drag_1check_1threshold)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jint arg4)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1drag_1check_1threshold_FUNC);
	rc = (jboolean)gtk_drag_check_threshold((GtkWidget *)arg0, (gint)arg1, (gint)arg2, (gint)arg3, (gint)arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1drag_1check_1threshold_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1drag_1dest_1set
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1drag_1dest_1set)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jlong arg2, jint arg3, jint arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1drag_1dest_1set_FUNC);
	gtk_drag_dest_set((GtkWidget *)arg0, (GtkDestDefaults)arg1, (const GtkTargetEntry *)arg2, (gint)arg3, (GdkDragAction)arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1drag_1dest_1set_FUNC);
}
#endif

#ifndef NO_gtk_1drag_1dest_1unset
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1drag_1dest_1unset)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1drag_1dest_1unset_FUNC);
	gtk_drag_dest_unset((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1drag_1dest_1unset_FUNC);
}
#endif

#ifndef NO_gtk_1drag_1finish
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1drag_1finish)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1, jboolean arg2, jint arg3)
{
	GTK_NATIVE_ENTER(env, that, gtk_1drag_1finish_FUNC);
	gtk_drag_finish((GdkDragContext *)arg0, (gboolean)arg1, (gboolean)arg2, (guint32)arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1drag_1finish_FUNC);
}
#endif

#ifndef NO_gtk_1drag_1get_1data__JJJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1drag_1get_1data__JJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1drag_1get_1data__JJJ_FUNC);
	gtk_drag_get_data((GtkWidget *)arg0, (GdkDrop *)arg1, (GdkAtom)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1drag_1get_1data__JJJ_FUNC);
}
#endif

#ifndef NO_gtk_1drag_1get_1data__JJJI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1drag_1get_1data__JJJI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2, jint arg3)
{
	GTK_NATIVE_ENTER(env, that, gtk_1drag_1get_1data__JJJI_FUNC);
	gtk_drag_get_data((GtkWidget *)arg0, (GdkDragContext *)arg1, (GdkAtom)arg2, (guint32)arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1drag_1get_1data__JJJI_FUNC);
}
#endif

#ifndef NO_gtk_1drag_1set_1icon_1surface
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1drag_1set_1icon_1surface)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1drag_1set_1icon_1surface_FUNC);
	gtk_drag_set_icon_surface((GdkDragContext *)arg0, (cairo_surface_t *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1drag_1set_1icon_1surface_FUNC);
}
#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_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_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_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_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_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);
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_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_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_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);
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_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_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_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(arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_event_controller_get_widget)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(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_NATIVE_EXIT(env, that, gtk_1event_1controller_1key_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_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_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(arg0, arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_event_controller_set_propagation_phase)
		if (fp) {
			((void (CALLING_CONVENTION*)(jlong, jint))fp)(arg0, 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_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_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_1file
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1file_1chooser_1get_1file)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1get_1file_FUNC);
	rc = (jlong)gtk_file_chooser_get_file((GtkFileChooser *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1get_1file_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1file_1chooser_1get_1filename
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1file_1chooser_1get_1filename)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1get_1filename_FUNC);
/*
	rc = (jlong)gtk_file_chooser_get_filename((GtkFileChooser *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_get_filename)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkFileChooser *))fp)((GtkFileChooser *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1get_1filename_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1file_1chooser_1get_1filenames
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1file_1chooser_1get_1filenames)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1get_1filenames_FUNC);
/*
	rc = (jlong)gtk_file_chooser_get_filenames((GtkFileChooser *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_get_filenames)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkFileChooser *))fp)((GtkFileChooser *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1get_1filenames_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1file_1chooser_1get_1files
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1file_1chooser_1get_1files)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1get_1files_FUNC);
	rc = (jlong)gtk_file_chooser_get_files((GtkFileChooser *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1get_1files_FUNC);
	return rc;
}
#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_1get_1uri
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1file_1chooser_1get_1uri)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1get_1uri_FUNC);
/*
	rc = (jlong)gtk_file_chooser_get_uri((GtkFileChooser *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_get_uri)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkFileChooser *))fp)((GtkFileChooser *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1get_1uri_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1file_1chooser_1get_1uris
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1file_1chooser_1get_1uris)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1get_1uris_FUNC);
/*
	rc = (jlong)gtk_file_chooser_get_uris((GtkFileChooser *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_get_uris)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkFileChooser *))fp)((GtkFileChooser *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1get_1uris_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_1folder__JJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1current_1folder__JJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1current_1folder__JJ_FUNC);
/*
	gtk_file_chooser_set_current_folder((GtkFileChooser *)arg0, (const gchar *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_set_current_folder)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkFileChooser *, const gchar *))fp)((GtkFileChooser *)arg0, (const gchar *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1current_1folder__JJ_FUNC);
}
#endif

#ifndef NO_gtk_1file_1chooser_1set_1current_1folder__JJJ
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1current_1folder__JJJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1current_1folder__JJJ_FUNC);
/*
	rc = (jboolean)gtk_file_chooser_set_current_folder((GtkFileChooser *)arg0, (GFile *)arg1, (GError **)arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_set_current_folder)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GtkFileChooser *, GFile *, GError **))fp)((GtkFileChooser *)arg0, (GFile *)arg1, (GError **)arg2);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1current_1folder__JJJ_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1file_1chooser_1set_1current_1folder_1uri
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1current_1folder_1uri)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1current_1folder_1uri_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	gtk_file_chooser_set_current_folder_uri((GtkFileChooser *)arg0, (const gchar *)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_set_current_folder_uri)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkFileChooser *, const gchar *))fp)((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_1folder_1uri_FUNC);
}
#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_1do_1overwrite_1confirmation
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1do_1overwrite_1confirmation)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1do_1overwrite_1confirmation_FUNC);
/*
	gtk_file_chooser_set_do_overwrite_confirmation((GtkFileChooser *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_set_do_overwrite_confirmation)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkFileChooser *, gboolean))fp)((GtkFileChooser *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1do_1overwrite_1confirmation_FUNC);
}
#endif

#ifndef NO_gtk_1file_1chooser_1set_1extra_1widget
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1extra_1widget)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1extra_1widget_FUNC);
	gtk_file_chooser_set_extra_widget((GtkFileChooser *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1extra_1widget_FUNC);
}
#endif

#ifndef NO_gtk_1file_1chooser_1set_1file
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1file)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1file_FUNC);
/*
	rc = (jboolean)gtk_file_chooser_set_file((GtkFileChooser *)arg0, (GFile *)arg1, (GError **)arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_set_file)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GtkFileChooser *, GFile *, GError **))fp)((GtkFileChooser *)arg0, (GFile *)arg1, (GError **)arg2);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1file_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1file_1chooser_1set_1filename
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1filename)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1filename_FUNC);
/*
	gtk_file_chooser_set_filename((GtkFileChooser *)arg0, (const gchar *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_set_filename)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkFileChooser *, const gchar *))fp)((GtkFileChooser *)arg0, (const gchar *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1filename_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_1local_1only
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1local_1only)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1local_1only_FUNC);
/*
	gtk_file_chooser_set_local_only((GtkFileChooser *)arg0, (gboolean)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_set_local_only)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkFileChooser *, gboolean))fp)((GtkFileChooser *)arg0, (gboolean)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1local_1only_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_1chooser_1set_1uri
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1uri)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1uri_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	gtk_file_chooser_set_uri((GtkFileChooser *)arg0, (const char *)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_file_chooser_set_uri)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkFileChooser *, const char *))fp)((GtkFileChooser *)arg0, (const char *)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1uri_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_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_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_1multi_1press_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1gesture_1multi_1press_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1gesture_1multi_1press_1new_FUNC);
	rc = (jlong)gtk_gesture_multi_press_new();
	GTK_NATIVE_EXIT(env, that, gtk_1gesture_1multi_1press_1new_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_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_1current_1event
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1get_1current_1event)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1get_1current_1event_FUNC);
	rc = (jlong)gtk_get_current_event();
	GTK_NATIVE_EXIT(env, that, gtk_1get_1current_1event_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1get_1current_1event_1state
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1get_1current_1event_1state)
	(JNIEnv *env, jclass that, jintArray arg0)
{
	jint *lparg0=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1get_1current_1event_1state_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetIntArrayElements(env, arg0, NULL)) == NULL) goto fail;
	rc = (jboolean)gtk_get_current_event_state((GdkModifierType*)lparg0);
fail:
	if (arg0 && lparg0) (*env)->ReleaseIntArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1get_1current_1event_1state_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_1event_1widget
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1get_1event_1widget)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1get_1event_1widget_FUNC);
	rc = (jlong)gtk_get_event_widget((GdkEvent *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1get_1event_1widget_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_1grab_1add
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1grab_1add)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1grab_1add_FUNC);
	gtk_grab_add((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1grab_1add_FUNC);
}
#endif

#ifndef NO_gtk_1grab_1get_1current
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1grab_1get_1current)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1grab_1get_1current_FUNC);
	rc = (jlong)gtk_grab_get_current();
	GTK_NATIVE_EXIT(env, that, gtk_1grab_1get_1current_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1grab_1remove
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1grab_1remove)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1grab_1remove_FUNC);
	gtk_grab_remove((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1grab_1remove_FUNC);
}
#endif

#ifndef NO_gtk_1hsv_1to_1rgb
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1hsv_1to_1rgb)
	(JNIEnv *env, jclass that, jdouble arg0, jdouble arg1, jdouble arg2, jdoubleArray arg3, jdoubleArray arg4, jdoubleArray arg5)
{
	jdouble *lparg3=NULL;
	jdouble *lparg4=NULL;
	jdouble *lparg5=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1hsv_1to_1rgb_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetDoubleArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetDoubleArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetDoubleArrayElements(env, arg5, NULL)) == NULL) goto fail;
	gtk_hsv_to_rgb((gdouble)arg0, (gdouble)arg1, (gdouble)arg2, (gdouble *)lparg3, (gdouble *)lparg4, (gdouble *)lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseDoubleArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseDoubleArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseDoubleArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1hsv_1to_1rgb_FUNC);
}
#endif

#ifndef NO_gtk_1icon_1info_1load_1icon
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1icon_1info_1load_1icon)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1icon_1info_1load_1icon_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_icon_info_load_icon((GtkIconInfo *)arg0, (GError **)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1icon_1info_1load_1icon_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1icon_1theme_1get_1default
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1icon_1theme_1get_1default)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1icon_1theme_1get_1default_FUNC);
	rc = (jlong)gtk_icon_theme_get_default();
	GTK_NATIVE_EXIT(env, that, gtk_1icon_1theme_1get_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1icon_1theme_1load_1icon
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1icon_1theme_1load_1icon)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2, jint arg3, jlong arg4)
{
	jbyte *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1icon_1theme_1load_1icon_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_icon_theme_load_icon((GtkIconTheme *)arg0, (const gchar *)lparg1, (gint)arg2, (GtkIconLookupFlags)arg3, (GError **)arg4);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1icon_1theme_1load_1icon_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1icon_1theme_1lookup_1by_1gicon
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1icon_1theme_1lookup_1by_1gicon)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jint arg3)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1icon_1theme_1lookup_1by_1gicon_FUNC);
	rc = (jlong)gtk_icon_theme_lookup_by_gicon((GtkIconTheme *)arg0, (GIcon *)arg1, (gint)arg2, (GtkIconLookupFlags)arg3);
	GTK_NATIVE_EXIT(env, that, gtk_1icon_1theme_1lookup_1by_1gicon_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1im_1context_1filter_1keypress
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1im_1context_1filter_1keypress)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1im_1context_1filter_1keypress_FUNC);
	rc = (jboolean)gtk_im_context_filter_keypress((GtkIMContext *)arg0, (GdkEventKey *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1im_1context_1filter_1keypress_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_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_1pixbuf
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1image_1new_1from_1pixbuf)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1image_1new_1from_1pixbuf_FUNC);
	rc = (jlong)gtk_image_new_from_pixbuf((GdkPixbuf *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1image_1new_1from_1pixbuf_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1image_1set_1from_1gicon__JJ
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1image_1set_1from_1gicon__JJ)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1image_1set_1from_1gicon__JJ_FUNC);
/*
	gtk_image_set_from_gicon((GtkImage *)arg0, (GIcon *)arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_image_set_from_gicon)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkImage *, GIcon *))fp)((GtkImage *)arg0, (GIcon *)arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1image_1set_1from_1gicon__JJ_FUNC);
}
#endif

#ifndef NO_gtk_1image_1set_1from_1gicon__JJI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1image_1set_1from_1gicon__JJI)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1image_1set_1from_1gicon__JJI_FUNC);
/*
	gtk_image_set_from_gicon((GtkImage *)arg0, (GIcon *)arg1, (GtkIconSize)arg2);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_image_set_from_gicon)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkImage *, GIcon *, GtkIconSize))fp)((GtkImage *)arg0, (GIcon *)arg1, (GtkIconSize)arg2);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1image_1set_1from_1gicon__JJI_FUNC);
}
#endif

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

#ifndef NO_gtk_1image_1set_1from_1icon_1name__J_3BI
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1image_1set_1from_1icon_1name__J_3BI)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jint arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1image_1set_1from_1icon_1name__J_3BI_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__J_3BI_FUNC);
}
#endif

#ifndef NO_gtk_1image_1set_1from_1pixbuf
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1image_1set_1from_1pixbuf)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1image_1set_1from_1pixbuf_FUNC);
	gtk_image_set_from_pixbuf((GtkImage *)arg0, (GdkPixbuf *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1image_1set_1from_1pixbuf_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_1init_1check__
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1init_1check__)
	(JNIEnv *env, jclass that)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1init_1check___FUNC);
/*
	rc = (jboolean)gtk_init_check();
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_init_check)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)())fp)();
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1init_1check___FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1init_1check___3J_3J
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1init_1check___3J_3J)
	(JNIEnv *env, jclass that, jlongArray arg0, jlongArray arg1)
{
	jlong *lparg0=NULL;
	jlong *lparg1=NULL;
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1init_1check___3J_3J_FUNC);
	if (arg0) if ((lparg0 = (*env)->GetLongArrayElements(env, arg0, NULL)) == NULL) goto fail;
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
/*
	rc = (jboolean)gtk_init_check((int *)lparg0, (char ***)lparg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_init_check)
		if (fp) {
			rc = (jboolean)((jboolean (CALLING_CONVENTION*)(int *, char ***))fp)((int *)lparg0, (char ***)lparg1);
		}
	}
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	if (arg0 && lparg0) (*env)->ReleaseLongArrayElements(env, arg0, lparg0, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1init_1check___3J_3J_FUNC);
	return rc;
}
#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_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_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_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_LOAD_FUNCTION(fp, gtk_label_set_xalign)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkLabel *, gfloat))fp)((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_LOAD_FUNCTION(fp, gtk_label_set_yalign)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkLabel *, gfloat))fp)((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_1main_1do_1event
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1main_1do_1event)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1main_1do_1event_FUNC);
	gtk_main_do_event((GdkEvent *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1main_1do_1event_FUNC);
}
#endif

#ifndef NO_gtk_1menu_1bar_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1menu_1bar_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1bar_1new_FUNC);
	rc = (jlong)gtk_menu_bar_new();
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1bar_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1menu_1item_1get_1submenu
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1menu_1item_1get_1submenu)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1item_1get_1submenu_FUNC);
	rc = (jlong)gtk_menu_item_get_submenu((GtkMenuItem *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1item_1get_1submenu_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1menu_1item_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1menu_1item_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1item_1new_FUNC);
	rc = (jlong)gtk_menu_item_new();
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1item_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1menu_1item_1set_1submenu
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1menu_1item_1set_1submenu)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1item_1set_1submenu_FUNC);
	gtk_menu_item_set_submenu((GtkMenuItem *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1item_1set_1submenu_FUNC);
}
#endif

#ifndef NO_gtk_1menu_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1menu_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1new_FUNC);
	rc = (jlong)gtk_menu_new();
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1menu_1popdown
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1menu_1popdown)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1popdown_FUNC);
	gtk_menu_popdown((GtkMenu *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1popdown_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_1menu_1shell_1deactivate
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1menu_1shell_1deactivate)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1shell_1deactivate_FUNC);
	gtk_menu_shell_deactivate((GtkMenuShell *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1shell_1deactivate_FUNC);
}
#endif

#ifndef NO_gtk_1menu_1shell_1insert
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1menu_1shell_1insert)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1shell_1insert_FUNC);
	gtk_menu_shell_insert((GtkMenuShell *)arg0, (GtkWidget *)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1shell_1insert_FUNC);
}
#endif

#ifndef NO_gtk_1menu_1shell_1set_1take_1focus
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1menu_1shell_1set_1take_1focus)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1shell_1set_1take_1focus_FUNC);
	gtk_menu_shell_set_take_focus((GtkMenuShell *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1shell_1set_1take_1focus_FUNC);
}
#endif

#ifndef NO_gtk_1menu_1tool_1button_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1menu_1tool_1button_1new)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1)
{
	jbyte *lparg1=NULL;
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1menu_1tool_1button_1new_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	rc = (jlong)gtk_menu_tool_button_new((GtkWidget *)arg0, (const gchar *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1menu_1tool_1button_1new_FUNC);
	return rc;
}
#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_1run
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1native_1dialog_1run)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1native_1dialog_1run_FUNC);
	rc = (jint)gtk_native_dialog_run((GtkNativeDialog *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1native_1dialog_1run_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1native_1get_1surface
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1native_1get_1surface)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1native_1get_1surface_FUNC);
	rc = (jlong)gtk_native_get_surface((GtkNative *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1native_1get_1surface_FUNC);
	return rc;
}
#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_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_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_1radio_1button_1get_1group
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1radio_1button_1get_1group)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1radio_1button_1get_1group_FUNC);
	rc = (jlong)gtk_radio_button_get_group((GtkRadioButton *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1radio_1button_1get_1group_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1radio_1button_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1radio_1button_1new)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1radio_1button_1new_FUNC);
	rc = (jlong)gtk_radio_button_new((GSList *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1radio_1button_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1radio_1menu_1item_1get_1group
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1radio_1menu_1item_1get_1group)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1radio_1menu_1item_1get_1group_FUNC);
	rc = (jlong)gtk_radio_menu_item_get_group((GtkRadioMenuItem *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1radio_1menu_1item_1get_1group_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1radio_1menu_1item_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1radio_1menu_1item_1new)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1radio_1menu_1item_1new_FUNC);
	rc = (jlong)gtk_radio_menu_item_new((GSList *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1radio_1menu_1item_1new_FUNC);
	return rc;
}
#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_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_1rgb_1to_1hsv
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1rgb_1to_1hsv)
	(JNIEnv *env, jclass that, jdouble arg0, jdouble arg1, jdouble arg2, jdoubleArray arg3, jdoubleArray arg4, jdoubleArray arg5)
{
	jdouble *lparg3=NULL;
	jdouble *lparg4=NULL;
	jdouble *lparg5=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1rgb_1to_1hsv_FUNC);
	if (arg3) if ((lparg3 = (*env)->GetDoubleArrayElements(env, arg3, NULL)) == NULL) goto fail;
	if (arg4) if ((lparg4 = (*env)->GetDoubleArrayElements(env, arg4, NULL)) == NULL) goto fail;
	if (arg5) if ((lparg5 = (*env)->GetDoubleArrayElements(env, arg5, NULL)) == NULL) goto fail;
	gtk_rgb_to_hsv((gdouble)arg0, (gdouble)arg1, (gdouble)arg2, (gdouble *)lparg3, (gdouble *)lparg4, (gdouble *)lparg5);
fail:
	if (arg5 && lparg5) (*env)->ReleaseDoubleArrayElements(env, arg5, lparg5, 0);
	if (arg4 && lparg4) (*env)->ReleaseDoubleArrayElements(env, arg4, lparg4, 0);
	if (arg3 && lparg3) (*env)->ReleaseDoubleArrayElements(env, arg3, lparg3, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1rgb_1to_1hsv_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_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_1shadow_1type
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1scrolled_1window_1get_1shadow_1type)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1get_1shadow_1type_FUNC);
	rc = (jint)gtk_scrolled_window_get_shadow_type((GtkScrolledWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1get_1shadow_1type_FUNC);
	return rc;
}
#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_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1scrolled_1window_1new)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1new_FUNC);
	rc = (jlong)gtk_scrolled_window_new((GtkAdjustment *)arg0, (GtkAdjustment *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1new_FUNC);
	return rc;
}
#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_1shadow_1type
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scrolled_1window_1set_1shadow_1type)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1set_1shadow_1type_FUNC);
	gtk_scrolled_window_set_shadow_type((GtkScrolledWindow *)arg0, (GtkShadowType)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1set_1shadow_1type_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_1selection_1data_1free
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1selection_1data_1free)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1selection_1data_1free_FUNC);
	gtk_selection_data_free((GtkSelectionData *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1selection_1data_1free_FUNC);
}
#endif

#ifndef NO_gtk_1selection_1data_1get_1data
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1selection_1data_1get_1data)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1selection_1data_1get_1data_FUNC);
	rc = (jlong)gtk_selection_data_get_data((GtkSelectionData *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1selection_1data_1get_1data_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1selection_1data_1get_1data_1type
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1selection_1data_1get_1data_1type)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1selection_1data_1get_1data_1type_FUNC);
	rc = (jlong)gtk_selection_data_get_data_type((GtkSelectionData *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1selection_1data_1get_1data_1type_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1selection_1data_1get_1format
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1selection_1data_1get_1format)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1selection_1data_1get_1format_FUNC);
	rc = (jint)gtk_selection_data_get_format((GtkSelectionData *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1selection_1data_1get_1format_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1selection_1data_1get_1length
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1selection_1data_1get_1length)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1selection_1data_1get_1length_FUNC);
	rc = (jint)gtk_selection_data_get_length((GtkSelectionData *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1selection_1data_1get_1length_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1selection_1data_1get_1target
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1selection_1data_1get_1target)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1selection_1data_1get_1target_FUNC);
	rc = (jlong)gtk_selection_data_get_target((GtkSelectionData *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1selection_1data_1get_1target_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1selection_1data_1set
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1selection_1data_1set)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2, jlong arg3, jint arg4)
{
	GTK_NATIVE_ENTER(env, that, gtk_1selection_1data_1set_FUNC);
	gtk_selection_data_set((GtkSelectionData *)arg0, (GdkAtom)arg1, (gint)arg2, (const guchar *)arg3, (gint)arg4);
	GTK_NATIVE_EXIT(env, that, gtk_1selection_1data_1set_FUNC);
}
#endif

#ifndef NO_gtk_1separator_1menu_1item_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1separator_1menu_1item_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1separator_1menu_1item_1new_FUNC);
	rc = (jlong)gtk_separator_menu_item_new();
	GTK_NATIVE_EXIT(env, that, gtk_1separator_1menu_1item_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_1separator_1tool_1item_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1separator_1tool_1item_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1separator_1tool_1item_1new_FUNC);
	rc = (jlong)gtk_separator_tool_item_new();
	GTK_NATIVE_EXIT(env, that, gtk_1separator_1tool_1item_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1separator_1tool_1item_1set_1draw
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1separator_1tool_1item_1set_1draw)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1separator_1tool_1item_1set_1draw_FUNC);
	gtk_separator_tool_item_set_draw((GtkSeparatorToolItem *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1separator_1tool_1item_1set_1draw_FUNC);
}
#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
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;
}
#endif

#ifndef NO_gtk_1status_1icon_1get_1visible
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1status_1icon_1get_1visible)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1status_1icon_1get_1visible_FUNC);
	rc = (jboolean)gtk_status_icon_get_visible((GtkStatusIcon*)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1status_1icon_1get_1visible_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1status_1icon_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1status_1icon_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1status_1icon_1new_FUNC);
	rc = (jlong)gtk_status_icon_new();
	GTK_NATIVE_EXIT(env, that, gtk_1status_1icon_1new_FUNC);
	return rc;
}
#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_1status_1icon_1set_1from_1pixbuf
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1status_1icon_1set_1from_1pixbuf)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1status_1icon_1set_1from_1pixbuf_FUNC);
	gtk_status_icon_set_from_pixbuf((GtkStatusIcon*)arg0, (GdkPixbuf*)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1status_1icon_1set_1from_1pixbuf_FUNC);
}
#endif

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

#ifndef NO_gtk_1status_1icon_1set_1visible
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1status_1icon_1set_1visible)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1status_1icon_1set_1visible_FUNC);
	gtk_status_icon_set_visible((GtkStatusIcon*)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1status_1icon_1set_1visible_FUNC);
}
#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_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_1target_1list_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1target_1list_1new)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1target_1list_1new_FUNC);
	rc = (jlong)gtk_target_list_new((const GtkTargetEntry *)arg0, (guint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1target_1list_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1target_1list_1unref
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1target_1list_1unref)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1target_1list_1unref_FUNC);
	gtk_target_list_unref((GtkTargetList *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1target_1list_1unref_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_1surface_1coords
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1text_1view_1buffer_1to_1surface_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_1surface_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_surface_coords((GtkTextView *)arg0, (GtkTextWindowType)arg1, (gint)arg2, (gint)arg3, (gint *)lparg4, (gint *)lparg5);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_text_view_buffer_to_surface_coords)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkTextView *, GtkTextWindowType, gint, gint, gint *, gint *))fp)((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_1surface_1coords_FUNC);
}
#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);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_text_view_buffer_to_window_coords)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkTextView *, GtkTextWindowType, gint, gint, gint *, gint *))fp)((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_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_1toggle_1tool_1button_1get_1active
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1toggle_1tool_1button_1get_1active)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1toggle_1tool_1button_1get_1active_FUNC);
	rc = (jboolean)gtk_toggle_tool_button_get_active((GtkToggleToolButton *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1toggle_1tool_1button_1get_1active_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1toggle_1tool_1button_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1toggle_1tool_1button_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1toggle_1tool_1button_1new_FUNC);
	rc = (jlong)gtk_toggle_tool_button_new();
	GTK_NATIVE_EXIT(env, that, gtk_1toggle_1tool_1button_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1toggle_1tool_1button_1set_1active
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1toggle_1tool_1button_1set_1active)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1toggle_1tool_1button_1set_1active_FUNC);
	gtk_toggle_tool_button_set_active((GtkToggleToolButton *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1toggle_1tool_1button_1set_1active_FUNC);
}
#endif

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

#ifndef NO_gtk_1tool_1button_1set_1icon_1widget
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tool_1button_1set_1icon_1widget)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tool_1button_1set_1icon_1widget_FUNC);
	gtk_tool_button_set_icon_widget((GtkToolButton *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tool_1button_1set_1icon_1widget_FUNC);
}
#endif

#ifndef NO_gtk_1tool_1button_1set_1label_1widget
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tool_1button_1set_1label_1widget)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tool_1button_1set_1label_1widget_FUNC);
	gtk_tool_button_set_label_widget((GtkToolButton *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tool_1button_1set_1label_1widget_FUNC);
}
#endif

#ifndef NO_gtk_1tool_1button_1set_1use_1underline
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tool_1button_1set_1use_1underline)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tool_1button_1set_1use_1underline_FUNC);
	gtk_tool_button_set_use_underline((GtkToolButton *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tool_1button_1set_1use_1underline_FUNC);
}
#endif

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

#ifndef NO_gtk_1tool_1item_1retrieve_1proxy_1menu_1item
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1tool_1item_1retrieve_1proxy_1menu_1item)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1tool_1item_1retrieve_1proxy_1menu_1item_FUNC);
	rc = (jlong)gtk_tool_item_retrieve_proxy_menu_item((GtkToolItem *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1tool_1item_1retrieve_1proxy_1menu_1item_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1tool_1item_1set_1homogeneous
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tool_1item_1set_1homogeneous)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tool_1item_1set_1homogeneous_FUNC);
	gtk_tool_item_set_homogeneous((GtkToolItem *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tool_1item_1set_1homogeneous_FUNC);
}
#endif

#ifndef NO_gtk_1tool_1item_1set_1is_1important
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tool_1item_1set_1is_1important)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1tool_1item_1set_1is_1important_FUNC);
	gtk_tool_item_set_is_important((GtkToolItem *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1tool_1item_1set_1is_1important_FUNC);
}
#endif

#ifndef NO_gtk_1tool_1item_1set_1proxy_1menu_1item
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tool_1item_1set_1proxy_1menu_1item)
	(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2)
{
	jbyte *lparg1=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1tool_1item_1set_1proxy_1menu_1item_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gtk_tool_item_set_proxy_menu_item((GtkToolItem *)arg0, (const gchar *)lparg1, (GtkWidget *)arg2);
fail:
	if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
	GTK_NATIVE_EXIT(env, that, gtk_1tool_1item_1set_1proxy_1menu_1item_FUNC);
}
#endif

#ifndef NO_gtk_1toolbar_1insert
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1toolbar_1insert)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1toolbar_1insert_FUNC);
	gtk_toolbar_insert((GtkToolbar *)arg0, (GtkToolItem *)arg1, arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1toolbar_1insert_FUNC);
}
#endif

#ifndef NO_gtk_1toolbar_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1toolbar_1new)
	(JNIEnv *env, jclass that)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1toolbar_1new_FUNC);
	rc = (jlong)gtk_toolbar_new();
	GTK_NATIVE_EXIT(env, that, gtk_1toolbar_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1toolbar_1set_1icon_1size
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1toolbar_1set_1icon_1size)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1toolbar_1set_1icon_1size_FUNC);
/*
	gtk_toolbar_set_icon_size((GtkToolbar *)arg0, arg1);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_toolbar_set_icon_size)
		if (fp) {
			((void (CALLING_CONVENTION*)(GtkToolbar *, jint))fp)((GtkToolbar *)arg0, arg1);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1toolbar_1set_1icon_1size_FUNC);
}
#endif

#ifndef NO_gtk_1toolbar_1set_1show_1arrow
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1toolbar_1set_1show_1arrow)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1toolbar_1set_1show_1arrow_FUNC);
	gtk_toolbar_set_show_arrow((GtkToolbar *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1toolbar_1set_1show_1arrow_FUNC);
}
#endif

#ifndef NO_gtk_1toolbar_1set_1style
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1toolbar_1set_1style)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1toolbar_1set_1style_FUNC);
	gtk_toolbar_set_style((GtkToolbar *)arg0, (GtkToolbarStyle)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1toolbar_1set_1style_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
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1tree_1view_1column_1cell_1get_1size)
	(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_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_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_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_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_NATIVE_EXIT(env, that, gtk_1widget_1add_1controller_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_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_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_NATIVE_EXIT(env, that, gtk_1widget_1event_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1accessible
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1accessible)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1accessible_FUNC);
	rc = (jlong)gtk_widget_get_accessible((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1accessible_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_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_NATIVE_EXIT(env, that, gtk_1widget_1get_1first_1child_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1widget_1get_1has_1surface
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1get_1has_1surface)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1has_1surface_FUNC);
	rc = (jboolean)gtk_widget_get_has_surface((GtkWidget *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1has_1surface_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_NATIVE_EXIT(env, that, gtk_1widget_1get_1has_1window_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_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_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_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_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_NATIVE_EXIT(env, that, gtk_1widget_1input_1shape_1combine_1region_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);
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_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_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_1surface
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1has_1surface)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1has_1surface_FUNC);
	gtk_widget_set_has_surface((GtkWidget *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1has_1surface_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_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_1surface
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1widget_1set_1parent_1surface)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1set_1parent_1surface_FUNC);
	gtk_widget_set_parent_surface((GtkWidget *)arg0, (GdkSurface *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1set_1parent_1surface_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_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
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1widget_1translate_1coordinates)
	(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_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);
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_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1activate_1default
JNIEXPORT jboolean JNICALL GTK_NATIVE(gtk_1window_1activate_1default)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jboolean rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1activate_1default_FUNC);
	rc = (jboolean)gtk_window_activate_default((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1activate_1default_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1add_1accel_1group
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1add_1accel_1group)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1add_1accel_1group_FUNC);
	gtk_window_add_accel_group((GtkWindow *)arg0, (GtkAccelGroup *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1add_1accel_1group_FUNC);
}
#endif

#ifndef NO_gtk_1window_1deiconify
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1deiconify)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1deiconify_FUNC);
	gtk_window_deiconify((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1deiconify_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_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_1icon_1list
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1window_1get_1icon_1list)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1get_1icon_1list_FUNC);
	rc = (jlong)gtk_window_get_icon_list((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1get_1icon_1list_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1get_1mnemonic_1modifier
JNIEXPORT jint JNICALL GTK_NATIVE(gtk_1window_1get_1mnemonic_1modifier)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1get_1mnemonic_1modifier_FUNC);
	rc = (jint)gtk_window_get_mnemonic_modifier((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1get_1mnemonic_1modifier_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_1get_1position
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1get_1position)
	(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1get_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;
	gtk_window_get_position((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_1position_FUNC);
}
#endif

#ifndef NO_gtk_1window_1get_1size
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1get_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_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_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_1size_FUNC);
}
#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_1iconify
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1iconify)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1iconify_FUNC);
	gtk_window_iconify((GtkWindow *)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1iconify_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_1move
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1move)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1move_FUNC);
	gtk_window_move((GtkWindow *)arg0, (gint)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1move_FUNC);
}
#endif

#ifndef NO_gtk_1window_1new
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1window_1new)
	(JNIEnv *env, jclass that, jint arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1window_1new_FUNC);
	rc = (jlong)gtk_window_new((GtkWindowType)arg0);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1new_FUNC);
	return rc;
}
#endif

#ifndef NO_gtk_1window_1remove_1accel_1group
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1remove_1accel_1group)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1remove_1accel_1group_FUNC);
	gtk_window_remove_accel_group((GtkWindow *)arg0, (GtkAccelGroup *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1remove_1accel_1group_FUNC);
}
#endif

#ifndef NO_gtk_1window_1resize
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1resize)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1resize_FUNC);
	gtk_window_resize((GtkWindow *)arg0, (gint)arg1, (gint)arg2);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1resize_FUNC);
}
#endif

#ifndef NO_gtk_1window_1set_1attached_1to
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1attached_1to)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1attached_1to_FUNC);
	gtk_window_set_attached_to((GtkWindow *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1attached_1to_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
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1default)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1default_FUNC);
	gtk_window_set_default((GtkWindow *)arg0, (GtkWidget *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1default_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_1icon_1list
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1icon_1list)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1icon_1list_FUNC);
	gtk_window_set_icon_list((GtkWindow *)arg0, (GList *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1icon_1list_FUNC);
}
#endif

#ifndef NO_gtk_1window_1set_1keep_1above
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1keep_1above)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1keep_1above_FUNC);
	gtk_window_set_keep_above((GtkWindow *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1keep_1above_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_1skip_1taskbar_1hint
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1skip_1taskbar_1hint)
	(JNIEnv *env, jclass that, jlong arg0, jboolean arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1skip_1taskbar_1hint_FUNC);
	gtk_window_set_skip_taskbar_hint((GtkWindow *)arg0, (gboolean)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1skip_1taskbar_1hint_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_1set_1type_1hint
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1type_1hint)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1type_1hint_FUNC);
	gtk_window_set_type_hint((GtkWindow *)arg0, arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1type_1hint_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_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_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(arg0, arg1, arg2, arg3, arg4, 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
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);
}
#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_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_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_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
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);
}
#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_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_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_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_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

