58 JNIEnv *env; 59 int envStatus = javaVM->GetEnv((void **)&env, JNI_VERSION_1_6); 60 if (envStatus == JNI_EDETACHED) { 61 javaVM->AttachCurrentThread((void **)&env, NULL); 62 } 63 64 env->CallVoidMethod(context->runnable, jRunnableRun, NULL); 65 LOG_EXCEPTION(env); 66 env->DeleteGlobalRef(context->runnable); 67 free(context); 68 69 if (envStatus == JNI_EDETACHED) { 70 javaVM->DetachCurrentThread(); 71 } 72 73 return FALSE; 74 } 75 76 extern "C" { 77 78 /* 79 * Class: com_sun_glass_ui_gtk_GtkApplication 80 * Method: _isDisplayValid 81 * Signature: ()Z 82 */ 83 JNIEXPORT jboolean JNICALL Java_com_sun_glass_ui_gtk_GtkApplication__1isDisplayValid 84 (JNIEnv * env, jclass clazz) 85 { 86 (void)env; 87 (void)clazz; 88 89 return is_display_valid(); 90 } 91 92 #pragma GCC diagnostic push 93 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 94 static void init_threads() { 95 gboolean is_g_thread_get_initialized = FALSE; 96 if (glib_check_version(2, 32, 0)) { // < 2.32 97 if (!glib_check_version(2, 20, 0)) { 98 is_g_thread_get_initialized = g_thread_get_initialized(); 99 } 100 if (!is_g_thread_get_initialized) { 101 g_thread_init(NULL); 102 } 103 } 104 gdk_threads_init(); 105 } 106 #pragma GCC diagnostic pop 107 108 109 /* 110 * Class: com_sun_glass_ui_gtk_GtkApplication 111 * Method: _initGTK 112 * Signature: (IZ)I 113 */ 114 JNIEXPORT jint JNICALL Java_com_sun_glass_ui_gtk_GtkApplication__1initGTK 115 (JNIEnv *env, jclass clazz, jint version, jboolean verbose, jfloat uiScale) 116 { 117 (void) clazz; 118 119 OverrideUIScale = uiScale; 120 121 int ret = wrapper_load_symbols(version, verbose); 122 123 if (ret == -1) { 124 return -1; 125 } 126 127 env->ExceptionClear(); 128 init_threads(); 129 130 gdk_threads_enter(); 131 gtk_init(NULL, NULL); 132 133 return ret; 134 } 135 136 /* 137 * Class: com_sun_glass_ui_gtk_GtkApplication 138 * Method: _init 139 * Signature: ()V 140 */ 141 JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkApplication__1init 142 (JNIEnv * env, jobject obj, jlong handler, jboolean _disableGrab) 143 { 144 (void)obj; 145 146 mainEnv = env; 147 process_events_prev = (GdkEventFunc) handler; 148 disableGrab = (gboolean) _disableGrab; 149 150 glass_gdk_x11_display_set_window_scale(gdk_display_get_default(), 1); 151 gdk_event_handler_set(process_events, NULL, NULL); 152 153 GdkScreen *default_gdk_screen = gdk_screen_get_default(); | 58 JNIEnv *env; 59 int envStatus = javaVM->GetEnv((void **)&env, JNI_VERSION_1_6); 60 if (envStatus == JNI_EDETACHED) { 61 javaVM->AttachCurrentThread((void **)&env, NULL); 62 } 63 64 env->CallVoidMethod(context->runnable, jRunnableRun, NULL); 65 LOG_EXCEPTION(env); 66 env->DeleteGlobalRef(context->runnable); 67 free(context); 68 69 if (envStatus == JNI_EDETACHED) { 70 javaVM->DetachCurrentThread(); 71 } 72 73 return FALSE; 74 } 75 76 extern "C" { 77 78 #pragma GCC diagnostic push 79 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 80 static void init_threads() { 81 gboolean is_g_thread_get_initialized = FALSE; 82 if (glib_check_version(2, 32, 0)) { // < 2.32 83 if (!glib_check_version(2, 20, 0)) { 84 is_g_thread_get_initialized = g_thread_get_initialized(); 85 } 86 if (!is_g_thread_get_initialized) { 87 g_thread_init(NULL); 88 } 89 } 90 gdk_threads_init(); 91 } 92 #pragma GCC diagnostic pop 93 94 jboolean gtk_verbose = JNI_FALSE; 95 96 /* 97 * Class: com_sun_glass_ui_gtk_GtkApplication 98 * Method: _initGTK 99 * Signature: (IZ)I 100 */ 101 JNIEXPORT jint JNICALL Java_com_sun_glass_ui_gtk_GtkApplication__1initGTK 102 (JNIEnv *env, jclass clazz, jint version, jboolean verbose, jfloat uiScale) 103 { 104 (void) clazz; 105 (void) version; 106 107 OverrideUIScale = uiScale; 108 gtk_verbose = verbose; 109 110 env->ExceptionClear(); 111 init_threads(); 112 113 gdk_threads_enter(); 114 gtk_init(NULL, NULL); 115 116 return JNI_TRUE; 117 } 118 119 /* 120 * Class: com_sun_glass_ui_gtk_GtkApplication 121 * Method: _queryLibrary 122 * Signature: Signature: (IZ)I 123 */ 124 JNIEXPORT jint JNICALL Java_com_sun_glass_ui_gtk_GtkApplication__1queryLibrary 125 (JNIEnv *env, jclass clazz, jint suggestedVersion, jboolean verbose) 126 { 127 // If we are being called, then the launcher is 128 // not in use, and we are in the proper glass library already. 129 // This can be done by renaming the gtk versioned native 130 // libraries to be libglass.so 131 // Note: we will make no effort to complain if the suggestedVersion 132 // is out of phase. 133 134 (void)env; 135 (void)clazz; 136 (void)suggestedVersion; 137 (void)verbose; 138 139 Display *display = XOpenDisplay(NULL); 140 if (display == NULL) { 141 return com_sun_glass_ui_gtk_GtkApplication_QUERY_NO_DISPLAY; 142 } 143 XCloseDisplay(display); 144 145 return com_sun_glass_ui_gtk_GtkApplication_QUERY_USE_CURRENT; 146 } 147 148 /* 149 * Class: com_sun_glass_ui_gtk_GtkApplication 150 * Method: _init 151 * Signature: ()V 152 */ 153 JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkApplication__1init 154 (JNIEnv * env, jobject obj, jlong handler, jboolean _disableGrab) 155 { 156 (void)obj; 157 158 mainEnv = env; 159 process_events_prev = (GdkEventFunc) handler; 160 disableGrab = (gboolean) _disableGrab; 161 162 glass_gdk_x11_display_set_window_scale(gdk_display_get_default(), 1); 163 gdk_event_handler_set(process_events, NULL, NULL); 164 165 GdkScreen *default_gdk_screen = gdk_screen_get_default(); |