changeset 2620:dcd71b04cc46

Android: Add internal event constants for more clarity about what code does. Several platforms which do not use integer messages for events have our own internal system implemented, adding enum constants for each internal message.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sun, 25 Jul 2021 23:35:02 +0000
parents 4d5467e57115
children e63c1373c010
files android/DWindows.kt android/dw.cpp dw.h
diffstat 3 files changed, 121 insertions(+), 67 deletions(-) [+]
line wrap: on
line diff
--- a/android/DWindows.kt	Fri Jul 23 21:02:36 2021 +0000
+++ b/android/DWindows.kt	Sun Jul 25 23:35:02 2021 +0000
@@ -55,6 +55,28 @@
 import java.util.*
 import java.util.concurrent.locks.ReentrantLock
 
+object DWEvent {
+    const val TIMER = 0
+    const val CONFIGURE = 1
+    const val KEY_PRESS = 2
+    const val BUTTON_PRESS = 3
+    const val BUTTON_RELEASE = 4
+    const val MOTION_NOTIFY = 5
+    const val DELETE = 6
+    const val EXPOSE = 7
+    const val CLICKED = 8
+    const val ITEM_ENTER = 9
+    const val ITEM_CONTEXT = 10
+    const val LIST_SELECT = 11
+    const val ITEM_SELECT = 12
+    const val SET_FOCUS = 13
+    const val VALUE_CHANGED = 14
+    const val SWITCH_PAGE = 15
+    const val TREE_EXPAND = 16
+    const val COLUMN_CLICK = 17
+    const val HTML_RESULT = 18
+    const val HTML_CHANGED = 19
+}
 
 class DWTabViewPagerAdapter : RecyclerView.Adapter<DWTabViewPagerAdapter.DWEventViewHolder>() {
     val viewList = mutableListOf<LinearLayout>()
@@ -84,12 +106,12 @@
     }
     override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
         // Handle the DW_HTML_CHANGE_STARTED event
-        eventHandlerHTMLChanged(view, 19, url, 1)
+        eventHandlerHTMLChanged(view, DWEvent.HTML_CHANGED, url, 1)
     }
 
     override fun onPageFinished(view: WebView, url: String) {
         // Handle the DW_HTML_CHANGE_COMPLETE event
-        eventHandlerHTMLChanged(view, 19, url, 4)
+        eventHandlerHTMLChanged(view, DWEvent.HTML_CHANGED, url, 4)
     }
 
     external fun eventHandlerHTMLChanged(obj1: View, message: Int, URI: String, status: Int)
@@ -127,7 +149,7 @@
                     value = minimum
                 }
                 setText(value.toString())
-                eventHandlerInt(14, value.toInt(), 0, 0, 0)
+                eventHandlerInt(DWEvent.VALUE_CHANGED, value.toInt(), 0, 0, 0)
                 return true
             } else if (event.x <= v.compoundDrawables[DRAWABLE_LEFT].bounds.width()) {
                 val newvalue = this.text.toString().toLongOrNull()
@@ -144,7 +166,7 @@
                     value = minimum
                 }
                 setText(value.toString())
-                eventHandlerInt(14, value.toInt(), 0, 0, 0)
+                eventHandlerInt(DWEvent.VALUE_CHANGED, value.toInt(), 0, 0, 0)
                 return true
             }
         }
@@ -185,7 +207,7 @@
         selected = position
         setText(item)
         lpw!!.dismiss()
