Added support for WM_XBUTTON to the windib driver, to support more mouse
buttons.
Fixes Bugzilla #311.
--- a/docs.html Fri Jun 15 15:52:04 2007 +0000
+++ b/docs.html Sat Jun 16 05:10:47 2007 +0000
@@ -75,6 +75,9 @@
<BLOCKQUOTE>
<P>
+ The windib driver now supports more mouse buttons with WM_XBUTTON events.
+</P>
+<P>
Added support for UTF-8 window titles on Windows.
</P>
<P>
--- a/src/video/wincommon/SDL_sysevents.c Fri Jun 15 15:52:04 2007 +0000
+++ b/src/video/wincommon/SDL_sysevents.c Sat Jun 16 05:10:47 2007 +0000
@@ -24,6 +24,17 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
+/* Make sure XBUTTON stuff is defined that isn't in older Platform SDKs... */
+#ifndef WM_XBUTTONDOWN
+#define WM_XBUTTONDOWN 0x020B
+#endif
+#ifndef WM_XBUTTONUP
+#define WM_XBUTTONUP 0x020C
+#endif
+#ifndef GET_XBUTTON_WPARAM
+#define GET_XBUTTON_WPARAM(w) (HIWORD(w))
+#endif
+
#include "SDL_events.h"
#include "SDL_video.h"
#include "SDL_syswm.h"
@@ -466,9 +477,12 @@
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_RBUTTONDOWN:
- case WM_RBUTTONUP: {
+ case WM_RBUTTONUP:
+ case WM_XBUTTONDOWN:
+ case WM_XBUTTONUP: {
/* Mouse is handled by DirectInput when fullscreen */
if ( SDL_VideoSurface && ! DINPUT_FULLSCREEN() ) {
+ WORD xbuttonval = 0;
Sint16 x, y;
Uint8 button, state;
@@ -505,6 +519,16 @@
button = SDL_BUTTON_RIGHT;
state = SDL_RELEASED;
break;
+ case WM_XBUTTONDOWN:
+ xbuttonval = GET_XBUTTON_WPARAM(wParam);
+ button = SDL_BUTTON_WHEELDOWN + xbuttonval;
+ state = SDL_PRESSED;
+ break;
+ case WM_XBUTTONUP:
+ xbuttonval = GET_XBUTTON_WPARAM(wParam);
+ button = SDL_BUTTON_WHEELDOWN + xbuttonval;
+ state = SDL_RELEASED;
+ break;
default:
/* Eh? Unknown button? */
return(0);
@@ -535,6 +559,19 @@
}
posted = SDL_PrivateMouseButton(
state, button, x, y);
+
+ /*
+ * MSDN says:
+ * "Unlike the WM_LBUTTONUP, WM_MBUTTONUP, and WM_RBUTTONUP
+ * messages, an application should return TRUE from [an
+ * XBUTTON message] if it processes it. Doing so will allow
+ * software that simulates this message on Microsoft Windows
+ * systems earlier than Windows 2000 to determine whether
+ * the window procedure processed the message or called
+ * DefWindowProc to process it.
+ */
+ if (xbuttonval > 0)
+ return(TRUE);
}
}
return(0);
--- a/src/video/wincommon/wmmsg.h Fri Jun 15 15:52:04 2007 +0000
+++ b/src/video/wincommon/wmmsg.h Sat Jun 16 05:10:47 2007 +0000
@@ -525,8 +525,8 @@
"WM_MBUTTONUP",
"WM_MOUSELAST",
"WM_MOUSELAST",
- "UNKNOWN (523)",
- "UNKNOWN (524)",
+ "WM_XBUTTONDOWN",
+ "WM_XBUTTONUP",
"UNKNOWN (525)",
"UNKNOWN (526)",
"UNKNOWN (527)",