diff --git a/docs.html b/docs.html
index 5c1c85ef3..f27b858fe 100644
--- a/docs.html
+++ b/docs.html
@@ -16,6 +16,7 @@ be found at the main SDL page.
Major changes since SDL 1.0.0:
+ - 1.2.1: Mouse wheel sends mouse button (4/5) events on Windows
- 1.2.1: Added MacOS X Project Builder projects (thanks Darrell!)
- 1.2.1: Added initial support for Quartz video (thanks Darrell!)
- 1.2.1: Disabled Linux /dev/event joystick interface by default
diff --git a/src/video/wincommon/SDL_sysevents.c b/src/video/wincommon/SDL_sysevents.c
index ec46bbfa8..8c9f136b6 100644
--- a/src/video/wincommon/SDL_sysevents.c
+++ b/src/video/wincommon/SDL_sysevents.c
@@ -321,6 +321,34 @@ static LONG CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
}
return(0);
+
+#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
+ case WM_MOUSEWHEEL:
+ if ( SDL_VideoSurface && ! DINPUT_FULLSCREEN() ) {
+ Sint16 x, y;
+ Uint8 button = 0;
+ int move = (short)HIWORD(wParam);
+ if(move > 0)
+ button = 4;
+ else if(move < 0)
+ button = 5;
+ if(button)
+ {
+ if ( mouse_relative ) {
+ /* RJR: March 28, 2000
+ report internal mouse position if in relative mode */
+ x = 0; y = 0;
+ } else {
+ x = (Sint16)LOWORD(lParam);
+ y = (Sint16)HIWORD(lParam);
+ }
+ posted = SDL_PrivateMouseButton(
+ SDL_PRESSED, button, x, y);
+ }
+ }
+ return(0);
+#endif
+
#ifdef WM_GETMINMAXINFO
/* This message is sent as a way for us to "check" the values
* of a position change. If we don't like it, we can adjust
diff --git a/src/video/windx5/SDL_dx5events.c b/src/video/windx5/SDL_dx5events.c
index 81c321b28..3514ede22 100644
--- a/src/video/windx5/SDL_dx5events.c
+++ b/src/video/windx5/SDL_dx5events.c
@@ -379,6 +379,20 @@ static void handle_mouse(const int numevents, DIDEVICEOBJECTDATA *ptrbuf)
case DIMOFS_Y:
yrel += (Sint16)ptrbuf[i].dwData;
break;
+ case DIMOFS_Z:
+ if ( xrel || yrel ) {
+ posted = SDL_PrivateMouseMotion(
+ 0, 1, xrel, yrel);
+ xrel = 0;
+ yrel = 0;
+ }
+ if((int)ptrbuf[i].dwData > 0)
+ posted = SDL_PrivateMouseButton(
+ SDL_PRESSED, 4, 0, 0);
+ else if((int)ptrbuf[i].dwData < 0)
+ posted = SDL_PrivateMouseButton(
+ SDL_PRESSED, 5, 0, 0);
+ break;
case DIMOFS_BUTTON0:
case DIMOFS_BUTTON1:
case DIMOFS_BUTTON2: