added mouse wheel support also for SDL2 target
authorHolger Schemel <info@artsoft.org>
Tue, 14 Jun 2016 00:18:48 +0000 (02:18 +0200)
committerHolger Schemel <info@artsoft.org>
Tue, 14 Jun 2016 00:18:48 +0000 (02:18 +0200)
src/events.c
src/events.h
src/libgame/gadgets.c
src/libgame/sdl.h
src/libgame/system.c
src/libgame/system.h

index d1f69f993a8732fcbfa3dad61e7aa67de1ebe9d0..dcb957a5fe3600f082d86dd28f3d784b8e15a601 100644 (file)
@@ -27,6 +27,7 @@
 
 #define DEBUG_EVENTS_BUTTON    (DEBUG_EVENTS   * 0)
 #define DEBUG_EVENTS_MOTION    (DEBUG_EVENTS   * 0)
+#define DEBUG_EVENTS_WHEEL     (DEBUG_EVENTS   * 1)
 #define DEBUG_EVENTS_WINDOW    (DEBUG_EVENTS   * 0)
 #define DEBUG_EVENTS_FINGER    (DEBUG_EVENTS   * 0)
 #define DEBUG_EVENTS_TEXT      (DEBUG_EVENTS   * 1)
@@ -174,6 +175,10 @@ void HandleEvents()
        break;
 
 #if defined(TARGET_SDL2)
+      case EVENT_WHEELMOTION:
+       HandleWheelEvent((WheelEvent *) &event);
+       break;
+
       case SDL_WINDOWEVENT:
        HandleWindowEvent((WindowEvent *) &event);
        break;
@@ -434,6 +439,45 @@ void HandleMotionEvent(MotionEvent *event)
 
 #if defined(TARGET_SDL2)
 
