Bladeren bron

Added a hint SDL_HINT_TOUCH_MOUSE_EVENTS to control whether touch events generate synthetic mouse events.

Sam Lantinga 7 jaren geleden
bovenliggende
commit
56cab6d452
3 gewijzigde bestanden met toevoegingen van 35 en 0 verwijderingen
  1. 11 0
      include/SDL_hints.h
  2. 23 0
      src/events/SDL_mouse.c
  3. 1 0
      src/events/SDL_mouse_c.h

+ 11 - 0
include/SDL_hints.h

@@ -275,6 +275,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.
  *

+ 23 - 0
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, &center_x, &center_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:

+ 1 - 0
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;