]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_glx.c
fix support for zip archives made by the standard Mac OSX archiver
[xonotic/darkplaces.git] / vid_glx.c
index 0bd0351f7793bb854f92d4bcfff2e44984115b50..fb011d13c4dc4c5c6013813b95a3b39a2dabcfc1 100644 (file)
--- a/vid_glx.c
+++ b/vid_glx.c
@@ -25,8 +25,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include <X11/Xutil.h>
 #include <GL/glx.h>
 
+#include "quakedef.h"
+
 #include <X11/keysym.h>
 #include <X11/cursorfont.h>
+#include <X11/xpm.h>
 
 #include <X11/extensions/XShm.h>
 #if !defined(__APPLE__) && !defined(__MACH__) && !defined(SUNOS)
@@ -34,7 +37,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #endif
 #include <X11/extensions/xf86vmode.h>
 
-#include "quakedef.h"
+#include "nexuiz.xpm"
+#include "darkplaces.xpm"
 
 // Tell startup code that we have a client
 int cl_available = true;
@@ -85,6 +89,7 @@ Atom wm_delete_window_atom;
 
 static qboolean mouse_avail = true;
 static qboolean vid_usingmouse = false;
+static qboolean vid_usingdgamouse = false;
 static qboolean vid_usingvsync = false;
 static qboolean vid_usevsync = false;
 static qboolean vid_x11_hardwaregammasupported = false;
@@ -250,6 +255,10 @@ static void IN_Activate (qboolean grab)
                return;
        if (grab)
        {
+#if !defined(__APPLE__) && !defined(SUNOS)
+               if(vid_usingmouse && (vid_usingdgamouse != !!vid_dgamouse.integer))
+                       IN_Activate(false); // ungrab first!
+#endif
                if (!vid_usingmouse && mouse_avail && win)
                {
                        XWindowAttributes attribs_1;
@@ -278,8 +287,9 @@ static void IN_Activate (qboolean grab)
                                XGrabKeyboard(vidx11_display, win, False, GrabModeAsync, GrabModeAsync, CurrentTime);
 
                        mouse_x = mouse_y = 0;
-                       cl_ignoremousemove = true;
+                       cl_ignoremousemoves = 2;
                        vid_usingmouse = true;
+                       vid_usingdgamouse = !!vid_dgamouse.integer;
                }
        }
        else
@@ -298,7 +308,7 @@ static void IN_Activate (qboolean grab)
                        if (win)
                                XUndefineCursor(vidx11_display, win);
 
-                       cl_ignoremousemove = true;
+                       cl_ignoremousemoves = 2;
                        vid_usingmouse = false;
                }
        }
@@ -409,6 +419,11 @@ static void HandleEvents(void)
                        // window changed size/location
                        win_x = event.xconfigure.x;
                        win_y = event.xconfigure.y;
+                       if(vid_resizable.integer < 2)
+                       {
+                               vid.width = event.xconfigure.width;
+                               vid.height = event.xconfigure.height;
+                       }
                        break;
                case DestroyNotify:
                        // window has been destroyed
@@ -598,30 +613,40 @@ void VID_Init(void)
                mouse_avail = false;
 }
 
