[PATCH] More than 3 mouse buttons in MacOS X

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.

Attached in unified diff format. If there aren’t objections, I’ll commit
this to CVS.

Sounds good, thanks! :slight_smile:

See ya,
-Sam Lantinga, Software Engineer, Blizzard Entertainment