/*******************************************************************************
 * 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, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1device_1get_1surface_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_surface_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_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_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_1focus
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1focus)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1focus_FUNC);
	gdk_surface_focus((GdkSurface *)arg0, arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1focus_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1get_1children
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1surface_1get_1children)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1get_1children_FUNC);
	rc = (jlong)gdk_surface_get_children((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1get_1children_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1surface_1get_1device_1position
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1surface_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_1surface_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_surface_get_device_position((GdkSurface *)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_1surface_1get_1device_1position_FUNC);
	return rc;
}
#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_1frame_1extents
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1get_1frame_1extents)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1get_1frame_1extents_FUNC);
	if (arg1) if ((lparg1 = &_arg1) == NULL) goto fail;
	gdk_surface_get_frame_extents((GdkSurface *)arg0, (GdkRectangle *)lparg1);
fail:
	if (arg1 && lparg1) setGdkRectangleFields(env, arg1, lparg1);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1get_1frame_1extents_FUNC);
}
#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_1root_1origin
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_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_1surface_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_surface_get_root_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_1root_1origin_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1get_1state
JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1surface_1get_1state)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jint rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1get_1state_FUNC);
	rc = (jint)gdk_surface_get_state((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1get_1state_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1surface_1get_1user_1data
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1get_1user_1data)
	(JNIEnv *env, jclass that, jlong arg0, jlongArray arg1)
{
	jlong *lparg1=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1get_1user_1data_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetLongArrayElements(env, arg1, NULL)) == NULL) goto fail;
	gdk_surface_get_user_data((GdkSurface *)arg0, (gpointer *)lparg1);
fail:
	if (arg1 && lparg1) (*env)->ReleaseLongArrayElements(env, arg1, lparg1, 0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1get_1user_1data_FUNC);
}
#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_1invalidate_1rect
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1invalidate_1rect)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1invalidate_1rect_FUNC);
	if (arg1) if ((lparg1 = getGdkRectangleFields(env, arg1, &_arg1)) == NULL) goto fail;
	gdk_surface_invalidate_rect((GdkSurface *)arg0, (GdkRectangle *)lparg1);
fail:
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1invalidate_1rect_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1invalidate_1region
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1invalidate_1region)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1invalidate_1region_FUNC);
	gdk_surface_invalidate_region((GdkSurface *)arg0, (const cairo_region_t *)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1invalidate_1region_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1lower
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1lower)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1lower_FUNC);
	gdk_surface_lower((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1lower_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1move
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1move)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1move_FUNC);
	gdk_surface_move((GdkSurface *)arg0, arg1, arg2);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1move_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1move_1resize
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1move_1resize)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jint arg3, jint arg4)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1move_1resize_FUNC);
	gdk_surface_move_resize((GdkSurface *)arg0, arg1, arg2, arg3, arg4);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1move_1resize_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1new_1child
JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1surface_1new_1child)
	(JNIEnv *env, jclass that, jlong arg0, jobject arg1)
{
	GdkRectangle _arg1, *lparg1=NULL;
	jlong rc = 0;
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1new_1child_FUNC);
	if (arg1) if ((lparg1 = getGdkRectangleFields(env, arg1, &_arg1)) == NULL) goto fail;
	rc = (jlong)gdk_surface_new_child((GdkSurface *)arg0, lparg1);
fail:
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1new_1child_FUNC);
	return rc;
}
#endif

#ifndef NO_gdk_1surface_1raise
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1raise)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1raise_FUNC);
	gdk_surface_raise((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1raise_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1resize
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1resize)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1resize_FUNC);
	gdk_surface_resize((GdkSurface *)arg0, arg1, arg2);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1resize_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1restack
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1restack)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jboolean arg2)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1restack_FUNC);
	gdk_surface_restack((GdkSurface *)arg0, (GdkSurface *)arg1, (gboolean)arg2);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1restack_FUNC);
}
#endif

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

#ifndef NO_gdk_1surface_1set_1decorations
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1set_1decorations)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1set_1decorations_FUNC);
	gdk_surface_set_decorations((GdkSurface *)arg0, (GdkWMDecoration)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1set_1decorations_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1set_1functions
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1set_1functions)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1set_1functions_FUNC);
	gdk_surface_set_functions((GdkSurface *)arg0, (GdkWMFunction)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1set_1functions_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1set_1user_1data
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1set_1user_1data)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1set_1user_1data_FUNC);
	gdk_surface_set_user_data((GdkSurface *)arg0, (gpointer)arg1);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1set_1user_1data_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1show
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1show)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1show_FUNC);
	gdk_surface_show((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1show_FUNC);
}
#endif

#ifndef NO_gdk_1surface_1show_1unraised
JNIEXPORT void JNICALL GDK_NATIVE(gdk_1surface_1show_1unraised)
	(JNIEnv *env, jclass that, jlong arg0)
{
	GDK_NATIVE_ENTER(env, that, gdk_1surface_1show_1unraised_FUNC);
	gdk_surface_show_unraised((GdkSurface *)arg0);
	GDK_NATIVE_EXIT(env, that, gdk_1surface_1show_1unraised_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_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
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1get_1date)
	(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_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);
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_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
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1calendar_1select_1day)
	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1calendar_1select_1day_FUNC);
	gtk_calendar_select_day((GtkCalendar *)arg0, (guint)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1calendar_1select_1day_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_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_NATIVE_EXIT(env, that, gtk_1calendar_1set_1display_1options_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_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_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_NATIVE_EXIT(env, that, gtk_1file_1chooser_1get_1filenames_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_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_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
JNIEXPORT void JNICALL GTK_NATIVE(gtk_1file_1chooser_1set_1current_1folder)
	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
{
	GTK_NATIVE_ENTER(env, that, gtk_1file_1chooser_1set_1current_1folder_FUNC);
	gtk_file_chooser_set_current_folder((GtkFileChooser *)arg0, (const gchar *)arg1);
	GTK_NATIVE_EXIT(env, that, gtk_1file_1chooser_1set_1current_1folder_FUNC);
}
#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);
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_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_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_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_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);
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_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_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_1surface
JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1widget_1get_1surface)
	(JNIEnv *env, jclass that, jlong arg0)
{
	jlong rc = 0;
	GTK_NATIVE_ENTER(env, that, gtk_1widget_1get_1surface_FUNC);
/*
	rc = (jlong)gtk_widget_get_surface((GtkWidget *)arg0);
*/
	{
		GTK_LOAD_FUNCTION(fp, gtk_widget_get_surface)
		if (fp) {
			rc = (jlong)((jlong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
		}
	}
	GTK_NATIVE_EXIT(env, that, gtk_1widget_1get_1surface_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_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_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_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

