1 /* 2 * Copyright (c) 2011, 2014, 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 #include <com_sun_glass_ui_gtk_GtkTimer.h> 26 #include "glass_general.h" 27 28 #include <glib.h> 29 #include <gdk/gdk.h> 30 #include <stdlib.h> 31 32 static gboolean call_runnable_in_timer 33 (gpointer); 34 35 extern "C" { 36 37 /* 38 * Class: com_sun_glass_ui_gtk_GtkTimer 39 * Method: _start 40 * Signature: (Ljava/lang/Runnable;I)J 41 */ 42 JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_gtk_GtkTimer__1start 43 (JNIEnv * env, jobject obj, jobject runnable, jint period) 44 { 45 (void)obj; 46 47 RunnableContext* context = (RunnableContext*) malloc(sizeof(RunnableContext)); 48 context->runnable = env->NewGlobalRef(runnable); 49 context->flag = 0; 50 gdk_threads_add_timeout_full(G_PRIORITY_HIGH_IDLE, period, call_runnable_in_timer, context, NULL); 51 return PTR_TO_JLONG(context); 52 } 53 54 /* 55 * Class: com_sun_glass_ui_gtk_GtkTimer 56 * Method: _stop 57 * Signature: (J)V 58 */ 59 JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkTimer__1stop 60 (JNIEnv * env, jobject obj, jlong ptr) 61 { 62 (void)obj; 63 64 RunnableContext* context = (RunnableContext*) JLONG_TO_PTR(ptr); 65 context->flag = 1; 66 env->DeleteGlobalRef(context->runnable); 67 context->runnable = NULL; 68 } 69 70 } // extern "C" 71 72 73 static gboolean call_runnable_in_timer 74 (gpointer data) 75 { 76 RunnableContext* context = (RunnableContext*) data; 77 if (context->flag) { 78 free(context); 79 return FALSE; 80 } 81 else if (context->runnable) { 82 mainEnv->CallVoidMethod(context->runnable, jRunnableRun, NULL); 83 LOG_EXCEPTION(mainEnv); 84 } 85 return TRUE; 86 } 87