Added support for WM_XBUTTON to the windib driver, to support more mouse SDL-1.2
authorRyan C. Gordon <icculus@icculus.org>
Sat, 16 Jun 2007 05:10:47 +0000
branchSDL-1.2
changeset 3970 203695f768e0
parent 3969 e6112676c9a0
child 3971 aea2f9cd5b8e
Added support for WM_XBUTTON to the windib driver, to support more mouse buttons. Fixes Bugzilla #311.
docs.html
src/video/wincommon/SDL_sysevents.c
src/video/wincommon/wmmsg.h
--- 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)",