X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=vid_glx.c;h=fc4cdcb735793508f5631d2c5bb43fcfecd254c6;hb=65c5c9c594e16a38c8eae6107ea2b93237a9367f;hp=a80277ff251c0f92611ce605b951663a8768fe9b;hpb=58fb771fc98f2d04990c947944cd199007ea1666;p=xonotic%2Fdarkplaces.git diff --git a/vid_glx.c b/vid_glx.c index a80277ff..fc4cdcb7 100644 --- 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, int bpp) +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, int bpp) || (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, int bpp) 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, int bpp) 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