]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_glx.c
changed lhrandom to use the full RAND_MAX limit (more random, after all the low bits...
[xonotic/darkplaces.git] / vid_glx.c
index 37b6d5aa24f7fdcb2baf4fc6654f0f58571f4d1b..a96e3f9f7faf0e4327336a1970987387e8f6aae9 100644 (file)
--- a/vid_glx.c
+++ b/vid_glx.c
@@ -35,11 +35,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include <X11/cursorfont.h>
 
 #include <X11/extensions/XShm.h>
+#if !defined(__APPLE__) && !defined(__MACH__)
 #include <X11/extensions/xf86dga.h>
+#endif
 #include <X11/extensions/xf86vmode.h>
 
 #include "quakedef.h"
 
+// Tell startup code that we have a client
 int cl_available = true;
 
 //GLX prototypes
@@ -86,12 +89,14 @@ Atom wm_delete_window_atom;
 
 
 static qboolean                mouse_avail = true;
-static qboolean                mouse_active = false, usingmouse = false;
+static qboolean                mouse_active = false, usingmouse = false, ignoremousemove = false;
 static float   mouse_x, mouse_y;
 static int p_mouse_x, p_mouse_y;
 
+#ifndef __APPLE__
 cvar_t vid_dga = {CVAR_SAVE, "vid_dga", "1"};
 cvar_t vid_dga_mouseaccel = {0, "vid_dga_mouseaccel", "1"};
+#endif
 
 qboolean vidmode_ext = false;
 
@@ -254,6 +259,7 @@ static void install_grabs(void)
 
        XGrabPointer(vidx11_display, win,  True, 0, GrabModeAsync, GrabModeAsync, win, None, CurrentTime);
 
+#ifndef __APPLE__
        if (vid_dga.integer)
        {
                int MajorVersion, MinorVersion;
@@ -261,7 +267,7 @@ static void install_grabs(void)
                if (!XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion))
                {
                        // unable to query, probalby not supported
-                       Con_Printf( "Failed to detect XF86DGA Mouse\n" );
+                       Con_Print( "Failed to detect XF86DGA Mouse\n" );
                        vid_dga.integer = 0;
                }
                else
@@ -272,12 +278,14 @@ static void install_grabs(void)
                }
        }
        else
+#endif
                XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, scr_width / 2, scr_height / 2);
 
        XGrabKeyboard(vidx11_display, win, False, GrabModeAsync, GrabModeAsync, CurrentTime);
 
        mouse_active = true;
        mouse_x = mouse_y = 0;
+       ignoremousemove = true;
 }
 
 static void uninstall_grabs(void)
@@ -285,8 +293,10 @@ static void uninstall_grabs(void)
        if (!vidx11_display || !win)
                return;
 
+#ifndef __APPLE__
        if (vid_dga.integer == 1)
                XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), 0);
+#endif
 
        XUngrabPointer(vidx11_display, CurrentTime);
        XUngrabKeyboard(vidx11_display, CurrentTime);
@@ -295,6 +305,7 @@ static void uninstall_grabs(void)
        XUndefineCursor(vidx11_display, win);
 
        mouse_active = false;
+       ignoremousemove = true;
 }
 
 static void HandleEvents(void)
@@ -329,12 +340,14 @@ static void HandleEvents(void)
                        // mouse moved
                        if (usingmouse)
                        {
+#ifndef __APPLE__
                                if (vid_dga.integer == 1)
                                {
                                        mouse_x += event.xmotion.x_root * vid_dga_mouseaccel.value;
                                        mouse_y += event.xmotion.y_root * vid_dga_mouseaccel.value;
                                }
                                else
+#endif
                                {
 
                                        if (!event.xmotion.send_event)
@@ -348,8 +361,8 @@ static void HandleEvents(void)
                                        p_mouse_y = event.xmotion.y;
                                }
                        }
-                       else
-                               ui_mouseupdate(event.xmotion.x, event.xmotion.y);
+                       //else
+                       //      ui_mouseupdate(event.xmotion.x, event.xmotion.y);
                        break;
 
                case ButtonPress:
@@ -468,24 +481,20 @@ static void HandleEvents(void)
                        // window restored
                        vid_hidden = false;
                        vid_activewindow = false;
-                       vid_allowhwgamma = false;
                        VID_RestoreSystemGamma();
                        break;
                case UnmapNotify:
                        // window iconified/rolledup/whatever
                        vid_hidden = true;
                        vid_activewindow = false;
-                       vid_allowhwgamma = false;
                        VID_RestoreSystemGamma();
                        break;
                case FocusIn:
                        // window is now the input focus
