Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/awt/awt_UNIXToolkit.c
32287 views
/*1* Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425#include <stdlib.h>26#include <string.h>27#include <unistd.h>28#include <dlfcn.h>2930#include <jni.h>31#include <sizecalc.h>32#include "sun_awt_UNIXToolkit.h"3334#ifndef HEADLESS35#include "awt.h"36#include "gtk_interface.h"37#endif /* !HEADLESS */383940static jclass this_class = NULL;41static jmethodID icon_upcall_method = NULL;424344/*45* Class: sun_awt_UNIXToolkit46* Method: check_gtk47* Signature: (I)Z48*/49JNIEXPORT jboolean JNICALL50Java_sun_awt_UNIXToolkit_check_1gtk(JNIEnv *env, jclass klass, jint version) {51#ifndef HEADLESS52return (jboolean)gtk_check_version(version);53#else54return JNI_FALSE;55#endif /* !HEADLESS */56}575859/*60* Class: sun_awt_UNIXToolkit61* Method: load_gtk62* Signature: (I)Z63*/64JNIEXPORT jboolean JNICALL65Java_sun_awt_UNIXToolkit_load_1gtk(JNIEnv *env, jclass klass, jint version,66jboolean verbose) {67#ifndef HEADLESS68return (jboolean)gtk_load(env, version, verbose);69#else70return JNI_FALSE;71#endif /* !HEADLESS */72}737475/*76* Class: sun_awt_UNIXToolkit77* Method: unload_gtk78* Signature: ()Z79*/80JNIEXPORT jboolean JNICALL81Java_sun_awt_UNIXToolkit_unload_1gtk(JNIEnv *env, jclass klass)82{83#ifndef HEADLESS84return (jboolean)gtk->unload();85#else86return JNI_FALSE;87#endif /* !HEADLESS */88}8990jboolean init_method(JNIEnv *env, jobject this)91{92if (this_class == NULL) {93this_class = (*env)->NewGlobalRef(env,94(*env)->GetObjectClass(env, this));95icon_upcall_method = (*env)->GetMethodID(env, this_class,96"loadIconCallback", "([BIIIIIZ)V");97CHECK_NULL_RETURN(icon_upcall_method, JNI_FALSE);98}99100return JNI_TRUE;101}102103/*104* Class: sun_awt_UNIXToolkit105* Method: load_gtk_icon106* Signature: (Ljava/lang/String)Z107*108* This method assumes that GTK libs are present.109*/110JNIEXPORT jboolean JNICALL111Java_sun_awt_UNIXToolkit_load_1gtk_1icon(JNIEnv *env, jobject this,112jstring filename)113{114#ifndef HEADLESS115int len;116char *filename_str = NULL;117GError **error = NULL;118119if (filename == NULL)120{121return JNI_FALSE;122}123124len = (*env)->GetStringUTFLength(env, filename);125filename_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,126sizeof(char), len + 1);127if (filename_str == NULL) {128JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");129return JNI_FALSE;130}131if (!init_method(env, this) ) {132free(filename_str);133return JNI_FALSE;134}135(*env)->GetStringUTFRegion(env, filename, 0, len, filename_str);136jboolean result = gtk->get_file_icon_data(env, filename_str, error,137icon_upcall_method, this);138139/* Release the strings we've allocated. */140free(filename_str);141142return result;143#else /* HEADLESS */144return JNI_FALSE;145#endif /* !HEADLESS */146}147148/*149* Class: sun_awt_UNIXToolkit150* Method: load_stock_icon151* Signature: (ILjava/lang/String;IILjava/lang/String;)Z152*153* This method assumes that GTK libs are present.154*/155JNIEXPORT jboolean JNICALL156Java_sun_awt_UNIXToolkit_load_1stock_1icon(JNIEnv *env, jobject this,157jint widget_type, jstring stock_id, jint icon_size,158jint text_direction, jstring detail)159{160#ifndef HEADLESS161int len;162char *stock_id_str = NULL;163char *detail_str = NULL;164165if (stock_id == NULL)166{167return JNI_FALSE;168}169170len = (*env)->GetStringUTFLength(env, stock_id);171stock_id_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,172sizeof(char), len + 1);173if (stock_id_str == NULL) {174JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");175return JNI_FALSE;176}177(*env)->GetStringUTFRegion(env, stock_id, 0, len, stock_id_str);178179/* Detail isn't required so check for NULL. */180if (detail != NULL)181{182len = (*env)->GetStringUTFLength(env, detail);183detail_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,184sizeof(char), len + 1);185if (detail_str == NULL) {186free(stock_id_str);187JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");188return JNI_FALSE;189}190(*env)->GetStringUTFRegion(env, detail, 0, len, detail_str);191}192193if (!init_method(env, this) ) {194return JNI_FALSE;195}196jboolean result = gtk->get_icon_data(env, widget_type, stock_id_str,197icon_size, text_direction, detail_str,198icon_upcall_method, this);199200/* Release the strings we've allocated. */201free(stock_id_str);202if (detail_str != NULL)203{204free(detail_str);205}206207return result;208#else /* HEADLESS */209return JNI_FALSE;210#endif /* !HEADLESS */211}212213/*214* Class: sun_awt_UNIXToolkit215* Method: nativeSync216* Signature: ()V217*/218JNIEXPORT void JNICALL219Java_sun_awt_UNIXToolkit_nativeSync(JNIEnv *env, jobject this)220{221#ifndef HEADLESS222AWT_LOCK();223XSync(awt_display, False);224AWT_UNLOCK();225#endif /* !HEADLESS */226}227228/*229* Class: sun_awt_SunToolkit230* Method: closeSplashScreen231* Signature: ()V232*/233JNIEXPORT void JNICALL234Java_sun_awt_SunToolkit_closeSplashScreen(JNIEnv *env, jclass cls)235{236typedef void (*SplashClose_t)();237SplashClose_t splashClose;238void* hSplashLib = dlopen(0, RTLD_LAZY);239if (!hSplashLib) {240return;241}242splashClose = (SplashClose_t)dlsym(hSplashLib,243"SplashClose");244if (splashClose) {245splashClose();246}247dlclose(hSplashLib);248}249250/*251* Class: sun_awt_UNIXToolkit252* Method: gtkCheckVersionImpl253* Signature: (III)Ljava/lang/String;254*/255JNIEXPORT jboolean JNICALL256Java_sun_awt_UNIXToolkit_gtkCheckVersionImpl(JNIEnv *env, jobject this,257jint major, jint minor, jint micro)258{259char *ret;260261ret = gtk->gtk_check_version(major, minor, micro);262if (ret == NULL) {263return TRUE;264}265266return FALSE;267}268269/*270* Class: sun_awt_UNIXToolkit271* Method: get_gtk_version272* Signature: ()I273*/274JNIEXPORT jint JNICALL275Java_sun_awt_UNIXToolkit_get_1gtk_1version(JNIEnv *env, jclass klass)276{277#ifndef HEADLESS278return gtk ? gtk->version : GTK_ANY;279#else280return GTK_ANY;281#endif /* !HEADLESS */282}283284285