Without this patch, SDL recognizes the left and right mouse buttons, but
every other button is considered the “middle” button.
Here is a patch to fix that. It does some tapdancing to convert between
Cocoa’s button numbers and SDL’s, respecting that SDL reserves button 4
and 5 for the mousewheel. So on this MS Intellimouse Explorer device, the
buttons are reported through SDL as:
Left: button #1 (SDL_BUTTON_LEFT)
Wheel button: button #2 (SDL_BUTTON_MIDDLE)
Right: button #3 (SDL_BUTTON_RIGHT)
Wheelup: button #4 (SDL_BUTTON_WHEELUP)
Wheeldown: button #5 (SDL_BUTTON_WHEELDOWN)
Lower thumb: button #6
Upper thumb: button #7
Attached in unified diff format. If there aren’t objections, I’ll commit
this to CVS.
–ryan.
-------------- next part --------------
Index: src/video/quartz/SDL_QuartzEvents.m===================================================================
RCS file: /home/sdlweb/libsdl.org/cvs/SDL12/src/video/quartz/SDL_QuartzEvents.m,v
retrieving revision 1.22
diff -u -r1.22 SDL_QuartzEvents.m
— src/video/quartz/SDL_QuartzEvents.m 22 May 2003 06:28:40 -0000 1.22
+++ src/video/quartz/SDL_QuartzEvents.m 25 May 2003 08:55:44 -0000
@@ -378,6 +378,25 @@
CFRelease (rls);
}
+// Try to map Quartz mouse buttons to SDL’s lingo…
+static int QZ_OtherMouseButtonToSDL(int button)
+{
- switch (button)
- {
-
case 0:
-
return(SDL_BUTTON_LEFT); // 1
-
case 1:
-
return(SDL_BUTTON_RIGHT); // 3
-
case 2:
-
return(SDL_BUTTON_MIDDLE); // 2
- }
- // >= 3: skip 4 & 5, since those are the SDL mousewheel buttons.
- return(button + 3);
+}
static void QZ_PumpEvents (_THIS)
{
int firstMouseEvent;
@@ -420,6 +439,7 @@
inMode: NSDefaultRunLoopMode dequeue:YES ];
if (event != nil) {
-
int button; unsigned int type; BOOL isForGameWin; BOOL isInGameWin;
@@ -466,8 +486,7 @@
}
}
break;
-
case NSOtherMouseDown: DO_MOUSE_DOWN (SDL_BUTTON_MIDDLE); break;
-
case NSRightMouseDown: DO_MOUSE_DOWN (SDL_BUTTON_RIGHT); break;
-
case NSLeftMouseUp: if ( last_virtual_button != 0 ) { DO_MOUSE_UP (last_virtual_button);
@@ -477,8 +496,19 @@
DO_MOUSE_UP (SDL_BUTTON_LEFT);
}
break;
-
case NSOtherMouseUp: DO_MOUSE_UP (SDL_BUTTON_MIDDLE); break;
-
case NSRightMouseUp: DO_MOUSE_UP (SDL_BUTTON_RIGHT); break;
-
case NSOtherMouseDown:
-
case NSRightMouseDown:
-
button = QZ_OtherMouseButtonToSDL([ event buttonNumber ]);
-
DO_MOUSE_DOWN (button);
-
break;
-
case NSOtherMouseUp:
-
case NSRightMouseUp:
-
button = QZ_OtherMouseButtonToSDL([ event buttonNumber ]);
-
DO_MOUSE_UP (button);
-
break;
-
case NSSystemDefined: /* Future: up to 32 "mouse" buttons can be handled.