-        eventHandlerInt(11, position, 0, 0, 0)
+        eventHandlerInt(DWEvent.LIST_SELECT, position, 0, 0, 0)
     }
 
     override fun onTouch(v: View, event: MotionEvent): Boolean {
@@ -227,7 +249,7 @@
 
     override fun onItemClick(parent: AdapterView<*>?, view: View, position: Int, id: Long) {
         selected = position
-        eventHandlerInt(11, position, 0, 0, 0)
+        eventHandlerInt(DWEvent.LIST_SELECT, position, 0, 0, 0)
     }
 
     external fun eventHandlerInt(
@@ -250,14 +272,14 @@
     override fun onSizeChanged(width: Int, height: Int, oldWidth: Int, oldHeight: Int) {
         super.onSizeChanged(width, height, oldWidth, oldHeight)
         // Send DW_SIGNAL_CONFIGURE
-        eventHandlerInt(1, width, height, 0, 0)
+        eventHandlerInt(DWEvent.CONFIGURE, width, height, 0, 0)
     }
 
     override fun onDraw(canvas: Canvas) {
         super.onDraw(canvas)
         cachedCanvas = canvas
         // Send DW_SIGNAL_EXPOSE
-        eventHandlerInt(7, 0, 0, this.width, this.height)
+        eventHandlerInt(DWEvent.EXPOSE, 0, 0, this.width, this.height)
         cachedCanvas = null
     }
 
@@ -448,7 +470,7 @@
                         menuitem.menuitem!!.isChecked = menuitem.checked
                         menuitem.menuitem!!.isEnabled = menuitem.enabled
                         menuitem.menuitem!!.setOnMenuItemClickListener { item: MenuItem? ->
-                            eventHandlerSimple(menuitem, 8)
+                            eventHandlerSimple(menuitem, DWEvent.CLICKED)
                             true
                         }
                     }
@@ -807,7 +829,7 @@
             val width: Int = windowLayout!!.width
             val height: Int = windowLayout!!.height
 
-            eventHandlerInt(windowLayout as View, 1, width, height, 0, 0)
+            eventHandlerInt(windowLayout as View, DWEvent.CONFIGURE, width, height, 0, 0)
         }
     }
 
@@ -1426,7 +1448,7 @@
             button!!.id = cid
             button!!.setOnClickListener {
                 lastClickView = button!!
-                eventHandlerSimple(button!!, 8)
+                eventHandlerSimple(button!!, DWEvent.CLICKED)
             }
         }
         return button
@@ -1443,7 +1465,7 @@
             button!!.setImageResource(resid)
             button!!.setOnClickListener {
                 lastClickView = button!!
-                eventHandlerSimple(button!!, 8)
+                eventHandlerSimple(button!!, DWEvent.CLICKED)
             }
         }
         return button
@@ -1460,7 +1482,7 @@
             button!!.id = cid
             button!!.setOnClickListener {
                 lastClickView = button!!
-                eventHandlerSimple(button!!, 8)
+                eventHandlerSimple(button!!, DWEvent.CLICKED)
             }
 
             for (ext in exts) {
@@ -1491,7 +1513,7 @@
             button!!.id = cid
             button!!.setOnClickListener {
                 lastClickView = button!!
-                eventHandlerSimple(button!!, 8)
+                eventHandlerSimple(button!!, DWEvent.CLICKED)
             }
             button!!.setImageBitmap(b)
         }
@@ -1534,7 +1556,7 @@
             radiobutton!!.text = text
             radiobutton!!.setOnClickListener {
                 lastClickView = radiobutton!!
-                eventHandlerSimple(radiobutton!!, 8)
+                eventHandlerSimple(radiobutton!!, DWEvent.CLICKED)
             }
         }
         return radiobutton
@@ -1552,7 +1574,7 @@
             checkbox!!.text = text
             checkbox!!.setOnClickListener {
                 lastClickView = checkbox!!
-                eventHandlerSimple(checkbox!!, 8)
+                eventHandlerSimple(checkbox!!, DWEvent.CLICKED)
             }
         }
         return checkbox
@@ -1752,7 +1774,7 @@
                     val adapter = pager.adapter as DWTabViewPagerAdapter
 
                     pager.currentItem = tab.position
-                    eventHandlerNotebook(notebook!!, 15, adapter.pageList[tab.position])
+                    eventHandlerNotebook(notebook!!, DWEvent.SWITCH_PAGE, adapter.pageList[tab.position])
                 }
 
                 override fun onTabUnselected(tab: TabLayout.Tab) {}
@@ -1971,7 +1993,7 @@
                 }
 
                 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
-                    eventHandlerInt(slider as View, 14, slider!!.progress, 0, 0, 0)
+                    eventHandlerInt(slider as View, DWEvent.VALUE_CHANGED, slider!!.progress, 0, 0, 0)
                 }
             })
         }
