added vid_stereobuffer cvar based on patch from syschuck on the alientrap forums
[xonotic/darkplaces.git] / vid_agl.c
index a1490a6..de1775c 100644 (file)
--- a/vid_agl.c
+++ b/vid_agl.c
@@ -53,6 +53,8 @@ static float mouse_x, mouse_y;
 static qboolean vid_isfullscreen = false;
 static qboolean vid_usingvsync = false;
 
+static qboolean sound_active = true;
+
 static int scr_width, scr_height;
 
 static AGLContext context;
@@ -111,7 +113,7 @@ void VID_Finish (qboolean allowmousegrab)
 
        // handle the mouse state when windowed if that's changed
        vid_usemouse = false;
-       if (allowmousegrab && vid_mouse.integer && !key_consoleactive && !cls.demoplayback)
+       if (allowmousegrab && vid_mouse.integer && !key_consoleactive && (key_dest != key_game || !cls.demoplayback))
                vid_usemouse = true;
        if (!vid_activewindow)
                vid_usemouse = false;
@@ -136,8 +138,11 @@ void VID_Finish (qboolean allowmousegrab)
 
        if (r_render.integer)
        {
+               CHECKGLERROR
                if (r_speeds.integer || gl_finish.integer)
-                       qglFinish();
+               {
+                       qglFinish();CHECKGLERROR
+               }
                qaglSwapBuffers(context);
        }
        VID_UpdateGamma(false, GAMMA_TABLE_SIZE);
@@ -252,7 +257,7 @@ static int GL_OpenLibrary(void)
                Con_Printf("Unable to open symbol list for %s\n", name);
                return false;
        }
-       strcpy(gl_driver, name);
+       strlcpy(gl_driver, name, sizeof(gl_driver));
        return true;
 }
 
@@ -274,7 +279,7 @@ void VID_Shutdown(void)
                qaglDestroyContext(context);
                context = NULL;
        }
-       
+
        if (vid_isfullscreen)
                CGReleaseAllDisplays();
 
@@ -322,24 +327,40 @@ static OSStatus MainWindowEventHandler (EventHandlerCallRef nextHandler, EventRe
        return err;
 }
 
+static void VID_AppFocusChanged(qboolean windowIsActive)
+{
+       if (vid_activewindow != windowIsActive)
+       {
+               vid_activewindow = windowIsActive;
+               if (!vid_activewindow)
+                       VID_RestoreSystemGamma();
+       }
+
+       if (sound_active != windowIsActive)
+       {
+               sound_active = windowIsActive;
+               if (sound_active)
+                       S_UnblockSound ();
+               else
+                       S_BlockSound ();
+       }
+}
+
 static void VID_ProcessPendingAsyncEvents (void)
 {
        // Collapsed / expanded
        if (AsyncEvent_Collapsed != vid_hidden)
        {
                vid_hidden = !vid_hidden;
-               vid_activewindow = false;
-               VID_RestoreSystemGamma();
+               VID_AppFocusChanged(!vid_hidden);
        }
 
        // Closed
        if (AsyncEvent_Quitting)
-       {
                Sys_Quit();
-       }
 }
 
-static void VID_BuildAGLAttrib(GLint *attrib, qboolean stencil, qboolean fullscreen)
+static void VID_BuildAGLAttrib(GLint *attrib, qboolean stencil, qboolean fullscreen, qboolean stereobuffer)
 {
        *attrib++ = AGL_RGBA;
        *attrib++ = AGL_RED_SIZE;*attrib++ = 1;
@@ -356,10 +377,12 @@ static void VID_BuildAGLAttrib(GLint *attrib, qboolean stencil, qboolean fullscr
        }
        if (fullscreen)
                *attrib++ = AGL_FULLSCREEN;
+       if (stereobuffer)
+               *attrib++ = AGL_STEREO;
        *attrib++ = AGL_NONE;
 }
 
-int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate)
+int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate, int stereobuffer)
 {
     const EventTypeSpec winEvents[] =
        {
@@ -424,7 +447,7 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
                                                           GetEventTypeCount(winEvents), winEvents, window, NULL);
 
        // Create the desired attribute list
-       VID_BuildAGLAttrib(attributes, bpp == 32, fullscreen);
+       VID_BuildAGLAttrib(attributes, bpp == 32, fullscreen, stereobuffer);
 
        if (!fullscreen)
        {
@@ -444,11 +467,11 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
                CGDirectDisplayID mainDisplay;
                CFDictionaryRef refDisplayMode;
                GDHandle gdhDisplay;
-               
+
                // Get the mainDisplay and set resolution to current
                mainDisplay = CGMainDisplayID();
                CGDisplayCapture(mainDisplay);
-               
+
                // TOCHECK: not sure whether or not it's necessary to change the resolution
                // "by hand", or if aglSetFullscreen does the job anyway
                refDisplayMode = CGDisplayBestModeForParametersAndRefreshRate(mainDisplay, bpp, width, height, refreshrate, NULL);
@@ -478,7 +501,7 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
        }
 
        // Make the context the current one ('enable' it)
-       qaglSetCurrentContext(context);   
+       qaglSetCurrentContext(context);
        error = qaglGetError();
        if (error != AGL_NO_ERROR)
        {
@@ -534,6 +557,7 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
        vid_usingmouse = false;
        vid_hidden = false;
        vid_activewindow = true;
+       sound_active = true;
        GL_Init();
 
        SelectWindow(window);
@@ -544,25 +568,27 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
 
 static void Handle_KeyMod(UInt32 keymod)
 {
-       const struct keymod_to_event_s { int keybit; keynum_t event; } keymod_events [] =
+       const struct keymod_to_event_s { UInt32 keybit; keynum_t event; } keymod_events [] =
        {
-               {cmdKey,                                                K_AUX1},
-               {shiftKey,                                              K_SHIFT},
-               {alphaLock,                                             K_CAPSLOCK},
-               {optionKey,                                             K_ALT},
-               {controlKey,                                    K_CTRL},
-               {kEventKeyModifierNumLockMask,  K_NUMLOCK},
-               {kEventKeyModifierFnMask,               K_AUX2}
+               { cmdKey,                                               K_AUX1 },
+               { shiftKey,                                             K_SHIFT },
+               { alphaLock,                                    K_CAPSLOCK },
+               { optionKey,                                    K_ALT },
+               { controlKey,                                   K_CTRL },
+               { kEventKeyModifierNumLockMask, K_NUMLOCK },
+               { kEventKeyModifierFnMask,              K_AUX2 }
        };
        static UInt32 prev_keymod = 0;
        unsigned int i;
        UInt32 modChanges;
 
        modChanges = prev_keymod ^ keymod;
+       if (modChanges == 0)
+               return;
 
        for (i = 0; i < sizeof(keymod_events) / sizeof(keymod_events[0]); i++)
        {
-               int keybit = keymod_events[i].keybit;
+               UInt32 keybit = keymod_events[i].keybit;
 
                if ((modChanges & keybit) != 0)
                        Key_Event(keymod_events[i].event, '\0', (keymod & keybit) != 0);
@@ -769,11 +795,10 @@ void Sys_SendKeyEvents(void)
                                switch (eventKind)
                                {
                                        case kEventAppActivated :
-                                               vid_activewindow = true;
+                                               VID_AppFocusChanged(true);
                                                break;
                                        case kEventAppDeactivated:
-                                               vid_activewindow = false;
-                                               VID_RestoreSystemGamma();
+                                               VID_AppFocusChanged(false);
                                                break;
                                        case kEventAppQuit:
                                                Sys_Quit();