changeset 2584:2acc7ba5dea0

Add HTIMER type and change dw_timer_() functions to use it. On existing platforms, HTIMER will be int for now allowing API backward compatibility. On new platforms, iOS and Android, these will be pointers to the timer objects. This allows simplifying the code paths on those platforms. May change it on other platforms such as Mac in a future major version.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sun, 23 May 2021 21:39:25 +0000
parents 1d2f5c4eccc5
children d59d579dc6ec
files android/dw.cpp dw.h dwtest.c gtk/dw.c gtk3/dw.c gtk4/dw.c ios/dw.m mac/dw.m os2/dw.c template/dw.c win/dw.c
diffstat 11 files changed, 49 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/android/dw.cpp	Sun May 23 09:43:04 2021 +0000
+++ b/android/dw.cpp	Sun May 23 21:39:25 2021 +0000
@@ -280,7 +280,7 @@
                 int (*timerfunc)(void *) = (int (* API)(void *))handler->signalfunction;
 
                 if(!timerfunc(handler->data))
-                    dw_timer_disconnect(handler->id);
+                    dw_timer_disconnect(handler->window);
                 retval = 0;
                 break;
             }
@@ -5800,10 +5800,10 @@
  * Returns:
  *       Timer ID for use with dw_timer_disconnect(), 0 on error.
  */
-int API dw_timer_connect(int interval, void *sigfunc, void *data)
+HTIMER API dw_timer_connect(int interval, void *sigfunc, void *data)
 {
     JNIEnv *env;
-    int retval = 0;
+    HTIMER retval = 0;
 
     if((env = (JNIEnv *)pthread_getspecific(_dw_env_key)))
     {
@@ -5815,8 +5815,8 @@
         jmethodID timerConnect = env->GetMethodID(clazz, "timerConnect",
                                                   "(JJJ)Ljava/util/Timer;");
         // Call the method on the object
-        retval = DW_POINTER_TO_INT(_dw_jni_check_result(env, env->CallObjectMethod(_dw_obj,
-                                    timerConnect, longinterval, (jlong)sigfunc, (jlong)data), _DW_REFERENCE_STRONG));
+        retval = _dw_jni_check_result(env, env->CallObjectMethod(_dw_obj,
+                                    timerConnect, longinterval, (jlong)sigfunc, (jlong)data), _DW_REFERENCE_STRONG);
     }
     return retval;
 }
@@ -5826,21 +5826,19 @@
  * Parameters:
  *       id: Timer ID returned by dw_timer_connect().
  */
-void API dw_timer_disconnect(int timerid)
+void API dw_timer_disconnect(HTIMER timerid)
 {
     JNIEnv *env;
 
     if(timerid && (env = (JNIEnv *)pthread_getspecific(_dw_env_key)))
     {
-        // Use a long parameter
-        jobject timer = (jobject)timerid;
         // First get the class that contains the method you need to call
         jclass clazz = _dw_find_class(env, DW_CLASS_NAME);
         // Get the method that you want to call
         jmethodID timerDisconnect = env->GetMethodID(clazz, "timerDisconnect",
                                                      "(Ljava/util/Timer;)V");
         // Call the method on the object
-        env->CallVoidMethod(_dw_obj, timerDisconnect, timer);
+        env->CallVoidMethod(_dw_obj, timerDisconnect, timerid);
         _dw_jni_check_exception(env);
     }
 }
--- a/dw.h	Sun May 23 09:43:04 2021 +0000
+++ b/dw.h	Sun May 23 21:39:25 2021 +0000
@@ -358,6 +358,10 @@
 #define FALSE 0
 
 typedef void *HWND;
+#ifdef __IOS__
+typedef void *HTIMER
+#define HTIMER_TYPEDEFED 1
+#endif
 typedef void *HSHM;
 typedef unsigned long ULONG;
 typedef long LONG;
@@ -741,6 +745,8 @@
 #define FALSE 0
 
 typedef jobject HWND;
+typedef jobject HTIMER;
+#define HTIMER_TYPEDEFED 1
 
 typedef unsigned long ULONG;
 typedef long LONG;
@@ -1597,6 +1603,11 @@
 #define DW_DIR_SEPARATOR '\\'
 #endif
 
+#ifndef HTIMER_TYPEDEFED
+typedef int HTIMER;
+#define HTIMER_TYPEDEFED 1
+#endif
+
 /* Some dark mode constants for supported platforms */
 #define DW_DARK_MODE_DISABLED 0
 #define DW_DARK_MODE_BASIC    1
@@ -2128,8 +2139,8 @@
 int API dw_module_load(const char *name, HMOD *handle);
 int API dw_module_symbol(HMOD handle, const char *name, void**func);
 int API dw_module_close(HMOD handle);