@@ -2054,7 +2076,7 @@
         waitOnUiThread {
             html.evaluateJavascript(javascript) { value ->
                 // Execute onReceiveValue's code
-                eventHandlerHTMLResult(html, 18, value, data)
+                eventHandlerHTMLResult(html, DWEvent.HTML_RESULT, value, data)
             }
         }
     }
@@ -2173,10 +2195,10 @@
                 if(cont!!.choiceMode != ListView.CHOICE_MODE_MULTIPLE ||
                     (position == adapter.lastClickRow &&
                     (now - adapter.lastClick) < ViewConfiguration.getDoubleTapTimeout())) {
-                    eventHandlerContainer(cont!!, 9, title, 0, 0, data)
+                    eventHandlerContainer(cont!!, DWEvent.ITEM_ENTER, title, 0, 0, data)
                 } else {
                     // If we are mutiple select, generate a SELECT event
-                    eventHandlerContainer(cont!!, 12, title, 0, 0, data)
+                    eventHandlerContainer(cont!!, DWEvent.ITEM_SELECT, title, 0, 0, data)
                 }
                 adapter.lastClick = now
                 adapter.lastClickRow = position
@@ -2187,7 +2209,7 @@
                     val data = adapter.model.getRowData(adapter.selectedItem)
 
                     lastClickView = cont!!
-                    eventHandlerContainer(cont!!, 10, title, 0, 0, data)
+                    eventHandlerContainer(cont!!, DWEvent.ITEM_CONTEXT, title, 0, 0, data)
                 }
                 true
             }
@@ -2196,7 +2218,7 @@
                 val data = adapter.model.getRowData(position)
 
                 lastClickView = cont!!
-                eventHandlerContainer(cont!!, 10, title, 0, 0, data)
+                eventHandlerContainer(cont!!, DWEvent.ITEM_CONTEXT, title, 0, 0, data)
                 true
             }
         }
@@ -2920,13 +2942,13 @@
                             render!!.evx = event.x
                             render!!.evy = event.y
                             lastClickView = render!!
-                            eventHandlerInt(render!!, 4, event.x.toInt(), event.y.toInt(), render!!.button, 0)
+                            eventHandlerInt(render!!, DWEvent.BUTTON_RELEASE, event.x.toInt(), event.y.toInt(), render!!.button, 0)
                         }
                         MotionEvent.ACTION_MOVE -> {
                             render!!.evx = event.x
                             render!!.evy = event.y
                             lastClickView = render!!
-                            eventHandlerInt(render!!, 5, event.x.toInt(), event.y.toInt(), 1, 0)
+                            eventHandlerInt(render!!, DWEvent.MOTION_NOTIFY, event.x.toInt(), event.y.toInt(), 1, 0)
                         }
                     }
                     return false
@@ -2936,18 +2958,18 @@
                 // Long click functions as button 2
                 render!!.button = 2
                 lastClickView = render!!
-                eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 2, 0)
+                eventHandlerInt(render!!, DWEvent.BUTTON_PRESS, render!!.evx.toInt(), render!!.evy.toInt(), 2, 0)
                 true
             }
             render!!.setOnClickListener{
                 // Normal click functions as button 1
                 render!!.button = 1
                 lastClickView = render!!
-                eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 1, 0)
+                eventHandlerInt(render!!, DWEvent.BUTTON_PRESS, render!!.evx.toInt(), render!!.evy.toInt(), 1, 0)
             }
             render!!.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->
                 if (event.action == KeyEvent.ACTION_DOWN) {
-                    eventHandlerKey(render!!, 2, keyCode, event.unicodeChar, event.modifiers, event.characters)
+                    eventHandlerKey(render!!, DWEvent.KEY_PRESS, keyCode, event.unicodeChar, event.modifiers, event.characters)
                 }
                 false
             })