+void HandleWheelEvent(WheelEvent *event)
+{
+  int button_nr;
+
+#if DEBUG_EVENTS_WHEEL
+#if 1
+  Error(ERR_DEBUG, "WHEEL EVENT: mouse == %d, x/y == %d/%d\n",
+       event->which, event->x, event->y);
+#else
+  // (SDL_MOUSEWHEEL_NORMAL/SDL_MOUSEWHEEL_FLIPPED needs SDL 2.0.4 or newer)
+  Error(ERR_DEBUG, "WHEEL EVENT: mouse == %d, x/y == %d/%d, direction == %s\n",
+       event->which, event->x, event->y,
+       (event->direction == SDL_MOUSEWHEEL_NORMAL ? "SDL_MOUSEWHEEL_NORMAL" :
+        "SDL_MOUSEWHEEL_FLIPPED"));
+#endif
+#endif
+
+  button_nr = (event->x < 0 ? MB_WHEEL_LEFT :
+              event->x > 0 ? MB_WHEEL_RIGHT :
+              event->y < 0 ? MB_WHEEL_DOWN :
+              event->y > 0 ? MB_WHEEL_UP : 0);
+
+#if defined(PLATFORM_WIN32) || defined(PLATFORM_MACOSX)
+  // accelerated mouse wheel available on Mac and Windows
+  wheel_steps = (event->x ? ABS(event->x) : ABS(event->y));
+#else
+  // no accelerated mouse wheel available on Unix/Linux
+  wheel_steps = DEFAULT_WHEEL_STEPS;
+#endif
+
+  motion_status = FALSE;
+
+  button_status = button_nr;
+  HandleButton(0, 0, button_status, -button_nr);
+
+  button_status = MB_RELEASED;
+  HandleButton(0, 0, button_status, -button_nr);
+}
+
 void HandleWindowEvent(WindowEvent *event)
 {
 #if DEBUG_EVENTS_WINDOW
@@ -948,11 +992,11 @@ void HandleButton(int mx, int my, int button, int button_nr)
   static int old_mx = 0, old_my = 0;
   boolean button_hold = FALSE;
 
-  if (button < 0)
+  if (button_nr < 0)
   {
     mx = old_mx;
     my = old_my;
-    button = -button;
+    button_nr = -button_nr;
     button_hold = TRUE;
   }
   else
@@ -1618,7 +1662,7 @@ void HandleNoEvent()
   // if (button_status && game_status != GAME_MODE_PLAYING)
   if (button_status && (game_status != GAME_MODE_PLAYING || tape.pausing))
   {
-    HandleButton(0, 0, -button_status, button_status);
+    HandleButton(0, 0, button_status, -button_status);
   }
   else
   {
index 664f3778b83f54b7ba3fec3a7a407c28e4811329..0768f11f42597f217f6d7e000e54b762dd15e8df 100644 (file)
@@ -32,6 +32,7 @@ void HandleExposeEvent(ExposeEvent *);
 void HandleButtonEvent(ButtonEvent *);
 void HandleMotionEvent(MotionEvent *);
 #if defined(TARGET_SDL2)
+void HandleWheelEvent(WheelEvent *);
 void HandleWindowEvent(WindowEvent *);
 void HandleFingerEvent(FingerEvent *);
 void HandleTextEvent(TextEvent *);
index 6200c9dc3da22291d19e086f1c5acdf99685e4d4..1a0da4b45f55ad6dd469efb796edd063049052b4 100644 (file)
@@ -1779,7 +1779,7 @@ boolean HandleGadgets(int mx, int my, int button)
        {
          boolean scroll_single_step = ((GetKeyModState() & KMOD_Alt) != 0);
 
-         item_steps = (scroll_single_step ? 1 : DEFAULT_WHEEL_STEPS);
+         item_steps = (scroll_single_step ? 1 : wheel_steps);
          item_direction = (button == MB_WHEEL_UP ||
                            button == MB_WHEEL_LEFT ? -1 : +1);
        }
index 4d70bfcd6fffee25da7eda052b04280aa7b21c49..60a8411f4ffb66c1793d58edc7ff2e448325b88b 100644 (file)
@@ -80,6 +80,7 @@ typedef SDL_Event             Event;
 typedef SDL_MouseButtonEvent   ButtonEvent;
 typedef SDL_MouseMotionEvent   MotionEvent;
 #if defined(TARGET_SDL2)
+typedef SDL_MouseWheelEvent    WheelEvent;
 typedef SDL_TouchFingerEvent   FingerEvent;
 typedef SDL_TextInputEvent     TextEvent;
 typedef SDL_Event              PauseResumeEvent;
@@ -127,6 +128,7 @@ struct MouseCursorInfo
 #define EVENT_BUTTONRELEASE    SDL_MOUSEBUTTONUP
 #define EVENT_MOTIONNOTIFY     SDL_MOUSEMOTION
 #if defined(TARGET_SDL2)
+#define        EVENT_WHEELMOTION       SDL_MOUSEWHEEL
 #define        EVENT_FINGERPRESS       SDL_FINGERDOWN
 #define EVENT_FINGERRELEASE    SDL_FINGERUP
 #define EVENT_FINGERMOTION     SDL_FINGERMOTION
index 600b4b3217a6ad785ccc3f1b4608c824fa4149f7..7dc231a864ce04186dfe8dc023e5a6d9b936fa83 100644 (file)
@@ -50,6 +50,7 @@ DrawBuffer           *drawto = NULL;
 
 int                    button_status = MB_NOT_PRESSED;
 boolean                        motion_status = FALSE;
+int                    wheel_steps = DEFAULT_WHEEL_STEPS;
 #if defined(TARGET_SDL2)
 boolean                        keyrepeat_status = TRUE;
 #endif
index 0bd948bd640ff684c88f25ee3ddff7637a303b0a..06bed391eaaef0ec84ceae8c2d87c71634dcba31 100644 (file)
 #define MB_WHEEL_DOWN                  5
 #define MB_WHEEL_LEFT                  6
 #define MB_WHEEL_RIGHT                 7
-#define IS_WHEEL_BUTTON_VERTICAL(b)    ((b) >= MB_WHEEL_UP &&          \
-                                        (b) <= MB_WHEEL_DOWN)
-#define IS_WHEEL_BUTTON_HORIZONTAL(b)  ((b) >= MB_WHEEL_LEFT &&        \
-                                        (b) <= MB_WHEEL_RIGHT)
-#define IS_WHEEL_BUTTON(b)             ((b) >= MB_WHEEL_UP &&          \
-                                        (b) <= MB_WHEEL_DOWN)
+#define IS_WHEEL_BUTTON_VERTICAL(b)    ((b) == MB_WHEEL_UP ||          \
+                                        (b) == MB_WHEEL_DOWN)
+#define IS_WHEEL_BUTTON_HORIZONTAL(b)  ((b) == MB_WHEEL_LEFT ||        \
+                                        (b) == MB_WHEEL_RIGHT)
+#define IS_WHEEL_BUTTON(b)             (IS_WHEEL_BUTTON_VERTICAL(b) || \
+                                        IS_WHEEL_BUTTON_HORIZONTAL(b))
 #define DEFAULT_WHEEL_STEPS            3
 
 #define BUTTON_STEPSIZE(b)             ((b) == MB_LEFTBUTTON   ?  1 :  \
@@ -1376,6 +1376,7 @@ extern DrawBuffer        *drawto;
 
 extern int                     button_status;
 extern boolean                 motion_status;
+extern int                     wheel_steps;
 #if defined(TARGET_SDL2)
 extern boolean                 keyrepeat_status;
 #endif