From cce245b68871768b59476ea6e1d31414f53c1587 Mon Sep 17 00:00:00 2001 From: kristianduske Date: Sat, 7 Jan 2012 08:26:32 +0000 Subject: [PATCH] Applied patch to disable mouse acceleration in Mac OS X. git-svn-id: http://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@599 af15c1b1-3010-417e-b628-4374ebc0bcbd --- MacOSX/QuakeSpasm.xcodeproj/project.pbxproj | 4 + Quake/in_sdl.c | 105 ++++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/MacOSX/QuakeSpasm.xcodeproj/project.pbxproj b/MacOSX/QuakeSpasm.xcodeproj/project.pbxproj index e83621f0..a4f591f4 100644 --- a/MacOSX/QuakeSpasm.xcodeproj/project.pbxproj +++ b/MacOSX/QuakeSpasm.xcodeproj/project.pbxproj @@ -96,6 +96,7 @@ 48B9E7C00D340EA80001CACF /* SDLApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 48B9E7BF0D340EA80001CACF /* SDLApplication.m */; }; 48C85E3B0D3AD10E00797678 /* QuakeArgument.m in Sources */ = {isa = PBXBuildFile; fileRef = 48C85E3A0D3AD10E00797678 /* QuakeArgument.m */; }; 48FE585B0D3A82C8006BB491 /* QuakeArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = 48FE585A0D3A82C8006BB491 /* QuakeArguments.m */; }; + 6649639F14AA71250084BF0D /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6649639E14AA71250084BF0D /* IOKit.framework */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; B021C20914A5FF7E003F18D6 /* cfgfile.c in Sources */ = {isa = PBXBuildFile; fileRef = B021C20714A5FF7E003F18D6 /* cfgfile.c */; }; @@ -274,6 +275,7 @@ 48C85E3A0D3AD10E00797678 /* QuakeArgument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuakeArgument.m; sourceTree = ""; }; 48FE58590D3A82C8006BB491 /* QuakeArguments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuakeArguments.h; sourceTree = ""; }; 48FE585A0D3A82C8006BB491 /* QuakeArguments.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QuakeArguments.m; sourceTree = ""; }; + 6649639E14AA71250084BF0D /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = ../../../../System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* QuakeSpasm.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QuakeSpasm.app; sourceTree = BUILT_PRODUCTS_DIR; }; B021C20714A5FF7E003F18D6 /* cfgfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cfgfile.c; path = ../Quake/cfgfile.c; sourceTree = SOURCE_ROOT; }; @@ -285,6 +287,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6649639F14AA71250084BF0D /* IOKit.framework in Frameworks */, 002F39FA09D0881F00EBEB88 /* SDL.framework in Frameworks */, 002F3C6109D0951E00EBEB88 /* GLUT.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, @@ -330,6 +333,7 @@ 29B97314FDCFA39411CA2CEA /* QuakeSpasm */ = { isa = PBXGroup; children = ( + 6649639E14AA71250084BF0D /* IOKit.framework */, 48243B060D33ED0A00C29F8F /* MacOSX */, 483A77D80D2EE8C500CB2E4C /* Quake */, 29B97317FDCFA39411CA2CEA /* Resources */, diff --git a/Quake/in_sdl.c b/Quake/in_sdl.c index 2cfc95a8..2afe6f1c 100644 --- a/Quake/in_sdl.c +++ b/Quake/in_sdl.c @@ -23,6 +23,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" #include "SDL.h" +#ifdef __APPLE__ +// Mouse acceleration needs to be disabled +#define MACOS_X_ACCELERATION_HACK +#endif + +#ifdef MACOS_X_ACCELERATION_HACK +#include +#include +#include +#include +#endif + static keydest_t prev_key_dest; static qboolean no_mouse = false; @@ -41,6 +53,11 @@ static int buttonremap[] = /* mouse variables */ cvar_t m_filter = {"m_filter","0",CVAR_NONE}; +#ifdef MACOS_X_ACCELERATION_HACK +cvar_t in_disablemacosxmouseaccel = {"in_disablemacosxmouseaccel", "1", true}; +static double originalMouseSpeed = -1.0; +#endif + /* total accumulated mouse movement since last frame, * gets updated from the main game loop via IN_MouseMove */ static int total_dx, total_dy = 0; @@ -58,11 +75,74 @@ static int FilterMouseEvents (const SDL_Event *event) return 1; } +#ifdef MACOS_X_ACCELERATION_HACK +/* + =============== + IN_GetIOHandle + =============== + */ +static io_connect_t IN_GetIOHandle(void) // mac os x mouse accel hack +{ + io_connect_t iohandle = MACH_PORT_NULL; + kern_return_t status; + io_service_t iohidsystem = MACH_PORT_NULL; + mach_port_t masterport; + + status = IOMasterPort(MACH_PORT_NULL, &masterport); + if(status != KERN_SUCCESS) + return 0; + + iohidsystem = IORegistryEntryFromPath(masterport, kIOServicePlane ":/IOResources/IOHIDSystem"); + if(!iohidsystem) + return 0; + + status = IOServiceOpen(iohidsystem, mach_task_self(), kIOHIDParamConnectType, &iohandle); + IOObjectRelease(iohidsystem); + + return iohandle; +} +#endif + + void IN_Activate (void) { if (no_mouse) return; +#ifdef MACOS_X_ACCELERATION_HACK + // mac os x mouse accel hack + { + // Save the status of mouse acceleration + + if (originalMouseSpeed == -1 && in_disablemacosxmouseaccel.value) + { + io_connect_t mouseDev = IN_GetIOHandle(); + if(mouseDev != 0) + { + if(IOHIDGetAccelerationWithKey(mouseDev, CFSTR(kIOHIDMouseAccelerationType), &originalMouseSpeed) == kIOReturnSuccess) + { + if(IOHIDSetAccelerationWithKey(mouseDev, CFSTR(kIOHIDMouseAccelerationType), -1.0) != kIOReturnSuccess) + { + Con_Printf("WARNING: Could not disable mouse acceleration (failed at IOHIDSetAccelerationWithKey).\n"); + Cvar_Set ("in_disablemacosxmouseaccel", "0"); + } + } + else + { + Con_Printf("WARNING: Could not disable mouse acceleration (failed at IOHIDGetAccelerationWithKey).\n"); + Cvar_Set ("in_disablemacosxmouseaccel", "0"); + } + IOServiceClose(mouseDev); + } + else + { + Con_Printf("WARNING: Could not disable mouse acceleration (failed at IO_GetIOHandle).\n"); + Cvar_Set ("in_disablemacosxmouseaccel", "0"); + } + } + } +#endif + if (SDL_WM_GrabInput(SDL_GRAB_QUERY) != SDL_GRAB_ON) { SDL_WM_GrabInput(SDL_GRAB_ON); @@ -89,6 +169,27 @@ void IN_Deactivate (qboolean free_cursor) if (no_mouse) return; +#ifdef MACOS_X_ACCELERATION_HACK + // mac os x mouse accel hack + { + if(originalMouseSpeed != -1.0) + { + io_connect_t mouseDev = IN_GetIOHandle(); + if(mouseDev != 0) + { + if(IOHIDSetAccelerationWithKey(mouseDev, CFSTR(kIOHIDMouseAccelerationType), originalMouseSpeed) != kIOReturnSuccess) + Con_Printf("WARNING: Could not re-enable mouse acceleration (failed at IOHIDSetAccelerationWithKey).\n"); + IOServiceClose(mouseDev); + } + else + { + Con_Printf("WARNING: Could not re-enable mouse acceleration (failed at IO_GetIOHandle).\n"); + } + originalMouseSpeed = -1; + } + } +#endif + if (free_cursor) { if (SDL_WM_GrabInput(SDL_GRAB_QUERY) != SDL_GRAB_OFF) @@ -124,6 +225,10 @@ void IN_Init (void) SDL_SetEventFilter(FilterMouseEvents); } +#ifdef MACOS_X_ACCELERATION_HACK + Cvar_RegisterVariable(&in_disablemacosxmouseaccel); +#endif + IN_Activate(); }