--- a/android/dw.cpp	Fri Jul 23 21:02:36 2021 +0000
+++ b/android/dw.cpp	Sun Jul 25 23:35:02 2021 +0000
@@ -241,25 +241,25 @@
 #define SIGNALMAX 19
 
 static DWSignalList DWSignalTranslate[SIGNALMAX] = {
-        { 1,    DW_SIGNAL_CONFIGURE },
-        { 2,    DW_SIGNAL_KEY_PRESS },
-        { 3,    DW_SIGNAL_BUTTON_PRESS },
-        { 4,    DW_SIGNAL_BUTTON_RELEASE },
-        { 5,    DW_SIGNAL_MOTION_NOTIFY },
-        { 6,    DW_SIGNAL_DELETE },
-        { 7,    DW_SIGNAL_EXPOSE },
-        { 8,    DW_SIGNAL_CLICKED },
-        { 9,    DW_SIGNAL_ITEM_ENTER },
-        { 10,   DW_SIGNAL_ITEM_CONTEXT },
-        { 11,   DW_SIGNAL_LIST_SELECT },
-        { 12,   DW_SIGNAL_ITEM_SELECT },
-        { 13,   DW_SIGNAL_SET_FOCUS },
-        { 14,   DW_SIGNAL_VALUE_CHANGED },
-        { 15,   DW_SIGNAL_SWITCH_PAGE },
-        { 16,   DW_SIGNAL_TREE_EXPAND },
-        { 17,   DW_SIGNAL_COLUMN_CLICK },
-        { 18,   DW_SIGNAL_HTML_RESULT },
-        { 19,   DW_SIGNAL_HTML_CHANGED }
+        { _DW_EVENT_CONFIGURE,      DW_SIGNAL_CONFIGURE },
+        { _DW_EVENT_KEY_PRESS,      DW_SIGNAL_KEY_PRESS },
+        { _DW_EVENT_BUTTON_PRESS,   DW_SIGNAL_BUTTON_PRESS },
+        { _DW_EVENT_BUTTON_RELEASE, DW_SIGNAL_BUTTON_RELEASE },
+        { _DW_EVENT_MOTION_NOTIFY,  DW_SIGNAL_MOTION_NOTIFY },
+        { _DW_EVENT_DELETE,         DW_SIGNAL_DELETE },
+        { _DW_EVENT_EXPOSE,         DW_SIGNAL_EXPOSE },
+        { _DW_EVENT_CLICKED,        DW_SIGNAL_CLICKED },
+        { _DW_EVENT_ITEM_ENTER,     DW_SIGNAL_ITEM_ENTER },
+        { _DW_EVENT_ITEM_CONTEXT,   DW_SIGNAL_ITEM_CONTEXT },
+        { _DW_EVENT_LIST_SELECT,    DW_SIGNAL_LIST_SELECT },
+        { _DW_EVENT_ITEM_SELECT,    DW_SIGNAL_ITEM_SELECT },
+        { _DW_EVENT_SET_FOCUS,      DW_SIGNAL_SET_FOCUS },
+        { _DW_EVENT_VALUE_CHANGED,  DW_SIGNAL_VALUE_CHANGED },
+        { _DW_EVENT_SWITCH_PAGE,    DW_SIGNAL_SWITCH_PAGE },
+        { _DW_EVENT_TREE_EXPAND,    DW_SIGNAL_TREE_EXPAND },
+        { _DW_EVENT_COLUMN_CLICK,   DW_SIGNAL_COLUMN_CLICK },
+        { _DW_EVENT_HTML_RESULT,    DW_SIGNAL_HTML_RESULT },
+        { _DW_EVENT_HTML_CHANGED,   DW_SIGNAL_HTML_CHANGED }
 };
 
 #define _DW_EVENT_PARAM_SIZE 10
