Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Fixed bug #382
Browse files Browse the repository at this point in the history
Added horizontal scrolling support
  • Loading branch information
slouken committed Jul 6, 2007
1 parent e0f3dfa commit 0b869de
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 20 deletions.
2 changes: 2 additions & 0 deletions include/SDL_compat.h
Expand Up @@ -63,6 +63,8 @@ extern "C" {

#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
Expand Down
3 changes: 2 additions & 1 deletion include/SDL_events.h
Expand Up @@ -199,7 +199,8 @@ typedef struct SDL_MouseWheelEvent
{
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;

Expand Down
43 changes: 30 additions & 13 deletions src/SDL_compat.c
Expand Up @@ -256,25 +256,42 @@ SDL_CompatEventFilter(void *userdata, SDL_Event * event)
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);
}
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);
}

fake.type = SDL_MOUSEBUTTONUP;
fake.button.state = SDL_RELEASED;
SDL_PushEvent(&fake);
break;
}

Expand Down
7 changes: 4 additions & 3 deletions src/events/SDL_mouse.c
Expand Up @@ -427,12 +427,12 @@ SDL_SendMouseButton(int index, Uint8 state, Uint8 button)
}

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;
}

Expand All @@ -442,7 +442,8 @@ SDL_SendMouseWheel(int index, int motion)
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);
}
Expand Down
2 changes: 1 addition & 1 deletion src/events/SDL_mouse_c.h
Expand Up @@ -102,7 +102,7 @@ extern int SDL_SendMouseMotion(int index, int relative, int x, int y);
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);
Expand Down
2 changes: 1 addition & 1 deletion src/video/cocoa/SDL_cocoawindow.m
Expand Up @@ -274,7 +274,7 @@ - (void)scrollWheel:(NSEvent *)theEvent
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
Expand Down
2 changes: 1 addition & 1 deletion src/video/win32/SDL_win32events.c
Expand Up @@ -645,7 +645,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
int motion = (short) HIWORD(wParam);

index = data->videodata->mouse;
SDL_SendMouseWheel(index, motion);
SDL_SendMouseWheel(index, 0, motion);
}
return (0);

Expand Down

0 comments on commit 0b869de

Please sign in to comment.