#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"
+#include "vid_agl_mackeys.h" // this is SDL/src/video/maccommon/SDL_mackeys.h
#ifndef kCGLCEMPEngine
#define kCGLCEMPEngine 313
static qboolean multithreadedgl;
static qboolean mouse_avail = true;
static qboolean vid_usingmouse = false;
+static qboolean vid_usingnoaccel = false;
static float mouse_x, mouse_y;
static qboolean vid_isfullscreen = false;
static AGLContext context;
static WindowRef window;
-static double originalMouseSpeed = 0.0;
+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)
{
{
if (grab)
{
+ if(vid_usingmouse && (vid_usingnoaccel != !!apple_mouse_noaccel.integer))
+ IN_Activate(false); // ungrab first!
if (!vid_usingmouse && mouse_avail && window)
{
Rect winBounds;
CGAssociateMouseAndMouseCursorPosition(false);
// Save the status of mouse acceleration
- originalMouseSpeed = 0.0; // in case of error
+ originalMouseSpeed = -1.0; // in case of error
if(apple_mouse_noaccel.integer)
{
- NXEventHandle mouseDev = NXOpenEventStatus();
+ io_connect_t mouseDev = IN_GetIOHandle();
if(mouseDev != 0)
{
- if(IOHIDGetMouseAcceleration((io_connect_t) mouseDev, &originalMouseSpeed) == kIOReturnSuccess)
+ if(IOHIDGetAccelerationWithKey(mouseDev, CFSTR(kIOHIDMouseAccelerationType), &originalMouseSpeed) == kIOReturnSuccess)
{
- if(IOHIDSetMouseAcceleration((io_connect_t) mouseDev, 0.0) != 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 IOHIDSetMouseAcceleration).\n");
+ 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 IOHIDGetMouseAcceleration).\n");
+ Con_Print("Could not disable mouse acceleration (failed at IOHIDGetAccelerationWithKey).\n");
Cvar_SetValueQuick(&apple_mouse_noaccel, 0);
}
- NXCloseEventStatus(mouseDev);
+ IOServiceClose(mouseDev);
}
else
{
- Con_Print("Could not disable mouse acceleration (failed at NXOpenEventStatus).\n");
+ 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;
+ vid_usingnoaccel = !!apple_mouse_noaccel.integer;
}
}
else
{
if (vid_usingmouse)
{
- if(originalMouseSpeed != 0.0)
+ if(originalMouseSpeed != -1.0)
{
- NXEventHandle mouseDev = NXOpenEventStatus();
+ io_connect_t mouseDev = IN_GetIOHandle();
if(mouseDev != 0)
{
- if(IOHIDSetMouseAcceleration((io_connect_t) mouseDev, originalMouseSpeed) != kIOReturnSuccess)
- Con_Print("Could not re-enable mouse acceleration (failed at IOHIDSetMouseAcceleration).\n");
- NXCloseEventStatus(mouseDev);
+ 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 NXOpenEventStatus).\n");
+ Con_Print("Could not re-enable mouse acceleration (failed at IO_GetIOHandle).\n");
}
CGAssociateMouseAndMouseCursorPosition(true);
Sys_Quit(0);
}
-static void VID_BuildAGLAttrib(GLint *attrib, qboolean stencil, qboolean fullscreen, qboolean stereobuffer)
+static void VID_BuildAGLAttrib(GLint *attrib, qboolean stencil, qboolean fullscreen, qboolean stereobuffer, int samples)
{
*attrib++ = AGL_RGBA;
*attrib++ = AGL_RED_SIZE;*attrib++ = 1;
*attrib++ = AGL_FULLSCREEN;
if (stereobuffer)
*attrib++ = AGL_STEREO;
+#ifdef AGL_SAMPLE_BUFFERS_ARB
+#ifdef AGL_SAMPLES_ARB
+ if (samples > 1)
+ {
+ *attrib++ = AGL_SAMPLE_BUFFERS_ARB;
+ *attrib++ = 1;
+ *attrib++ = AGL_SAMPLES_ARB;
+ *attrib++ = samples;
+ }
+#endif
+#endif
+
*attrib++ = AGL_NONE;
}
-int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate, int stereobuffer)
+int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate, int stereobuffer, int samples)
{
const EventTypeSpec winEvents[] =
{
GetEventTypeCount(winEvents), winEvents, window, NULL);
// Create the desired attribute list
- VID_BuildAGLAttrib(attributes, bpp == 32, fullscreen, stereobuffer);
+ VID_BuildAGLAttrib(attributes, bpp == 32, fullscreen, stereobuffer, samples);
if (!fullscreen)
{
gl_platform = "AGL";
gl_videosyncavailable = true;
+ Con_DPrintf("GL_VENDOR: %s\n", gl_vendor);
+ Con_DPrintf("GL_RENDERER: %s\n", gl_renderer);
+ Con_DPrintf("GL_VERSION: %s\n", gl_version);
+ Con_DPrintf("GL_EXTENSIONS: %s\n", gl_extensions);
+ Con_DPrintf("%s_EXTENSIONS: %s\n", gl_platform, gl_platformextensions);
+
multithreadedgl = false;
vid_isfullscreen = fullscreen;
vid_usingmouse = 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);
}
}