@@ -275,7 +275,7 @@
         switch(message)
         {
             /* Timer event */
-            case 0:
+            case _DW_EVENT_TIMER:
             {
                 int (*timerfunc)(void *) = (int (* API)(void *))handler->signalfunction;
 
@@ -285,7 +285,7 @@
                 break;
             }
                 /* Configure/Resize event */
-            case 1:
+            case _DW_EVENT_CONFIGURE:
             {
                 int (*sizefunc)(HWND, int, int, void *) = (int (* API)(HWND, int, int, void *))handler->signalfunction;
                 int width = DW_POINTER_TO_INT(params[3]);
@@ -297,7 +297,7 @@
                     retval = 0;
                 break;
             }
-            case 2:
+            case _DW_EVENT_KEY_PRESS:
             {
                 int (*keypressfunc)(HWND, char, int, int, void *, char *) = (int (* API)(HWND, char, int, int, void *, char *))handler->signalfunction;
                 char *utf8 = (char *)params[1], ch = (char)DW_POINTER_TO_INT(params[3]);
@@ -307,8 +307,8 @@
                 break;
             }
                 /* Button press and release event */
-            case 3:
-            case 4:
+            case _DW_EVENT_BUTTON_PRESS:
+            case _DW_EVENT_BUTTON_RELEASE:
             {
                 int (* API buttonfunc)(HWND, int, int, int, void *) = (int (* API)(HWND, int, int, int, void *))handler->signalfunction;
                 int button = params[5] ? DW_POINTER_TO_INT(params[5]) : 1;
@@ -317,7 +317,7 @@
                 break;
             }
             /* Motion notify event */
-            case 5:
+            case _DW_EVENT_MOTION_NOTIFY:
             {
                 int (* API motionfunc)(HWND, int, int, int, void *) = (int (* API)(HWND, int, int, int, void *))handler->signalfunction;
 
@@ -325,14 +325,14 @@
                 break;
             }
             /* Window close event */
-            case 6:
+            case _DW_EVENT_DELETE:
             {
                 int (* API closefunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction;
                 retval = closefunc(handler->window, handler->data);
                 break;
             }
             /* Window expose/draw event */
-            case 7:
+            case _DW_EVENT_EXPOSE:
             {
                 DWExpose exp;
                 int (* API exposefunc)(HWND, DWExpose *, void *) = (int (* API)(HWND, DWExpose *, void *))handler->signalfunction;
@@ -348,7 +348,7 @@
                 return retval;
             }
                 /* Clicked event for buttons and menu items */
-            case 8:
+            case _DW_EVENT_CLICKED:
             {
                 int (* API clickfunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction;
 
@@ -356,7 +356,7 @@
                 break;
             }
                 /* Container class selection event */
-            case 9:
+            case _DW_EVENT_ITEM_ENTER:
             {
                 int (*containerselectfunc)(HWND, char *, void *, void *) =(int (* API)(HWND, char *, void *, void *)) handler->signalfunction;
 
@@ -364,7 +364,7 @@
                 break;
             }
                 /* Container context menu event */
-            case 10:
+            case _DW_EVENT_ITEM_CONTEXT:
             {
                 int (* API containercontextfunc)(HWND, char *, int, int, void *, void *) = (int (* API)(HWND, char *, int, int, void *, void *))handler->signalfunction;
                 char *text = (char *)params[1];
@@ -376,8 +376,8 @@
                 break;
             }
                 /* Generic selection changed event for several classes */
-            case 11:
-            case 14:
+            case _DW_EVENT_LIST_SELECT:
+            case _DW_EVENT_VALUE_CHANGED:
             {
                 int (* API valuechangedfunc)(HWND, int, void *) = (int (* API)(HWND, int, void *))handler->signalfunction;
                 int selected = DW_POINTER_TO_INT(params[3]);
@@ -386,7 +386,7 @@
                 break;
             }
                 /* Tree class selection event */
-            case 12:
+            case _DW_EVENT_ITEM_SELECT:
             {
                 int (* API treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = (int (* API)(HWND, HTREEITEM, char *, void *, void *))handler->signalfunction;
                 char *text = (char *)params[1];
@@ -396,7 +396,7 @@
                 break;
             }
                 /* Set Focus event */
-            case 13:
+            case _DW_EVENT_SET_FOCUS:
             {
                 int (* API setfocusfunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction;
 
@@ -404,7 +404,7 @@
                 break;
             }
                 /* Notebook page change event */
-            case 15:
+            case _DW_EVENT_SWITCH_PAGE:
             {
                 int (* API switchpagefunc)(HWND, unsigned long, void *) = (int (* API)(HWND, unsigned long, void *))handler->signalfunction;
                 unsigned long pageID = DW_POINTER_TO_INT(params[3]);
@@ -413,7 +413,7 @@
                 break;
             }
                 /* Tree expand event */
-            case 16:
+            case _DW_EVENT_TREE_EXPAND:
             {
                 int (* API treeexpandfunc)(HWND, HTREEITEM, void *) = (int (* API)(HWND, HTREEITEM, void *))handler->signalfunction;
 
@@ -421,7 +421,7 @@
                 break;
             }
                 /* Column click event */
-            case 17:
+            case _DW_EVENT_COLUMN_CLICK:
             {
                 int (* API clickcolumnfunc)(HWND, int, void *) = (int (* API)(HWND, int, void *))handler->signalfunction;
                 int column_num = DW_POINTER_TO_INT(params[3]);
@@ -430,7 +430,7 @@
                 break;
             }
                 /* HTML result event */
-            case 18:
+            case _DW_EVENT_HTML_RESULT:
             {
                 int (* API htmlresultfunc)(HWND, int, char *, void *, void *) = (int (* API)(HWND, int, char *, void *, void *))handler->signalfunction;
                 char *result = (char *)params[1];
@@ -439,7 +439,7 @@
                 break;
             }
                 /* HTML changed event */
-            case 19:
+            case _DW_EVENT_HTML_CHANGED:
             {
                 int (* API htmlchangedfunc)(HWND, int, char *, void *) = (int (* API)(HWND, int, char *, void *))handler->signalfunction;
                 char *uri = (char *)params[1];
--- a/dw.h	Fri Jul 23 21:02:36 2021 +0000
+++ b/dw.h	Sun Jul 25 23:35:02 2021 +0000
@@ -1610,6 +1610,38 @@
 #define HTIMER_TYPEDEFED 1
 #endif
 
+#if defined(__ANDROID__) || defined(__IOS__) || defined(__MAC__)
+/* On platforms which do not use integer messages: Android, iOS and Mac
+ * We create our own internal messages so it works similar to the message based 
+ * platforms: OS/2 and Windows.
+ * GTK does does not use integer messages, but already has a signal based system.
+ */
+typedef enum 
+{
+    _DW_EVENT_TIMER = 0,                /* Internal message for timers */
+    _DW_EVENT_CONFIGURE,                /* Internal message for configure (resize) */
+    _DW_EVENT_KEY_PRESS,                /* Internal message for key press */
+    _DW_EVENT_BUTTON_PRESS,             /* Internal message for button press */
+    _DW_EVENT_BUTTON_RELEASE,           /* Internal message for button release */
+    _DW_EVENT_MOTION_NOTIFY,            /* Internal message for motion notification */
+    _DW_EVENT_DELETE,                   /* Internal message for delete (object destruction) */
+    _DW_EVENT_EXPOSE,                   /* Internal message for expose (draw) */ 
+    _DW_EVENT_CLICKED,                  /* Internal message for click (touch) */
+    _DW_EVENT_ITEM_ENTER,               /* Internal message for (container) item enter (activation) */
+    _DW_EVENT_ITEM_CONTEXT,             /* Internal message for (container) item context (menu) */
+    _DW_EVENT_LIST_SELECT,              /* Internal message for list(box) selection */
+    _DW_EVENT_ITEM_SELECT,              /* Internal message for (container) item selection */
+    _DW_EVENT_SET_FOCUS,                /* Internal message for (widget) setting focus */
+    _DW_EVENT_VALUE_CHANGED,            /* Internal message for (widget) value changed */
+    _DW_EVENT_SWITCH_PAGE,              /* Internal message for (notebook) page changed */
+    _DW_EVENT_TREE_EXPAND,              /* Internal message for tree (node) expanded */
+    _DW_EVENT_COLUMN_CLICK,             /* Internal message for (container) column clicked */
+    _DW_EVENT_HTML_RESULT,              /* Internal message for HTML javascript result */
+    _DW_EVENT_HTML_CHANGED,             /* Internal message for HTML status changed */
+    _DW_EVENT_MAX
+} _DW_EVENTS;
+#endif
+
 /* Some dark mode constants for supported platforms */
 #define DW_DARK_MODE_DISABLED 0
 #define DW_DARK_MODE_BASIC    1