# HG changeset patch # User kcr # Date 1406052904 25200 # Node ID 8af594af405db839e812aee61ca5296555dc6ead # Parent 9a099138d2956f0d9ef42659023e81d5deb507d5 RT-37974: FX exits with GTK error when DISPLAY not set, should throw HeadlessException diff --git a/modules/graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java b/modules/graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java --- a/modules/graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java +++ b/modules/graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java @@ -61,6 +61,11 @@ private final InvokeLaterDispatcher invokeLaterDispatcher; GtkApplication() { + // Check whether the Display is valid and throw an exception if not + if (!isDisplayValid()) { + throw new RuntimeException("Unable to open DISPLAY"); + } + boolean isEventThread = AccessController .doPrivileged((PrivilegedAction) () -> Boolean.getBoolean("javafx.embed.isEventThread")); if (!isEventThread) { @@ -71,6 +76,10 @@ } } + private static boolean isDisplayValid() { + return _isDisplayValid(); + } + private void initDisplay() { Map ds = getDeviceDetails(); if (ds != null) { @@ -109,7 +118,7 @@ protected void runLoop(final Runnable launchable) { final boolean isEventThread = AccessController .doPrivileged((PrivilegedAction) () -> Boolean.getBoolean("javafx.embed.isEventThread")); - + if (isEventThread) { init(); setEventThread(Thread.currentThread()); @@ -119,7 +128,7 @@ final boolean noErrorTrap = AccessController .doPrivileged((PrivilegedAction) () -> Boolean.getBoolean("glass.noErrorTrap")); - + final Thread toolkitThread = AccessController.doPrivileged((PrivilegedAction) () -> new Thread(() -> { init(); @@ -143,6 +152,8 @@ return true; } + private static native boolean _isDisplayValid(); + private native void _terminateLoop(); private native void _init(long eventProc, boolean disableGrab); diff --git a/modules/graphics/src/main/native-glass/gtk/GlassApplication.cpp b/modules/graphics/src/main/native-glass/gtk/GlassApplication.cpp --- a/modules/graphics/src/main/native-glass/gtk/GlassApplication.cpp +++ b/modules/graphics/src/main/native-glass/gtk/GlassApplication.cpp @@ -67,6 +67,17 @@ /* * Class: com_sun_glass_ui_gtk_GtkApplication + * Method: _isDisplayValid + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_com_sun_glass_ui_gtk_GtkApplication__1isDisplayValid + (JNIEnv * env, jclass clazz) +{ + return is_display_valid(); +} + +/* + * Class: com_sun_glass_ui_gtk_GtkApplication * Method: _init * Signature: ()V */ diff --git a/modules/graphics/src/main/native-glass/gtk/glass_general.cpp b/modules/graphics/src/main/native-glass/gtk/glass_general.cpp --- a/modules/graphics/src/main/native-glass/gtk/glass_general.cpp +++ b/modules/graphics/src/main/native-glass/gtk/glass_general.cpp @@ -118,11 +118,29 @@ gdk_threads_init(); } +static jboolean displayValid = JNI_FALSE; + +jboolean +is_display_valid() { + return displayValid; +} + JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { JNIEnv *env; jclass clazz; + Display* display; + + display = XOpenDisplay(NULL); + if (display != NULL) { + XCloseDisplay(display); + displayValid = JNI_TRUE; + } +// else { +// // TODO: we should be able to just return JNI_ERR but that causes a +// // subsequent GTK error (maybe due to some cleanup function running) +// } if (jvm->GetEnv((void **)&env, JNI_VERSION_1_6)) { return JNI_ERR; /* JNI version not supported */ @@ -328,17 +346,23 @@ env->CallStaticVoidMethod(clazz, mid_lock); if (!env->CallStaticBooleanMethod(clazz, mid_getAndSetInitializationNeededFlag)) { - init_threads(); + if (displayValid) { + init_threads(); + } } env->CallStaticVoidMethod(clazz, mid_unlock); } else { env->ExceptionClear(); - init_threads(); + if (displayValid) { + init_threads(); + } } - gdk_threads_enter(); - gtk_init(NULL, NULL); + if (displayValid) { + gdk_threads_enter(); + gtk_init(NULL, NULL); + } return JNI_VERSION_1_6; } diff --git a/modules/graphics/src/main/native-glass/gtk/glass_general.h b/modules/graphics/src/main/native-glass/gtk/glass_general.h --- a/modules/graphics/src/main/native-glass/gtk/glass_general.h +++ b/modules/graphics/src/main/native-glass/gtk/glass_general.h @@ -241,6 +241,8 @@ gboolean check_and_clear_exception(JNIEnv *env); + jboolean is_display_valid(); + gsize get_files_count(gchar **uris); jobject uris_to_java(JNIEnv *env, gchar **uris, gboolean files);