Skip to content

Commit

Permalink
Added support for WM_XBUTTON to the windib driver, to support more mouse
Browse files Browse the repository at this point in the history
 buttons.

   Fixes Bugzilla #311.
  • Loading branch information
icculus committed Jun 16, 2007
1 parent f913506 commit 6c0b39f
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 3 deletions.
3 changes: 3 additions & 0 deletions docs.html
Expand Up @@ -74,6 +74,9 @@ <H3> Unix Notes </H3>
<H3> Windows Notes </H3>

<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>
Expand Down
39 changes: 38 additions & 1 deletion src/video/wincommon/SDL_sysevents.c
Expand Up @@ -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"
Expand Down Expand Up @@ -466,9 +477,12 @@ LRESULT CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
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;

Expand Down Expand Up @@ -505,6 +519,16 @@ LRESULT CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
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);
Expand Down Expand Up @@ -535,6 +559,19 @@ LRESULT CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
}
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);
Expand Down
4 changes: 2 additions & 2 deletions src/video/wincommon/wmmsg.h
Expand Up @@ -525,8 +525,8 @@ char *wmtab[] = {
"WM_MBUTTONUP",
"WM_MOUSELAST",
"WM_MOUSELAST",
"UNKNOWN (523)",
"UNKNOWN (524)",
"WM_XBUTTONDOWN",
"WM_XBUTTONUP",
"UNKNOWN (525)",
"UNKNOWN (526)",
"UNKNOWN (527)",
Expand Down

0 comments on commit 6c0b39f

Please sign in to comment.