Path: blob/master/src/java.desktop/unix/native/libawt_xawt/awt/awt_UNIXToolkit.c
41155 views
/*1* Copyright (c) 2004, 2020, 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#ifdef HEADLESS26#error This file should not be included in headless library27#endif2829#include <stdlib.h>30#include <string.h>31#include <unistd.h>32#include <dlfcn.h>3334#include <jni.h>35#include <sizecalc.h>36#include "sun_awt_UNIXToolkit.h"3738#include "awt.h"39#include "gtk_interface.h"4041static jclass this_class = NULL;42static jmethodID icon_upcall_method = NULL;434445/*46* Class: sun_awt_UNIXToolkit47* Method: check_gtk48* Signature: (I)Z49*/50JNIEXPORT jboolean JNICALL51Java_sun_awt_UNIXToolkit_check_1gtk(JNIEnv *env, jclass klass, jint version) {52return (jboolean)gtk_check_version(version);53}545556/*57* Class: sun_awt_UNIXToolkit58* Method: load_gtk59* Signature: (I)Z60*/61JNIEXPORT jboolean JNICALL62Java_sun_awt_UNIXToolkit_load_1gtk(JNIEnv *env, jclass klass, jint version,63jboolean verbose) {64return (jboolean)gtk_load(env, version, verbose);65}666768/*69* Class: sun_awt_UNIXToolkit70* Method: unload_gtk71* Signature: ()Z72*/73JNIEXPORT jboolean JNICALL74Java_sun_awt_UNIXToolkit_unload_1gtk(JNIEnv *env, jclass klass)75{76return (jboolean)gtk->unload();77}7879jboolean init_method(JNIEnv *env, jobject this)80{81if (this_class == NULL) {82this_class = (*env)->NewGlobalRef(env,83(*env)->GetObjectClass(env, this));84icon_upcall_method = (*env)->GetMethodID(env, this_class,85"loadIconCallback", "([BIIIIIZ)V");86CHECK_NULL_RETURN(icon_upcall_method, JNI_FALSE);87}88return JNI_TRUE;89}9091/*92* Class: sun_awt_UNIXToolkit93* Method: load_gtk_icon94* Signature: (Ljava/lang/String)Z95*96* This method assumes that GTK libs are present.97*/98JNIEXPORT jboolean JNICALL99Java_sun_awt_UNIXToolkit_load_1gtk_1icon(JNIEnv *env, jobject this,100jstring filename)101{102int len;103jsize jlen;104char *filename_str = NULL;105GError **error = NULL;106107if (filename == NULL)108{109return JNI_FALSE;110}111112len = (*env)->GetStringUTFLength(env, filename);113jlen = (*env)->GetStringLength(env, filename);114filename_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,115sizeof(char), len + 1);116if (filename_str == NULL) {117JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");118return JNI_FALSE;119}120if (!init_method(env, this) ) {121free(filename_str);122return JNI_FALSE;123}124(*env)->GetStringUTFRegion(env, filename, 0, jlen, filename_str);125jboolean result = gtk->get_file_icon_data(env, filename_str, error,126icon_upcall_method, this);127128/* Release the strings we've allocated. */129free(filename_str);130131return result;132}133134/*135* Class: sun_awt_UNIXToolkit136* Method: load_stock_icon137* Signature: (ILjava/lang/String;IILjava/lang/String;)Z138*139* This method assumes that GTK libs are present.140*/141JNIEXPORT jboolean JNICALL142Java_sun_awt_UNIXToolkit_load_1stock_1icon(JNIEnv *env, jobject this,143jint widget_type, jstring stock_id, jint icon_size,144jint text_direction, jstring detail)145{146int len;147jsize jlen;148char *stock_id_str = NULL;149char *detail_str = NULL;150jboolean result = JNI_FALSE;151152if (stock_id == NULL)153{154return JNI_FALSE;155}156157len = (*env)->GetStringUTFLength(env, stock_id);158jlen = (*env)->GetStringLength(env, stock_id);159stock_id_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,160sizeof(char), len + 1);161if (stock_id_str == NULL) {162JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");163return JNI_FALSE;164}165(*env)->GetStringUTFRegion(env, stock_id, 0, jlen, stock_id_str);166167/* Detail isn't required so check for NULL. */168if (detail != NULL)169{170len = (*env)->GetStringUTFLength(env, detail);171jlen = (*env)->GetStringLength(env, detail);172detail_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,173sizeof(char), len + 1);174if (detail_str == NULL) {175free(stock_id_str);176JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");177return JNI_FALSE;178}179(*env)->GetStringUTFRegion(env, detail, 0, jlen, detail_str);180}181182if (init_method(env, this)) {183result = gtk->get_icon_data(env, widget_type, stock_id_str,184icon_size, text_direction, detail_str,185icon_upcall_method, this);186}187/* Release the strings we've allocated. */188free(stock_id_str);189free(detail_str);190191return result;192}193194/*195* Class: sun_awt_UNIXToolkit196* Method: nativeSync197* Signature: ()V198*/199JNIEXPORT void JNICALL200Java_sun_awt_UNIXToolkit_nativeSync(JNIEnv *env, jobject this)201{202AWT_LOCK();203XSync(awt_display, False);204AWT_UNLOCK();205}206207/*208* Class: sun_awt_SunToolkit209* Method: closeSplashScreen210* Signature: ()V211*/212JNIEXPORT void JNICALL213Java_sun_awt_SunToolkit_closeSplashScreen(JNIEnv *env, jclass cls)214{215typedef void (*SplashClose_t)();216SplashClose_t splashClose;217void* hSplashLib = dlopen(0, RTLD_LAZY);218if (!hSplashLib) {219return;220}221splashClose = (SplashClose_t)dlsym(hSplashLib,222"SplashClose");223if (splashClose) {224splashClose();225}226dlclose(hSplashLib);227}228229/*230* Class: sun_awt_UNIXToolkit231* Method: gtkCheckVersionImpl232* Signature: (III)Ljava/lang/String;233*/234JNIEXPORT jboolean JNICALL235Java_sun_awt_UNIXToolkit_gtkCheckVersionImpl(JNIEnv *env, jobject this,236jint major, jint minor, jint micro)237{238char *ret;239240ret = gtk->gtk_check_version(major, minor, micro);241if (ret == NULL) {242return TRUE;243}244245return FALSE;246}247248/*249* Class: sun_awt_UNIXToolkit250* Method: get_gtk_version251* Signature: ()I252*/253JNIEXPORT jint JNICALL254Java_sun_awt_UNIXToolkit_get_1gtk_1version(JNIEnv *env, jclass klass)255{256return gtk ? gtk->version : GTK_ANY;257}258259260