Fixed bug #382
authorSam Lantinga <slouken@libsdl.org>
Fri, 06 Jul 2007 09:22:18 +0000
changeset 2152 003c1b5b07da
parent 2151 1e0692271600
child 2153 760c1bd2d625
Fixed bug #382 Added horizontal scrolling support
include/SDL_compat.h
include/SDL_events.h
src/SDL_compat.c
src/events/SDL_mouse.c
src/events/SDL_mouse_c.h
src/video/cocoa/SDL_cocoawindow.m
src/video/win32/SDL_win32events.c
--- a/include/SDL_compat.h	Thu Jul 05 06:35:40 2007 +0000
+++ b/include/SDL_compat.h	Fri Jul 06 09:22:18 2007 +0000
@@ -63,6 +63,8 @@
 
 #define SDL_BUTTON_WHEELUP	4
 #define SDL_BUTTON_WHEELDOWN	5
+#define SDL_BUTTON_WHEELLEFT	6
+#define SDL_BUTTON_WHEELRIGHT	7
 
 #define SDL_DEFAULT_REPEAT_DELAY	500
 #define SDL_DEFAULT_REPEAT_INTERVAL	30
--- a/include/SDL_events.h	Thu Jul 05 06:35:40 2007 +0000
+++ b/include/SDL_events.h	Fri Jul 06 09:22:18 2007 +0000
@@ -199,7 +199,8 @@
 {
     Uint8 type;             /**< SDL_MOUSEWHEEL */
     Uint8 which;            /**< The mouse device index */
-    int motion;             /**< The direction and distance scrolled */
+    int x;                  /**< The amount scrolled horizontally */
+    int y;                  /**< The amount scrolled vertically */
     SDL_WindowID windowID;  /**< The window with mouse focus, if any */
 } SDL_MouseWheelEvent;
 
--- a/src/SDL_compat.c	Thu Jul 05 06:35:40 2007 +0000
+++ b/src/SDL_compat.c	Fri Jul 06 09:22:18 2007 +0000
@@ -256,25 +256,42 @@
             SDL_GetMouseState(&x, &y);
             SDL_SelectMouse(selected);
 
-            if (event->wheel.motion > 0) {
-                button = SDL_BUTTON_WHEELUP;
-            } else {
-                button = SDL_BUTTON_WHEELDOWN;
-            }
-
             fake.button.which = event->wheel.windowID;
-            fake.button.button = button;
             fake.button.x = x;
             fake.button.y = y;
             fake.button.windowID = event->wheel.windowID;
 
-            fake.type = SDL_MOUSEBUTTONDOWN;
-            fake.button.state = SDL_PRESSED;
-            SDL_PushEvent(&fake);
+            if (event->wheel.y) {
+                if (event->wheel.y > 0) {
+                    fake.button.button = SDL_BUTTON_WHEELUP;
+                } else {
+                    fake.button.button = SDL_BUTTON_WHEELDOWN;
+                }
+
+                fake.type = SDL_MOUSEBUTTONDOWN;
+                fake.button.state = SDL_PRESSED;
+                SDL_PushEvent(&fake);
 
-            fake.type = SDL_MOUSEBUTTONUP;
-            fake.button.state = SDL_RELEASED;
-            SDL_PushEvent(&fake);
+                fake.type = SDL_MOUSEBUTTONUP;
+                fake.button.state = SDL_RELEASED;
+                SDL_PushEvent(&fake);
+            }
+            if (event->wheel.x) {
+                if (event->wheel.y > 0) {
+                    fake.button.button = SDL_BUTTON_WHEELLEFT;
+                } else {
+                    fake.button.button = SDL_BUTTON_WHEELRIGHT;
+                }
+
+                fake.type = SDL_MOUSEBUTTONDOWN;
+                fake.button.state = SDL_PRESSED;
+                SDL_PushEvent(&fake);
+
+                fake.type = SDL_MOUSEBUTTONUP;
+                fake.button.state = SDL_RELEASED;
+                SDL_PushEvent(&fake);
+            }
+
             break;
         }
 
--- a/src/events/SDL_mouse.c	Thu Jul 05 06:35:40 2007 +0000
+++ b/src/events/SDL_mouse.c	Fri Jul 06 09:22:18 2007 +0000
@@ -427,12 +427,12 @@
 }
 
 int
-SDL_SendMouseWheel(int index, int motion)
+SDL_SendMouseWheel(int index, int x, int y)
 {
     SDL_Mouse *mouse = SDL_GetMouse(index);
     int posted;
 
-    if (!mouse || !motion) {
+    if (!mouse || (!x && !y)) {
         return 0;
     }
 
@@ -442,7 +442,8 @@
         SDL_Event event;
         event.type = SDL_MOUSEWHEEL;
         event.wheel.which = (Uint8) index;
-        event.wheel.motion = motion;
+        event.wheel.x = x;
+        event.wheel.y = y;
         event.wheel.windowID = mouse->focus;
         posted = (SDL_PushEvent(&event) > 0);
     }
--- a/src/events/SDL_mouse_c.h	Thu Jul 05 06:35:40 2007 +0000
+++ b/src/events/SDL_mouse_c.h	Fri Jul 06 09:22:18 2007 +0000
@@ -102,7 +102,7 @@
 extern int SDL_SendMouseButton(int index, Uint8 state, Uint8 button);
 
 /* Send a mouse wheel event for a mouse at an index */
-extern int SDL_SendMouseWheel(int index, int motion);
+extern int SDL_SendMouseWheel(int index, int x, int y);
 
 /* Shutdown the mouse subsystem */
 extern void SDL_MouseQuit(void);
--- a/src/video/cocoa/SDL_cocoawindow.m	Thu Jul 05 06:35:40 2007 +0000
+++ b/src/video/cocoa/SDL_cocoawindow.m	Fri Jul 06 09:22:18 2007 +0000
@@ -274,7 +274,7 @@
     int index;
 
     index = _data->videodata->mouse;
-    SDL_SendMouseWheel(index, (int)([theEvent deltaY]+0.9f));
+    SDL_SendMouseWheel(index, (int)([theEvent deltaX]+0.9f), (int)([theEvent deltaY]+0.9f));
 }
 
 @end
--- a/src/video/win32/SDL_win32events.c	Thu Jul 05 06:35:40 2007 +0000
+++ b/src/video/win32/SDL_win32events.c	Fri Jul 06 09:22:18 2007 +0000
@@ -645,7 +645,7 @@
             int motion = (short) HIWORD(wParam);
 
             index = data->videodata->mouse;
-            SDL_SendMouseWheel(index, motion);
+            SDL_SendMouseWheel(index, 0, motion);
         }
         return (0);