]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_glx.c
cleanup of precache messages and assorted comments
[xonotic/darkplaces.git] / vid_glx.c
index 33ecded764021e3467925582cc2b502a23a05663..fc4cdcb735793508f5631d2c5bb43fcfecd254c6 100644 (file)
--- a/vid_glx.c
+++ b/vid_glx.c
@@ -53,7 +53,7 @@ const char *(GLAPIENTRY *qglXQueryExtensionsString)(Display *dpy, int screen);
 //GLX_ARB_get_proc_address
 void *(GLAPIENTRY *qglXGetProcAddressARB)(const GLubyte *procName);
 
-static gl_extensionfunctionlist_t getprocaddressfuncs[] =
+static dllfunction_t getprocaddressfuncs[] =
 {
        {"glXGetProcAddressARB", (void **) &qglXGetProcAddressARB},
        {NULL, NULL}
@@ -63,7 +63,7 @@ static gl_extensionfunctionlist_t getprocaddressfuncs[] =
 GLint (GLAPIENTRY *qglXGetVideoSyncSGI)(GLuint *count);
 GLint (GLAPIENTRY *qglXWaitVideoSyncSGI)(int divisor, int remainder, unsigned int *count);
 
-static gl_extensionfunctionlist_t videosyncfuncs[] =
+static dllfunction_t videosyncfuncs[] =
 {
        {"glXGetVideoSyncSGI", (void **) &qglXGetVideoSyncSGI},
        {"glXWaitVideoSyncSGI", (void **) &qglXWaitVideoSyncSGI},
@@ -83,8 +83,6 @@ Atom wm_delete_window_atom;
 #define X_MASK (KEY_MASK | MOUSE_MASK | VisibilityChangeMask | StructureNotifyMask )
 
 
-viddef_t       vid;                            // global video state
-
 static qboolean                mouse_avail = true;
 static qboolean                mouse_active = false, usingmouse = false;
 static float   mouse_x, mouse_y;
@@ -108,105 +106,127 @@ static Colormap vidx11_colormap;
 
 /*-----------------------------------------------------------------------*/
 
-static int
-XLateKey(XKeyEvent *ev)
+static int XLateKey(XKeyEvent *ev)
 {
        int key = 0;
+       char buf[64];
        KeySym keysym;
 
-       keysym = XLookupKeysym(ev, 0);
+       XLookupString(ev, buf, sizeof buf, &keysym, 0);
 
        switch(keysym)
        {
-               case XK_KP_Page_Up:     key = KP_PGUP; break;
-               case XK_Page_Up:        key = K_PGUP; break;
+               case XK_KP_Page_Up:      key = K_KP_PGUP; break;
+               case XK_Page_Up:         key = K_PGUP; break;
+
+               case XK_KP_Page_Down: key = K_KP_PGDN; break;
+               case XK_Page_Down:       key = K_PGDN; break;
+
+               case XK_KP_Home: key = K_KP_HOME; break;
+               case XK_Home:    key = K_HOME; break;
+
+               case XK_KP_End:  key = K_KP_END; break;
+               case XK_End:     key = K_END; break;
+
+               case XK_KP_Left: key = K_KP_LEFTARROW; break;
+               case XK_Left:    key = K_LEFTARROW; break;
+
+               case XK_KP_Right: key = K_KP_RIGHTARROW; break;
+               case XK_Right:  key = K_RIGHTARROW;             break;
+
+               case XK_KP_Down: key = K_KP_DOWNARROW; break;
+               case XK_Down:    key = K_DOWNARROW; break;
+
+               case XK_KP_Up:   key = K_KP_UPARROW; break;
+               case XK_Up:              key = K_UPARROW;        break;
 
-               case XK_KP_Page_Down:   key = KP_PGDN; break;
-               case XK_Page_Down:      key = K_PGDN; break;
+               case XK_Escape: key = K_ESCAPE;         break;
 
-               case XK_KP_Home:        key = KP_HOME; break;
-               case XK_Home:           key = K_HOME; break;
+               case XK_KP_Enter: key = K_KP_ENTER;     break;
+               case XK_Return: key = K_ENTER;           break;
 
-               case XK_KP_End:         key = KP_END; break;
-               case XK_End:            key = K_END; break;
+               case XK_Tab:            key = K_TAB;                     break;
 
-               case XK_KP_Left:        key = KP_LEFTARROW; break;
-               case XK_Left:           key = K_LEFTARROW; break;
+               case XK_F1:              key = K_F1;                            break;
 
-               case XK_KP_Right:       key = KP_RIGHTARROW; break;
-               case XK_Right:          key = K_RIGHTARROW; break;
+               case XK_F2:              key = K_F2;                            break;
 
-               case XK_KP_Down:        key = KP_DOWNARROW; break;
-               case XK_Down:           key = K_DOWNARROW; break;
+               case XK_F3:              key = K_F3;                            break;
 
-               case XK_KP_Up:          key = KP_UPARROW; break;
-               case XK_Up:                     key = K_UPARROW; break;
+               case XK_F4:              key = K_F4;                            break;
 
-               case XK_Escape:         key = K_ESCAPE; break;
+               case XK_F5:              key = K_F5;                            break;
 
-               case XK_KP_Enter:       key = KP_ENTER; break;
-               case XK_Return:         key = K_ENTER; break;
+               case XK_F6:              key = K_F6;                            break;
 
-               case XK_Tab:            key = K_TAB; break;
+               case XK_F7:              key = K_F7;                            break;
 
-               case XK_F1:                     key = K_F1; break;
-               case XK_F2:                     key = K_F2; break;
-               case XK_F3:                     key = K_F3; break;
-               case XK_F4:                     key = K_F4; break;
-               case XK_F5:                     key = K_F5; break;
-               case XK_F6:                     key = K_F6; break;
-               case XK_F7:                     key = K_F7; break;
-               case XK_F8:                     key = K_F8; break;
-               case XK_F9:                     key = K_F9; break;
-               case XK_F10:            key = K_F10; break;
-               case XK_F11:            key = K_F11; break;
-               case XK_F12:            key = K_F12; break;
+               case XK_F8:              key = K_F8;                            break;
 
-               case XK_BackSpace:      key = K_BACKSPACE; break;
+               case XK_F9:              key = K_F9;                            break;
 
-               case XK_KP_Delete:      key = KP_DEL; break;
-               case XK_Delete:         key = K_DEL; break;
+               case XK_F10:            key = K_F10;                     break;
 
-               case XK_Pause:          key = K_PAUSE; break;
+               case XK_F11:            key = K_F11;                     break;
+
+               case XK_F12:            key = K_F12;                     break;
+
+               case XK_BackSpace: key = K_BACKSPACE; break;
+
+               case XK_KP_Delete: key = K_KP_DEL; break;
+               case XK_Delete: key = K_DEL; break;
+
+               case XK_Pause:  key = K_PAUSE;           break;
 
                case XK_Shift_L:
-               case XK_Shift_R:        key = K_SHIFT; break;
+               case XK_Shift_R:        key = K_SHIFT;          break;
 
                case XK_Execute:
                case XK_Control_L:
-               case XK_Control_R:      key = K_CTRL; break;
+               case XK_Control_R:      key = K_CTRL;            break;
 
-               case XK_Mode_switch:
                case XK_Alt_L:
                case XK_Meta_L:
                case XK_Alt_R:
-               case XK_Meta_R:         key = K_ALT; break;
+               case XK_Meta_R: key = K_ALT;                    break;
 
-               case XK_Caps_Lock:      key = K_CAPSLOCK; break;
-               case XK_KP_Begin:       key = KP_5; break;
+               case XK_KP_Begin: key = K_KP_5; break;
 
-               case XK_Insert:         key = K_INS; break;
-               case XK_KP_Insert:      key = KP_INS; break;
+               case XK_Insert:key = K_INS; break;
+               case XK_KP_Insert: key = K_KP_INS; break;
 
-               case XK_KP_Multiply:    key = KP_MULTIPLY; break;
-               case XK_KP_Add:         key = KP_PLUS; break;
-               case XK_KP_Subtract:    key = KP_MINUS; break;
-               case XK_KP_Divide:      key = KP_DIVIDE; break;
+               case XK_KP_Multiply: key = '*'; break;
+               case XK_KP_Add:  key = K_KP_PLUS; break;
+               case XK_KP_Subtract: key = K_KP_MINUS; break;
+               case XK_KP_Divide: key = K_KP_SLASH; break;
 
-               /* For Sun keyboards */
-               case XK_F27:            key = K_HOME; break;
-               case XK_F29:            key = K_PGUP; break;
-               case XK_F33:            key = K_END; break;
-               case XK_F35:            key = K_PGDN; break;
+#if 0
+               case 0x021: key = '1';break;/* [!] */
+               case 0x040: key = '2';break;/* [@] */
+               case 0x023: key = '3';break;/* [#] */
+               case 0x024: key = '4';break;/* [$] */
+               case 0x025: key = '5';break;/* [%] */
+               case 0x05e: key = '6';break;/* [^] */
+               case 0x026: key = '7';break;/* [&] */
+               case 0x02a: key = '8';break;/* [*] */
+               case 0x028: key = '9';;break;/* [(] */
+               case 0x029: key = '0';break;/* [)] */
+               case 0x05f: key = '-';break;/* [_] */
+               case 0x02b: key = '=';break;/* [+] */
+               case 0x07c: key = '\'';break;/* [|] */
+               case 0x07d: key = '[';break;/* [}] */
+               case 0x07b: key = ']';break;/* [{] */
+               case 0x022: key = '\'';break;/* ["] */
+               case 0x03a: key = ';';break;/* [:] */
+               case 0x03f: key = '/';break;/* [?] */
+               case 0x03e: key = '.';break;/* [>] */
+               case 0x03c: key = ',';break;/* [<] */
+#endif
 
                default:
-                       if (keysym < 128)
-                       {
-                               /* ASCII keys */
-                               key = keysym;
-                               if ((key >= 'A') && (key <= 'Z'))
-                                       key = key + ('a' - 'A');
-                       }
+                       key = *(unsigned char*)buf;
+                       if (key >= 'A' && key <= 'Z')
+                               key = key - 'A' + 'a';
                        break;
        }
 
@@ -476,10 +496,13 @@ void VID_Shutdown(void)
        if (!ctx || !vidx11_display)
                return;
 
+       vid_hidden = true;
+       usingmouse = false;
        if (vidx11_display)
        {
                uninstall_grabs();
 
+               // FIXME: glXDestroyContext here?
                if (vidmode_active)
                        XF86VidModeSwitchToMode(vidx11_display, scrnum, vidmodes[0]);
                if (win)
@@ -636,49 +659,61 @@ int VID_SetGamma(float prescale, float gamma, float scale, float base)
 #endif
 }
 
-void VID_Init(int fullscreen, int width, int height)
+void VID_Init(void)
 {
-       int i;
-// LordHavoc: FIXME: finish this code, we need to allocate colors before we can store them
-#if 0
-       int gammaattrib[] =
+       Cvar_RegisterVariable (&vid_dga);
+       Cvar_RegisterVariable (&vid_dga_mouseaccel);
+       InitSig(); // trap evil signals
+       if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe"))
+               mouse_avail = false;
+}
+
+void VID_BuildGLXAttrib(int *attrib, int stencil, int gamma)
+{
+       *attrib++ = GLX_RGBA;
+       *attrib++ = GLX_RED_SIZE;*attrib++ = 1;
+       *attrib++ = GLX_GREEN_SIZE;*attrib++ = 1;
+       *attrib++ = GLX_BLUE_SIZE;*attrib++ = 1;
+       *attrib++ = GLX_DOUBLEBUFFER;
+       *attrib++ = GLX_DEPTH_SIZE;*attrib++ = 1;
+       // if stencil is enabled, ask for alpha too
+       if (stencil)
        {
-               GLX_RGBA,
-               GLX_RED_SIZE, 1,
-               GLX_GREEN_SIZE, 1,
-               GLX_BLUE_SIZE, 1,
-               GLX_DOUBLEBUFFER,
-               GLX_DEPTH_SIZE, 1,
-               GLX_X_VISUAL_TYPE, GLX_DIRECT_COLOR,
-               None
-       };
-#endif
-       int nogammaattrib[] =
+               *attrib++ = GLX_STENCIL_SIZE;*attrib++ = 8;
+               *attrib++ = GLX_ALPHA_SIZE;*attrib++ = 1;
+       }
+       if (gamma)
        {
-               GLX_RGBA,
-               GLX_RED_SIZE, 1,
-               GLX_GREEN_SIZE, 1,
-               GLX_BLUE_SIZE, 1,
-               GLX_DOUBLEBUFFER,
-               GLX_DEPTH_SIZE, 1,
-               None
+               *attrib++ = GLX_X_VISUAL_TYPE;*attrib++ = GLX_DIRECT_COLOR;
        };
+       *attrib++ = None;
+}
+
+int VID_InitMode(int fullscreen, int width, int height, int bpp, int stencil)
+{
+       int i;
+       int attrib[32];
        XSetWindowAttributes attr;
        unsigned long mask;
        Window root;
        XVisualInfo *visinfo;
        int MajorVersion, MinorVersion;
+       const char *drivername;
 
-       if (!GL_OpenLibrary("libGL.so.1"))
-               Sys_Error("Unable to load GL driver\n");
-
-       Cvar_RegisterVariable (&vid_dga);
-       Cvar_RegisterVariable (&vid_dga_mouseaccel);
+       drivername = "libGL.so.1";
+       i = COM_CheckParm("-gl_driver");
+       if (i && i < com_argc - 1)
+               drivername = com_argv[i + 1];
+       if (!GL_OpenLibrary(drivername))
+       {
+               Con_Printf("Unable to load GL driver \"%s\"\n", drivername);
+               return false;
+       }
 
        if (!(vidx11_display = XOpenDisplay(NULL)))
        {
-               fprintf(stderr, "Error couldn't open the X display\n");
-               exit(1);
+               Con_Printf("Couldn't open the X display\n");
+               return false;
        }
 
        scrnum = DefaultScreen(vidx11_display);
@@ -699,21 +734,28 @@ void VID_Init(int fullscreen, int width, int height)
         || (qglXMakeCurrent = GL_GetProcAddress("glXMakeCurrent")) == NULL
         || (qglXSwapBuffers = GL_GetProcAddress("glXSwapBuffers")) == NULL
         || (qglXQueryExtensionsString = GL_GetProcAddress("glXQueryExtensionsString")) == NULL)
-               Sys_Error("glX functions not found in %s\n", gl_driver);
+       {
+               Con_Printf("glX functions not found in %s\n", gl_driver);
+               return false;
+       }
 
        visinfo = NULL;
 // LordHavoc: FIXME: finish this code, we need to allocate colors before we can store them
 #if 0
        if (!COM_CheckParm("-nogamma"))
-               visinfo = qglXChooseVisual(vidx11_display, scrnum, gammaattrib);
+       {
+               VID_BuildGLXAttrib(attrib, stencil, true);
+               visinfo = qglXChooseVisual(vidx11_display, scrnum, attrib);
+       }
 #endif
        if (!visinfo)
        {
-               visinfo = qglXChooseVisual(vidx11_display, scrnum, nogammaattrib);
+               VID_BuildGLXAttrib(attrib, stencil, false);
+               visinfo = qglXChooseVisual(vidx11_display, scrnum, attrib);
                if (!visinfo)
                {
-                       Sys_Error("couldn't get an RGB, Double-buffered, Depth visual\n");
-                       exit(1);
+                       Con_Printf("Couldn't get an RGB, Double-buffered, Depth visual\n");
+                       return false;
                }
        }
 
@@ -802,11 +844,16 @@ void VID_Init(int fullscreen, int width, int height)
                XF86VidModeSetViewPort(vidx11_display, scrnum, 0, 0);
        }
 
-       XFlush(vidx11_display);
+       //XSync(vidx11_display, False);
 
        ctx = qglXCreateContext(vidx11_display, visinfo, NULL, True);
+       if (!ctx)
+               Sys_Error ("glXCreateContext failed\n");
+
+       if (!qglXMakeCurrent(vidx11_display, win, ctx))
+               Sys_Error ("glXMakeCurrent failed\n");
 
-       qglXMakeCurrent(vidx11_display, win, ctx);
+       XSync(vidx11_display, False);
 
        scr_width = width;
        scr_height = height;
@@ -824,13 +871,10 @@ void VID_Init(int fullscreen, int width, int height)
        GL_CheckExtension("GLX_ARB_get_proc_address", getprocaddressfuncs, "-nogetprocaddress", false);
        gl_videosyncavailable = GL_CheckExtension("GLX_SGI_video_sync", videosyncfuncs, "-novideosync", false);
 
-       InitSig(); // trap evil signals
-
+       usingmouse = false;
        vid_hidden = false;
-
        GL_Init();
-
-       Con_SafePrintf ("Video mode %dx%d initialized.\n", width, height);
+       return true;
 }
 
 void Sys_SendKeyEvents(void)
@@ -838,16 +882,6 @@ void Sys_SendKeyEvents(void)
        HandleEvents();
 }
 
-void IN_Init(void)
-{
-       if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe"))
-               mouse_avail = false;
-}
-
-void IN_Shutdown(void)
-{
-}
-
 /*
 ===========
 IN_Commands