Added a hint SDL_HINT_TOUCH_MOUSE_EVENTS to control whether touch events generate synthetic mouse events.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index a10785d..352029e 100644
--- a/include/SDL_hints.h
+++ b/include/SDL_hints.h
@@ -276,6 +276,17 @@ extern "C" {
#define SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH "SDL_MOUSE_FOCUS_CLICKTHROUGH"
/**
+ * \brief A variable controlling whether touch events should generate synthetic mouse events
+ *
+ * This variable can be set to the following values:
+ * "0" - Touch events will not generate mouse events
+ * "1" - Touch events will generate mouse events
+ *
+ * By default SDL will generate mouse events for touch events
+ */
+#define SDL_HINT_TOUCH_MOUSE_EVENTS "SDL_TOUCH_MOUSE_EVENTS"
+
+/**
* \brief Minimize your SDL_Window if it loses key focus when in fullscreen mode. Defaults to true.
*
*/
diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c
index 220d040..3b9d184 100644
--- a/src/events/SDL_mouse.c
+++ b/src/events/SDL_mouse.c
@@ -64,6 +64,18 @@ SDL_MouseRelativeSpeedScaleChanged(void *userdata, const char *name, const char
}
}
+static void
+SDL_TouchMouseEventsChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
+{
+ SDL_Mouse *mouse = (SDL_Mouse *)userdata;
+
+ if (hint && (*hint == '0' || SDL_strcasecmp(hint, "false") == 0)) {
+ mouse->touch_mouse_events = SDL_FALSE;
+ } else {
+ mouse->touch_mouse_events = SDL_TRUE;
+ }
+}
+
/* Public functions */
int
SDL_MouseInit(void)
@@ -76,6 +88,9 @@ SDL_MouseInit(void)
SDL_AddHintCallback(SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE,
SDL_MouseRelativeSpeedScaleChanged, mouse);
+ SDL_AddHintCallback(SDL_HINT_TOUCH_MOUSE_EVENTS,
+ SDL_TouchMouseEventsChanged, mouse);
+
mouse->cursor_shown = SDL_TRUE;
return (0);
@@ -252,6 +267,10 @@ SDL_PrivateSendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relativ
int xrel;
int yrel;
+ if (mouseID == SDL_TOUCH_MOUSEID && !mouse->touch_mouse_events) {
+ return 0;
+ }
+
if (mouse->relative_mode_warp) {
int center_x = 0, center_y = 0;
SDL_GetWindowSize(window, ¢er_x, ¢er_y);
@@ -384,6 +403,10 @@ SDL_PrivateSendMouseButton(SDL_Window * window, SDL_MouseID mouseID, Uint8 state
Uint32 type;
Uint32 buttonstate = mouse->buttonstate;
+ if (mouseID == SDL_TOUCH_MOUSEID && !mouse->touch_mouse_events) {
+ return 0;
+ }
+
/* Figure out which event to perform */
switch (state) {
case SDL_PRESSED:
diff --git a/src/events/SDL_mouse_c.h b/src/events/SDL_mouse_c.h
index cdea0cf..947fbec 100644
--- a/src/events/SDL_mouse_c.h
+++ b/src/events/SDL_mouse_c.h
@@ -87,6 +87,7 @@ typedef struct
float relative_speed_scale;
float scale_accum_x;
float scale_accum_y;
+ SDL_bool touch_mouse_events;
/* Data for double-click tracking */
int num_clickstates;