Преглед на файлове

emscripten: send fake mouse events for touches, like other targets do.

(This really should be handled at the higher level and not in the individual
targets, but this fixes the immediate bug.)
Ryan C. Gordon преди 10 години
родител
ревизия
d05ae1941c
променени са 2 файла, в които са добавени 20 реда и са изтрити 3 реда
  1. 16 3
      src/video/emscripten/SDL_emscriptenevents.c
  2. 4 0
      src/video/emscripten/SDL_emscriptenvideo.h

+ 16 - 3
src/video/emscripten/SDL_emscriptenevents.c

@@ -391,11 +391,24 @@ Emscripten_HandleTouch(int eventType, const EmscriptenTouchEvent *touchEvent, vo
         x = touchEvent->touches[i].canvasX / (float)window_data->windowed_width;
         y = touchEvent->touches[i].canvasY / (float)window_data->windowed_height;
 
-        if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) {
-            SDL_SendTouchMotion(deviceId, id, x, y, 1.0f);
-        } else if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) {
+        if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) {
+            if (!window_data->finger_touching) {
+                window_data->finger_touching = SDL_TRUE;
+                window_data->first_finger = id;
+                SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, x, y);
+                SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT);
+            }
             SDL_SendTouch(deviceId, id, SDL_TRUE, x, y, 1.0f);
+        } else if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) {
+            if ((window_data->finger_touching) && (window_data->first_finger == id)) {
+                SDL_SendMouseMotion(window_data->window, SDL_TOUCH_MOUSEID, 0, x, y);
+            }
+            SDL_SendTouchMotion(deviceId, id, x, y, 1.0f);
         } else {
+            if ((window_data->finger_touching) && (window_data->first_finger == id)) {
+                SDL_SendMouseButton(window_data->window, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT);
+                window_data->finger_touching = SDL_FALSE;
+            }
             SDL_SendTouch(deviceId, id, SDL_FALSE, x, y, 1.0f);
         }
     }

+ 4 - 0
src/video/emscripten/SDL_emscriptenvideo.h

@@ -24,6 +24,7 @@
 #define _SDL_emscriptenvideo_h
 
 #include "../SDL_sysvideo.h"
+#include "../../events/SDL_touch_c.h"
 #include <emscripten/emscripten.h>
 #include <emscripten/html5.h>
 
@@ -45,6 +46,9 @@ typedef struct SDL_WindowData
     SDL_bool external_size;
 
     int requested_fullscreen_mode;
+
+    SDL_bool finger_touching;  /* for mapping touch events to mice */
+    SDL_FingerID first_finger;
 } SDL_WindowData;
 
 #endif /* _SDL_emscriptenvideo_h */