#include <AGL/agl.h>
#include <OpenGL/OpenGL.h>
#include <Carbon/Carbon.h>
+#include <IOKit/hidsystem/IOHIDLib.h>
+#include <IOKit/hidsystem/IOHIDParameter.h>
+#include <IOKit/hidsystem/event_status_driver.h>
#include "vid_agl_mackeys.h" // this is SDL/src/video/maccommon/SDL_mackeys.h
#include "quakedef.h"
static int scr_width, scr_height;
static cvar_t apple_multithreadedgl = {CVAR_SAVE, "apple_multithreadedgl", "1", "makes use of a second thread for the OpenGL driver (if possible) rather than using the engine thread (note: this is done automatically on most other operating systems)"};
+static cvar_t apple_mouse_noaccel = {CVAR_SAVE, "apple_mouse_noaccel", "1", "disables mouse acceleration while DarkPlaces is active"};
static AGLContext context;
static WindowRef window;
+static double originalMouseSpeed = -1.0;
+
+io_connect_t IN_GetIOHandle()
+{
+ 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;
+}
void VID_GetWindowSize (int *x, int *y, int *width, int *height)
{
// Lock the mouse pointer at its current position
CGAssociateMouseAndMouseCursorPosition(false);
+ // Save the status of mouse acceleration
+ originalMouseSpeed = -1.0; // in case of error
+ if(apple_mouse_noaccel.integer)
+ {
+ io_connect_t mouseDev = IN_GetIOHandle();
+ if(mouseDev != 0)
+ {
+ if(IOHIDGetAccelerationWithKey(mouseDev, CFSTR(kIOHIDMouseAccelerationType), &originalMouseSpeed) == kIOReturnSuccess)
+ {
+ Con_DPrintf("previous mouse acceleration: %f\n", originalMouseSpeed);
+ if(IOHIDSetAccelerationWithKey(mouseDev, CFSTR(kIOHIDMouseAccelerationType), -1.0) != kIOReturnSuccess)
+ {
+ Con_Print("Could not disable mouse acceleration (failed at IOHIDSetAccelerationWithKey).\n");
+ Cvar_SetValueQuick(&apple_mouse_noaccel, 0);
+ }
+ }
+ else
+ {
+ Con_Print("Could not disable mouse acceleration (failed at IOHIDGetAccelerationWithKey).\n");
+ Cvar_SetValueQuick(&apple_mouse_noaccel, 0);
+ }
+ IOServiceClose(mouseDev);
+ }
+ else
+ {
+ Con_Print("Could not disable mouse acceleration (failed at IO_GetIOHandle).\n");
+ Cvar_SetValueQuick(&apple_mouse_noaccel, 0);
+ }
+ }
+
mouse_x = mouse_y = 0;
vid_usingmouse = true;
}
{
if (vid_usingmouse)
{
+ if(originalMouseSpeed != -1.0)
+ {
+ io_connect_t mouseDev = IN_GetIOHandle();
+ if(mouseDev != 0)
+ {
+ Con_DPrintf("restoring mouse acceleration to: %f\n", originalMouseSpeed);
+ if(IOHIDSetAccelerationWithKey(mouseDev, CFSTR(kIOHIDMouseAccelerationType), originalMouseSpeed) != kIOReturnSuccess)
+ Con_Print("Could not re-enable mouse acceleration (failed at IOHIDSetAccelerationWithKey).\n");
+ IOServiceClose(mouseDev);
+ }
+ else
+ Con_Print("Could not re-enable mouse acceleration (failed at IO_GetIOHandle).\n");
+ }
+
CGAssociateMouseAndMouseCursorPosition(true);
CGDisplayShowCursor(CGMainDisplayID());
{
InitSig(); // trap evil signals
Cvar_RegisterVariable(&apple_multithreadedgl);
+ Cvar_RegisterVariable(&apple_mouse_noaccel);
// COMMANDLINEOPTION: Input: -nomouse disables mouse support (see also vid_mouse cvar)
if (COM_CheckParm ("-nomouse"))
mouse_avail = false;
ascii = charcode;
}
else
- Con_Printf(">> UNKNOWN char/keycode: %d/%u <<\n", charcode, (unsigned) mackeycode);
+ Con_DPrintf(">> UNKNOWN char/keycode: %d/%u <<\n", charcode, (unsigned) mackeycode);
}
}