1 /* 2 * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #ifdef HEADLESS 27 #error This file should not be included in headless library 28 #endif 29 30 #include "jni_util.h" 31 #include "gtk_interface.h" 32 #include "gnome_interface.h" 33 34 static gboolean gtk_has_been_loaded = FALSE; 35 static gboolean gnome_has_been_loaded = FALSE; 36 37 /* 38 * Class: sun_awt_X11_XDesktopPeer 39 * Method: init 40 * Signature: ()Z 41 */ 42 JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XDesktopPeer_init 43 (JNIEnv *env, jclass cls, jint version, jboolean verbose) 44 { 45 46 if (gtk_has_been_loaded || gnome_has_been_loaded) { 47 return JNI_TRUE; 48 } 49 50 if (gtk_load(env, version, verbose) && gtk->show_uri_load(env)) { 51 gtk_has_been_loaded = TRUE; 52 return JNI_TRUE; 53 } else if (gnome_load()) { 54 gnome_has_been_loaded = TRUE; 55 return JNI_TRUE; 56 } 57 58 return JNI_FALSE; 59 } 60 61 /* 62 * Class: sun_awt_X11_XDesktopPeer 63 * Method: gnome_url_show 64 * Signature: (Ljava/lang/[B;)Z 65 */ 66 JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XDesktopPeer_gnome_1url_1show 67 (JNIEnv *env, jobject obj, jbyteArray url_j) 68 { 69 gboolean success = FALSE; 70 const gchar* url_c; 71 72 url_c = (char*)(*env)->GetByteArrayElements(env, url_j, NULL); 73 if (url_c == NULL) { 74 if (!(*env)->ExceptionCheck(env)) { 75 JNU_ThrowOutOfMemoryError(env, 0); 76 } 77 return JNI_FALSE; 78 } 79 80 if (gtk_has_been_loaded) { 81 gtk->gdk_threads_enter(); 82 success = gtk->gtk_show_uri(NULL, url_c, GDK_CURRENT_TIME, NULL); 83 gtk->gdk_threads_leave(); 84 } else if (gnome_has_been_loaded) { 85 success = (*gnome_url_show)(url_c, NULL); 86 } 87 88 (*env)->ReleaseByteArrayElements(env, url_j, (signed char*)url_c, 0); 89 90 return success ? JNI_TRUE : JNI_FALSE; 91 }