0N/A/*
3261N/A * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A#include <stdlib.h>
0N/A#include <string.h>
0N/A#include <unistd.h>
0N/A#include <dlfcn.h>
0N/A
0N/A#include <jni.h>
6295N/A#include <sizecalc.h>
0N/A#include "sun_awt_UNIXToolkit.h"
0N/A
0N/A#ifndef HEADLESS
0N/A#include "awt.h"
0N/A#include "gtk2_interface.h"
0N/A#endif /* !HEADLESS */
0N/A
0N/A
0N/Astatic jclass this_class = NULL;
0N/Astatic jmethodID icon_upcall_method = NULL;
0N/A
0N/A
0N/A/*
0N/A * Class: sun_awt_UNIXToolkit
0N/A * Method: check_gtk
0N/A * Signature: ()Z
0N/A */
0N/AJNIEXPORT jboolean JNICALL
0N/AJava_sun_awt_UNIXToolkit_check_1gtk(JNIEnv *env, jclass klass)
0N/A{
0N/A#ifndef HEADLESS
0N/A return (jboolean)gtk2_check_version();
0N/A#else
0N/A return JNI_FALSE;
0N/A#endif /* !HEADLESS */
0N/A}
0N/A
0N/A
0N/A/*
0N/A * Class: sun_awt_UNIXToolkit
0N/A * Method: load_gtk
0N/A * Signature: ()Z
0N/A */
0N/AJNIEXPORT jboolean JNICALL
0N/AJava_sun_awt_UNIXToolkit_load_1gtk(JNIEnv *env, jclass klass)
0N/A{
0N/A#ifndef HEADLESS
0N/A return (jboolean)gtk2_load();
0N/A#else
0N/A return JNI_FALSE;
0N/A#endif /* !HEADLESS */
0N/A}
0N/A
0N/A
0N/A/*
0N/A * Class: sun_awt_UNIXToolkit
0N/A * Method: unload_gtk
0N/A * Signature: ()Z
0N/A */
0N/AJNIEXPORT jboolean JNICALL
0N/AJava_sun_awt_UNIXToolkit_unload_1gtk(JNIEnv *env, jclass klass)
0N/A{
0N/A#ifndef HEADLESS
0N/A return (jboolean)gtk2_unload();
0N/A#else
0N/A return JNI_FALSE;
0N/A#endif /* !HEADLESS */
0N/A}
0N/A
0N/Ajboolean _icon_upcall(JNIEnv *env, jobject this, GdkPixbuf *pixbuf)
0N/A{
0N/A jboolean result = JNI_FALSE;
0N/A
0N/A if (this_class == NULL) {
0N/A this_class = (*env)->NewGlobalRef(env,
0N/A (*env)->GetObjectClass(env, this));
0N/A icon_upcall_method = (*env)->GetMethodID(env, this_class,
0N/A "loadIconCallback", "([BIIIIIZ)V");
0N/A }
0N/A
0N/A if (pixbuf != NULL)
0N/A {
0N/A guchar *pixbuf_data = (*fp_gdk_pixbuf_get_pixels)(pixbuf);
0N/A int row_stride = (*fp_gdk_pixbuf_get_rowstride)(pixbuf);
0N/A int width = (*fp_gdk_pixbuf_get_width)(pixbuf);
0N/A int height = (*fp_gdk_pixbuf_get_height)(pixbuf);
0N/A int bps = (*fp_gdk_pixbuf_get_bits_per_sample)(pixbuf);
0N/A int channels = (*fp_gdk_pixbuf_get_n_channels)(pixbuf);
0N/A gboolean alpha = (*fp_gdk_pixbuf_get_has_alpha)(pixbuf);
0N/A
0N/A /* Copy the data array into a Java structure so we can pass it back. */
0N/A jbyteArray data = (*env)->NewByteArray(env, (row_stride * height));
0N/A (*env)->SetByteArrayRegion(env, data, 0, (row_stride * height),
2859N/A (jbyte *)pixbuf_data);
0N/A
0N/A /* Release the pixbuf. */
0N/A (*fp_g_object_unref)(pixbuf);
0N/A
0N/A /* Call the callback method to create the image on the Java side. */
0N/A (*env)->CallVoidMethod(env, this, icon_upcall_method, data,
0N/A width, height, row_stride, bps, channels, alpha);
0N/A result = JNI_TRUE;
0N/A }
0N/A return result;
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_awt_UNIXToolkit
0N/A * Method: load_gtk_icon
0N/A * Signature: (Ljava/lang/String)Z
0N/A *
0N/A * This method assumes that GTK libs are present.
0N/A */
0N/AJNIEXPORT jboolean JNICALL
0N/AJava_sun_awt_UNIXToolkit_load_1gtk_1icon(JNIEnv *env, jobject this,
0N/A jstring filename)
0N/A{
0N/A#ifndef HEADLESS
0N/A int len;
0N/A char *filename_str = NULL;
0N/A GError **error = NULL;
0N/A GdkPixbuf *pixbuf;
0N/A
0N/A if (filename == NULL)
0N/A {
0N/A return JNI_FALSE;
0N/A }
0N/A
0N/A len = (*env)->GetStringUTFLength(env, filename);
6295N/A filename_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
6295N/A sizeof(char), len + 1);
0N/A if (filename_str == NULL) {
0N/A JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
0N/A return JNI_FALSE;
0N/A }
0N/A (*env)->GetStringUTFRegion(env, filename, 0, len, filename_str);
0N/A pixbuf = (*fp_gdk_pixbuf_new_from_file)(filename_str, error);
0N/A
0N/A /* Release the strings we've allocated. */
0N/A free(filename_str);
0N/A
0N/A return _icon_upcall(env, this, pixbuf);
0N/A#else /* HEADLESS */
0N/A return JNI_FALSE;
0N/A#endif /* !HEADLESS */
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_awt_UNIXToolkit
0N/A * Method: load_stock_icon
0N/A * Signature: (ILjava/lang/String;IILjava/lang/String;)Z
0N/A *
0N/A * This method assumes that GTK libs are present.
0N/A */
0N/AJNIEXPORT jboolean JNICALL
0N/AJava_sun_awt_UNIXToolkit_load_1stock_1icon(JNIEnv *env, jobject this,
0N/A jint widget_type, jstring stock_id, jint icon_size,
0N/A jint text_direction, jstring detail)
0N/A{
0N/A#ifndef HEADLESS
0N/A int len;
0N/A char *stock_id_str = NULL;
0N/A char *detail_str = NULL;
0N/A GdkPixbuf *pixbuf;
0N/A
0N/A if (stock_id == NULL)
0N/A {
0N/A return JNI_FALSE;
0N/A }
0N/A
0N/A len = (*env)->GetStringUTFLength(env, stock_id);
6295N/A stock_id_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
6295N/A sizeof(char), len + 1);
0N/A if (stock_id_str == NULL) {
0N/A JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
0N/A return JNI_FALSE;
0N/A }
0N/A (*env)->GetStringUTFRegion(env, stock_id, 0, len, stock_id_str);
0N/A
0N/A /* Detail isn't required so check for NULL. */
0N/A if (detail != NULL)
0N/A {
0N/A len = (*env)->GetStringUTFLength(env, detail);
6295N/A detail_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
6295N/A sizeof(char), len + 1);
0N/A if (detail_str == NULL) {
0N/A JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
0N/A return JNI_FALSE;
0N/A }
0N/A (*env)->GetStringUTFRegion(env, detail, 0, len, detail_str);
0N/A }
0N/A
0N/A pixbuf = gtk2_get_stock_icon(widget_type, stock_id_str, icon_size,
0N/A text_direction, detail_str);
0N/A
0N/A /* Release the strings we've allocated. */
0N/A free(stock_id_str);
0N/A if (detail_str != NULL)
0N/A {
0N/A free(detail_str);
0N/A }
0N/A
0N/A return _icon_upcall(env, this, pixbuf);
0N/A#else /* HEADLESS */
0N/A return JNI_FALSE;
0N/A#endif /* !HEADLESS */
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_awt_UNIXToolkit
0N/A * Method: nativeSync
0N/A * Signature: ()V
0N/A */
0N/AJNIEXPORT void JNICALL
0N/AJava_sun_awt_UNIXToolkit_nativeSync(JNIEnv *env, jobject this)
0N/A{
0N/A#ifndef HEADLESS
0N/A AWT_LOCK();
0N/A XSync(awt_display, False);
0N/A AWT_UNLOCK();
0N/A#endif /* !HEADLESS */
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_awt_SunToolkit
0N/A * Method: closeSplashScreen
0N/A * Signature: ()V
0N/A */
0N/AJNIEXPORT void JNICALL
0N/AJava_sun_awt_SunToolkit_closeSplashScreen(JNIEnv *env, jclass cls)
0N/A{
0N/A typedef void (*SplashClose_t)();
0N/A SplashClose_t splashClose;
0N/A void* hSplashLib = dlopen(0, RTLD_LAZY);
0N/A if (!hSplashLib) {
0N/A return;
0N/A }
0N/A splashClose = (SplashClose_t)dlsym(hSplashLib,
0N/A "SplashClose");
0N/A if (splashClose) {
0N/A splashClose();
0N/A }
0N/A dlclose(hSplashLib);
0N/A}
2328N/A
2328N/A/*
2328N/A * Class: sun_awt_UNIXToolkit
2328N/A * Method: gtkCheckVersionImpl
2328N/A * Signature: (III)Ljava/lang/String;
2328N/A */
2328N/AJNIEXPORT jboolean JNICALL
2328N/AJava_sun_awt_UNIXToolkit_gtkCheckVersionImpl(JNIEnv *env, jobject this,
2328N/A jint major, jint minor, jint micro)
2328N/A{
2328N/A char *ret;
2328N/A
2328N/A ret = fp_gtk_check_version(major, minor, micro);
2328N/A if (ret == NULL) {
2328N/A return TRUE;
2328N/A }
2328N/A
2328N/A free(ret);
2328N/A return FALSE;
2328N/A}