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