-                       vid_allowhwgamma = true;
                        vid_activewindow = true;
                        break;
                case FocusOut:
                        // window is no longer the input focus
-                       vid_allowhwgamma = false;
                        vid_activewindow = false;
                        VID_RestoreSystemGamma();
                        break;
@@ -506,6 +515,13 @@ static void HandleEvents(void)
                XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, p_mouse_x, p_mouse_y);
        }
 
+       // if told to ignore one mouse move, do so
+       if (ignoremousemove)
+       {
+               ignoremousemove = false;
+               mouse_x = 0;
+               mouse_y = 0;
+       }
 }
 
 static void IN_DeactivateMouse( void )
@@ -527,7 +543,6 @@ static void IN_ActivateMouse( void )
 
        if (!mouse_active)
        {
-               mouse_x = mouse_y = 0; // don't spazz
                install_grabs();
                mouse_active = true;
        }
@@ -600,7 +615,8 @@ void VID_Finish (void)
        int usemouse;
        if (r_render.integer)
        {
-               qglFinish();
+               if (r_speeds.integer || gl_finish.integer)
+                       qglFinish();
                qglXSwapBuffers(vidx11_display, win);
        }
 
@@ -640,9 +656,12 @@ int VID_GetGamma(unsigned short *ramps)
 
 void VID_Init(void)
 {
+#ifndef __APPLE__
        Cvar_RegisterVariable (&vid_dga);
        Cvar_RegisterVariable (&vid_dga_mouseaccel);
+#endif
        InitSig(); // trap evil signals
+// COMMANDLINEOPTION: Input: -nomouse disables mouse support (see also vid_mouse cvar)
        if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe"))
                mouse_avail = false;
 }
@@ -675,7 +694,14 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp)
        int MajorVersion, MinorVersion;
        const char *drivername;
 
+#if defined(__APPLE__) && defined(__MACH__)
+       drivername = "/usr/X11R6/lib/libGL.1.dylib";
+#else
        drivername = "libGL.so.1";
+#endif
+// COMMANDLINEOPTION: Linux GLX: -gl_driver <drivername> selects a GL driver library, default is libGL.so.1, useful only for using fxmesa or similar, if you don't know what this is for, you don't need it
+// COMMANDLINEOPTION: BSD GLX: -gl_driver <drivername> selects a GL driver library, default is libGL.so.1, useful only for using fxmesa or similar, if you don't know what this is for, you don't need it
+// LordHavoc: although this works on MacOSX, it's useless there (as there is only one system libGL)
        i = COM_CheckParm("-gl_driver");
        if (i && i < com_argc - 1)
                drivername = com_argv[i + 1];
@@ -687,7 +713,7 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp)
 
        if (!(vidx11_display = XOpenDisplay(NULL)))
        {
-               Con_Printf("Couldn't open the X display\n");
+               Con_Print("Couldn't open the X display\n");
                return false;
        }
 
@@ -718,7 +744,7 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp)
        visinfo = qglXChooseVisual(vidx11_display, vidx11_screen, attrib);
        if (!visinfo)
        {
-               Con_Printf("Couldn't get an RGB, Double-buffered, Depth visual\n");
+               Con_Print("Couldn't get an RGB, Double-buffered, Depth visual\n");
                return false;
        }
 
@@ -830,12 +856,21 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp)
        gl_platform = "GLX";
        gl_platformextensions = qglXQueryExtensionsString(vidx11_display, vidx11_screen);
 
+       gl_videosyncavailable = false;
+
+// COMMANDLINEOPTION: Linux GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions)
+// COMMANDLINEOPTION: BSD GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions)
+// COMMANDLINEOPTION: MacOSX GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions)
        GL_CheckExtension("GLX_ARB_get_proc_address", getprocaddressfuncs, "-nogetprocaddress", false);
+// COMMANDLINEOPTION: Linux GLX: -novideosync disables GLX_SGI_video_sync
+// COMMANDLINEOPTION: BSD GLX: -novideosync disables GLX_SGI_video_sync
+// COMMANDLINEOPTION: MacOSX GLX: -novideosync disables GLX_SGI_video_sync
        gl_videosyncavailable = GL_CheckExtension("GLX_SGI_video_sync", videosyncfuncs, "-novideosync", false);
 
        usingmouse = false;
+       ignoremousemove = true;
        vid_hidden = false;
-       vid_allowhwgamma = true;
+       vid_activewindow = true;
        GL_Init();
        return true;
 }