-void VID_BuildGLXAttrib(int *attrib, qboolean stencil, qboolean stereobuffer)
+void VID_BuildGLXAttrib(int *attrib, qboolean stencil, qboolean stereobuffer, int samples)
 {
        *attrib++ = GLX_RGBA;
-       *attrib++ = GLX_RED_SIZE;*attrib++ = 1;
-       *attrib++ = GLX_GREEN_SIZE;*attrib++ = 1;
-       *attrib++ = GLX_BLUE_SIZE;*attrib++ = 1;
+       *attrib++ = GLX_RED_SIZE;*attrib++ = stencil ? 8 : 5;
+       *attrib++ = GLX_GREEN_SIZE;*attrib++ = stencil ? 8 : 5;
+       *attrib++ = GLX_BLUE_SIZE;*attrib++ = stencil ? 8 : 5;
        *attrib++ = GLX_DOUBLEBUFFER;
-       *attrib++ = GLX_DEPTH_SIZE;*attrib++ = 1;
+       *attrib++ = GLX_DEPTH_SIZE;*attrib++ = stencil ? 24 : 16;
        // if stencil is enabled, ask for alpha too
        if (stencil)
        {
                *attrib++ = GLX_STENCIL_SIZE;*attrib++ = 8;
-               *attrib++ = GLX_ALPHA_SIZE;*attrib++ = 1;
+               *attrib++ = GLX_ALPHA_SIZE;*attrib++ = 8;
        }
        if (stereobuffer)
                *attrib++ = GLX_STEREO;
+       if (samples > 1)
+       {
+               *attrib++ = GLX_SAMPLE_BUFFERS_ARB;
+               *attrib++ = 1;
+               *attrib++ = GLX_SAMPLES_ARB;
+               *attrib++ = samples;
+       }
        *attrib++ = 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)
 {
        int i;
        int attrib[32];
        XSetWindowAttributes attr;
+       XClassHint *clshints;
+       XWMHints *wmhints;
+       XSizeHints *szhints;
        unsigned long mask;
        Window root;
        XVisualInfo *visinfo;
@@ -675,8 +700,15 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
                return false;
        }
 
-       VID_BuildGLXAttrib(attrib, bpp == 32, stereobuffer);
+       VID_BuildGLXAttrib(attrib, bpp == 32, stereobuffer, samples);
        visinfo = qglXChooseVisual(vidx11_display, vidx11_screen, attrib);
+       if (!visinfo && (samples == 1))
+       {
+                /* Some Mesa drivers reject sample buffers with 1 sample, so try
+                 * entirely without one */
+               VID_BuildGLXAttrib(attrib, bpp == 32, stereobuffer, 0);
+               visinfo = qglXChooseVisual(vidx11_display, vidx11_screen, attrib);
+       }
        if (!visinfo)
        {
                Con_Print("Couldn't get an RGB, Double-buffered, Depth visual\n");
@@ -759,7 +791,30 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
                mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
 
        win = XCreateWindow(vidx11_display, root, 0, 0, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr);
-       XStoreName(vidx11_display, win, gamename);
+
+       wmhints = XAllocWMHints();
+       if(XpmCreatePixmapFromData(vidx11_display, win,
+               (gamemode == GAME_NEXUIZ) ? nexuiz_xpm : darkplaces_xpm,
+               &wmhints->icon_pixmap, &wmhints->icon_mask, NULL) == XpmSuccess)
+               wmhints->flags |= IconPixmapHint | IconMaskHint;
+
+       clshints = XAllocClassHint();
+       clshints->res_name = strdup(gamename);
+       clshints->res_class = strdup("DarkPlaces");
+
+       szhints = XAllocSizeHints();
+       if(vid_resizable.integer == 0)
+       {
+               szhints->min_width = szhints->max_width = width;
+               szhints->min_height = szhints->max_height = height;
+               szhints->flags |= PMinSize | PMaxSize;
+       }
+
+       XmbSetWMProperties(vidx11_display, win, gamename, gamename, (char **) com_argv, com_argc, szhints, wmhints, clshints);
+       XFree(clshints);
+       XFree(wmhints);
+       XFree(szhints);
+       //XStoreName(vidx11_display, win, gamename);
        XMapWindow(vidx11_display, win);
 
        // LordHavoc: making the close button on a window do the right thing
@@ -807,6 +862,17 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
        gl_platform = "GLX";
        gl_platformextensions = qglXQueryExtensionsString(vidx11_display, vidx11_screen);
 
+       if (!gl_extensions)
+               gl_extensions = "";
+       if (!gl_platformextensions)
+               gl_platformextensions = "";
+
+       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);
+
        gl_videosyncavailable = false;
 
 // COMMANDLINEOPTION: Linux GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions)