+ result = false;
+ return !result;
+}
+
+static Array<TouchPointerInfo> buildPointerInfo(const EmscriptenTouchEvent * event)
+{
+ uint count = event->numTouches;
+ Array<TouchPointerInfo> infos { size = count };
+ int i;
+ for(i = 0; i < count; i++)
+ {
+ infos[i].point = { event->touches[i].canvasX, event->touches[i].canvasY };
+ infos[i].id = i;
+ infos[i].pressure = 0;
+ infos[i].size = 0;
+ }
+ return infos;
+}
+
+static EM_BOOL touch_callback(int eventType, const EmscriptenTouchEvent *e, void *userData)
+{
+ Window window = guiApp.desktop;
+ Modifiers mods { };
+ const EmscriptenTouchPoint * t1 = &e->touches[0];
+ int methodID;
+
+ mods.alt = e->altKey ? true : false;
+ mods.shift = e->shiftKey ? true : false;
+ mods.ctrl = e->ctrlKey ? true : false;
+
+ mods.left = (mouseButtons & 1) ? true : false;
+
+ switch(eventType)
+ {
+ case EMSCRIPTEN_EVENT_TOUCHMOVE:
+ {
+ Array<TouchPointerInfo> infos = buildPointerInfo(e);
+ lastMouse = { t1->canvasX, t1->canvasY };
+ if(window.MultiTouchMessage(move, infos, &mods, false, true))
+ window.MouseMessage(__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnMouseMove, t1->canvasX, t1->canvasY, &mods, false, true);
+ delete infos;
+ break;
+ }
+ case EMSCRIPTEN_EVENT_TOUCHSTART:
+ {
+ bool result = true;
+ if(e->numTouches == 1)
+ {
+ static int mouseX, mouseY;
+ static Time lastTime = 0;
+ Time time = GetTime();
+ if(Abs(t1->canvasX - mouseX) < 40 && Abs(t1->canvasY - mouseY) < 40 && time - lastTime < 0.3)
+ {
+ methodID = __ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnLeftDoubleClick;
+ if(!window.MouseMessage(methodID, t1->canvasX, t1->canvasY, &mods, false, true))
+ result = false;
+ }
+ lastTime = time;
+ mouseX = t1->canvasX, mouseY = t1->canvasY;
+ if(result)
+ {
+ methodID = __ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnLeftButtonDown;
+ // result = ?
+ window.MouseMessage(methodID, t1->canvasX, t1->canvasY, &mods, false, true);
+ }
+ mouseButtons |= 1;
+ }
+ if(result)
+ {
+ Array<TouchPointerInfo> infos = buildPointerInfo(e);
+ window.MultiTouchMessage(e->numTouches == 1 ? down : pointerDown, infos, &mods, false, true);
+ delete infos;
+ }
+ break;
+ }
+ case EMSCRIPTEN_EVENT_TOUCHCANCEL:
+ case EMSCRIPTEN_EVENT_TOUCHEND:
+ methodID = __ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnLeftButtonUp;
+ if(window.MouseMessage(methodID, t1->canvasX, t1->canvasY, &mods, false, true))
+ {
+ Array<TouchPointerInfo> infos = buildPointerInfo(e);
+ window.MultiTouchMessage(e->numTouches > 1 ? pointerUp : up, infos, &mods, false, true);
+ delete infos;
+ }
+
+ // if(e->button == 0)
+ mouseButtons &= ~1;
+ break;
+ }
+ return 1;