-int API dw_timer_connect(int interval, void *sigfunc, void *data);
-void API dw_timer_disconnect(int id);
+HTIMER API dw_timer_connect(int interval, void *sigfunc, void *data);
+void API dw_timer_disconnect(HTIMER id);
 void API dw_signal_connect(HWND window, const char *signame, void *sigfunc, void *data);
 void API dw_signal_connect_data(HWND window, const char *signame, void *sigfunc, void *discfunc, void *data);
 void API dw_signal_disconnect_by_window(HWND window);
--- a/dwtest.c	Sun May 23 09:43:04 2021 +0000
+++ b/dwtest.c	Sun May 23 21:39:25 2021 +0000
@@ -151,7 +151,7 @@
 int font_height=12;
 int rows=10,width1=6,cols=80;
 char *current_file = NULL;
-int timerid;
+HTIMER timerid;
 int num_lines=0;
 int max_linewidth=0;
 int current_row=0,current_col=0;
--- a/gtk/dw.c	Sun May 23 09:43:04 2021 +0000
+++ b/gtk/dw.c	Sun May 23 21:39:25 2021 +0000
@@ -13545,7 +13545,7 @@
  * Returns:
  *       Timer ID for use with dw_timer_disconnect(), 0 on error.
  */
-int API dw_timer_connect(int interval, void *sigfunc, void *data)
+HTIMER API dw_timer_connect(int interval, void *sigfunc, void *data)
 {
    int tag, _locked_by_me = FALSE;
 
@@ -13560,7 +13560,7 @@
  * Parameters:
  *       id: Timer ID returned by dw_timer_connect().
  */
-void API dw_timer_disconnect(int id)
+void API dw_timer_disconnect(HTIMER id)
 {
    int _locked_by_me = FALSE;
 
--- a/gtk3/dw.c	Sun May 23 09:43:04 2021 +0000
+++ b/gtk3/dw.c	Sun May 23 21:39:25 2021 +0000
@@ -12208,7 +12208,7 @@
  * Returns:
  *       Timer ID for use with dw_timer_disconnect(), 0 on error.
  */
-int API dw_timer_connect(int interval, void *sigfunc, void *data)
+HTIMER API dw_timer_connect(int interval, void *sigfunc, void *data)
 {
    int *tag, _locked_by_me = FALSE;
    char tmpbuf[31] = {0};
@@ -12230,7 +12230,7 @@
  * Parameters:
  *       id: Timer ID returned by dw_timer_connect().
  */
-void API dw_timer_disconnect(int id)
+void API dw_timer_disconnect(HTIMER id)
 {
    int _locked_by_me = FALSE;
    char tmpbuf[31] = {0};
--- a/gtk4/dw.c	Sun May 23 09:43:04 2021 +0000
+++ b/gtk4/dw.c	Sun May 23 21:39:25 2021 +0000
@@ -10664,7 +10664,7 @@
  * Returns:
  *       Timer ID for use with dw_timer_disconnect(), 0 on error.
  */
-int API dw_timer_connect(int interval, void *sigfunc, void *data)
+HTIMER API dw_timer_connect(int interval, void *sigfunc, void *data)
 {
    int *tag;
    char tmpbuf[31] = {0};
@@ -10684,7 +10684,7 @@
  * Parameters:
  *       id: Timer ID returned by dw_timer_connect().
  */
-void API dw_timer_disconnect(int id)
+void API dw_timer_disconnect(HTIMER id)
 {
    char tmpbuf[31] = {0};
 
--- a/ios/dw.m	Sun May 23 09:43:04 2021 +0000
+++ b/ios/dw.m	Sun May 23 21:39:25 2021 +0000
@@ -9361,9 +9361,6 @@
     return FALSE;
 }
 
-#define DW_TIMER_MAX 64
-static NSTimer *DWTimers[DW_TIMER_MAX];
-
 /*
  * Add a callback to a timer event.
  * Parameters:
@@ -9373,27 +9370,19 @@
  * Returns:
  *       Timer ID for use with dw_timer_disconnect(), 0 on error.
  */
-DW_FUNCTION_DEFINITION(dw_timer_connect, int, int interval, void *sigfunc, void *data)
+DW_FUNCTION_DEFINITION(dw_timer_connect, HTIMER, int interval, void *sigfunc, void *data)
 DW_FUNCTION_ADD_PARAM3(interval, sigfunc, data)
-DW_FUNCTION_RETURN(dw_timer_connect, int)
+DW_FUNCTION_RETURN(dw_timer_connect, HTIMER)
 DW_FUNCTION_RESTORE_PARAM3(interval, int, sigfunc, void *, data, void *)
 {
-    int z, retval = 0;
-
-    for(z=0;z<DW_TIMER_MAX;z++)
-    {
-        if(!DWTimers[z])
-        {
-            break;
-        }
-    }
-
-    if(sigfunc && !DWTimers[z])
+    HTIMER retval = 0;
+
+    if(sigfunc)
     {
         NSTimeInterval seconds = (double)interval / 1000.0;
-        NSTimer *thistimer = DWTimers[z] = [NSTimer scheduledTimerWithTimeInterval:seconds target:DWHandler selector:@selector(runTimer:) userInfo:nil repeats:YES];
-        _dw_new_signal(0, thistimer, z+1, sigfunc, NULL, data);
-        retval = z+1;
+
+        retval = [NSTimer scheduledTimerWithTimeInterval:seconds target:DWHandler selector:@selector(runTimer:) userInfo:nil repeats:YES];
+        _dw_new_signal(0, retval, 0, sigfunc, NULL, data);
     }
     DW_FUNCTION_RETURN_THIS(retval);
 }
@@ -9403,25 +9392,23 @@
  * Parameters:
  *       id: Timer ID returned by dw_timer_connect().
  */
-DW_FUNCTION_DEFINITION(dw_timer_disconnect, void, int timerid)
+DW_FUNCTION_DEFINITION(dw_timer_disconnect, void, HTIMER timerid)
 DW_FUNCTION_ADD_PARAM1(timerid)
 DW_FUNCTION_NO_RETURN(dw_timer_disconnect)
-DW_FUNCTION_RESTORE_PARAM1(timerid, int)
+DW_FUNCTION_RESTORE_PARAM1(timerid, HTIMER)
 {
     SignalHandler *prev = NULL, *tmp = DWRoot;
-    NSTimer *thistimer;
 
     /* 0 is an invalid timer ID */
-    if(timerid > 0 && timerid < DW_TIMER_MAX && DWTimers[timerid-1])
-    {
-        thistimer = DWTimers[timerid-1];
-        DWTimers[timerid-1] = nil;
+    if(timerid)
+    {
+        NSTimer *thistimer = timerid;
 
         [thistimer invalidate];
 
         while(tmp)
         {
-            if(tmp->id == timerid && tmp->window == thistimer)
+            if(tmp->window == thistimer)
             {
                 if(prev)
                 {
--- a/mac/dw.m	Sun May 23 09:43:04 2021 +0000
+++ b/mac/dw.m	Sun May 23 21:39:25 2021 +0000
@@ -11518,7 +11518,7 @@
  * Returns:
  *       Timer ID for use with dw_timer_disconnect(), 0 on error.
  */
-int API dw_timer_connect(int interval, void *sigfunc, void *data)
+HTIMER API dw_timer_connect(int interval, void *sigfunc, void *data)
 {
     int z;
 
@@ -11545,7 +11545,7 @@
  * Parameters:
  *       id: Timer ID returned by dw_timer_connect().
  */
-void API dw_timer_disconnect(int timerid)
+void API dw_timer_disconnect(HTIMER timerid)
 {
     SignalHandler *prev = NULL, *tmp = DWRoot;
     NSTimer *thistimer;
--- a/os2/dw.c	Sun May 23 09:43:04 2021 +0000
+++ b/os2/dw.c	Sun May 23 21:39:25 2021 +0000
@@ -13525,7 +13525,7 @@
  * Returns:
  *       Timer ID for use with dw_timer_disconnect(), 0 on error.
  */
-int API dw_timer_connect(int interval, void *sigfunc, void *data)
+HTIMER API dw_timer_connect(int interval, void *sigfunc, void *data)
 {
    if(sigfunc)
    {
@@ -13545,7 +13545,7 @@
  * Parameters:
  *       id: Timer ID returned by dw_timer_connect().
  */
-void API dw_timer_disconnect(int id)
+void API dw_timer_disconnect(HTIMER id)
 {
    SignalHandler *prev = NULL, *tmp = Root;
 
--- a/template/dw.c	Sun May 23 09:43:04 2021 +0000
+++ b/template/dw.c	Sun May 23 21:39:25 2021 +0000
@@ -3130,7 +3130,7 @@
  * Returns:
  *       Timer ID for use with dw_timer_disconnect(), 0 on error.
  */
-int API dw_timer_connect(int interval, void *sigfunc, void *data)
+HTIMER API dw_timer_connect(int interval, void *sigfunc, void *data)
 {
     return 0;
 }
@@ -3140,7 +3140,7 @@
  * Parameters:
  *       id: Timer ID returned by dw_timer_connect().
  */
-void API dw_timer_disconnect(int timerid)
+void API dw_timer_disconnect(HTIMER timerid)
 {
 }
 
--- a/win/dw.c	Sun May 23 09:43:04 2021 +0000
+++ b/win/dw.c	Sun May 23 21:39:25 2021 +0000
@@ -13572,7 +13572,7 @@
  * Returns:
  *       Timer ID for use with dw_timer_disconnect(), 0 on error.
  */
-int API dw_timer_connect(int interval, void *sigfunc, void *data)
+HTIMER API dw_timer_connect(int interval, void *sigfunc, void *data)
 {
    if(sigfunc)
    {
@@ -13595,7 +13595,7 @@
  * Parameters:
  *       id: Timer ID returned by dw_timer_connect().
  */
-void API dw_timer_disconnect(int id)
+void API dw_timer_disconnect(HTIMER id)
 {
    SignalHandler *prev = NULL, *tmp = Root;