X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=vid_glx.c;h=9ac4e02fab1e54c66e3c3d22daa71d25df10fa28;hb=d438d686e33ea33d17e8b68a6d25359881639b6d;hp=c0a7efc82bca7865aea6d9e99edeab660d8866ed;hpb=f510b19bbe2aa254df1a11f7f492771a9651fd7e;p=xonotic%2Fdarkplaces.git diff --git a/vid_glx.c b/vid_glx.c index c0a7efc8..9ac4e02f 100644 --- a/vid_glx.c +++ b/vid_glx.c @@ -17,6 +17,10 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#if !defined(__APPLE__) && !defined(__MACH__) && !defined(SUNOS) +//#define USEDGA +#endif + #include #include @@ -35,7 +39,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include -#if !defined(__APPLE__) && !defined(__MACH__) && !defined(SUNOS) +#ifdef USEDGA #include #endif #include @@ -89,7 +93,7 @@ static Window win, root; static GLXContext ctx = NULL; static GC vidx11_gc = NULL; static XImage *vidx11_ximage[2] = { NULL, NULL }; -static int vidx11_ximage_pos; +static int vidx11_ximage_pos = 0; static XShmSegmentInfo vidx11_shminfo[2]; static int vidx11_shmevent = -1; static int vidx11_shmwait = 0; // number of frames outstanding @@ -116,10 +120,12 @@ static qboolean vid_usinghidecursor = false; static qboolean vid_usingvsync = false; static qboolean vid_usevsync = false; static qboolean vid_x11_hardwaregammasupported = false; +#ifdef USEDGA static qboolean vid_x11_dgasupported = false; +#endif static int vid_x11_gammarampsize = 0; -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA cvar_t vid_dgamouse = {CVAR_SAVE, "vid_dgamouse", "0", "make use of DGA mouse input"}; static qboolean vid_usingdgamouse = false; #endif @@ -141,8 +147,8 @@ static Colormap vidx11_colormap; /*-----------------------------------------------------------------------*/ // -long keysym2ucs(KeySym keysym); -void DP_Xutf8LookupString(XKeyEvent * ev, +extern long keysym2ucs(KeySym keysym); // LordHavoc: suppress warning just in this case, it's not worth having a header file for this... +static void DP_Xutf8LookupString(XKeyEvent * ev, Uchar *uch, KeySym * keysym_return, Status * status_return) @@ -278,7 +284,9 @@ static int XLateKey(XKeyEvent *ev, Uchar *ascii) case XK_KP_Subtract: key = K_KP_MINUS; break; case XK_KP_Divide: key = K_KP_SLASH; break; - case XK_section: key = '~'; break; + case XK_asciicircum: *ascii = key = '^'; break; // for some reason, XLookupString returns "" on this one for Grunt|2 + + case XK_section: *ascii = key = '~'; break; default: if (keysym < 32) @@ -323,7 +331,7 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso static int originalmouseparms_threshold; static qboolean restore_spi; -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA qboolean usedgamouse; #endif @@ -336,7 +344,7 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso if (!mouse_avail) fullscreengrab = relative = hidecursor = false; -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA usedgamouse = relative && vid_dgamouse.integer; if (!vid_x11_dgasupported) usedgamouse = false; @@ -372,7 +380,7 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso attribs_2.event_mask = attribs_1.your_event_mask | KEY_MASK | MOUSE_MASK; XChangeWindowAttributes(vidx11_display, win, CWEventMask, &attribs_2); -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA vid_usingdgamouse = usedgamouse; if (usedgamouse) { @@ -384,7 +392,7 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, vid.width / 2, vid.height / 2); // COMMANDLINEOPTION: X11 Input: -noforcemparms disables setting of mouse parameters (not used with DGA, windows only) -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA if (!COM_CheckParm ("-noforcemparms") && !usedgamouse) #else if (!COM_CheckParm ("-noforcemparms")) @@ -405,7 +413,7 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso { if (vid_usingmouse) { -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA if (vid_usingdgamouse) XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), 0); vid_usingdgamouse = false; @@ -518,7 +526,7 @@ static qboolean BuildXImages(int w, int h) } else { - for(i = 0; i < 2; ++i) + for(i = 0; i < 1; ++i) // we only need one buffer if we don't use Xshm { char *p = calloc(4, w * h); vidx11_shminfo[i].shmid = -1; @@ -597,7 +605,7 @@ static void HandleEvents(void) // mouse moved if (vid_usingmouse) { -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA if (vid_usingdgamouse) { in_mouse_x += event.xmotion.x_root; @@ -829,9 +837,10 @@ void *GL_GetProcAddress(const char *name) void VID_Shutdown(void) { - if (!ctx || !vidx11_display) + if (!vidx11_display) return; + VID_EnableJoystick(false); VID_SetMouse(false, false, false); VID_RestoreSystemGamma(); @@ -849,6 +858,7 @@ void VID_Shutdown(void) if (vid.softdepthpixels) free(vid.softdepthpixels); + vid.softdepthpixels = NULL; if (win) XDestroyWindow(vidx11_display, win); @@ -867,14 +877,14 @@ void VID_Shutdown(void) Key_ClearStates (); } -void signal_handler(int sig) +static void signal_handler(int sig) { Con_Printf("Received signal %d, exiting...\n", sig); VID_RestoreSystemGamma(); Sys_Quit(1); } -void InitSig(void) +static void InitSig(void) { signal(SIGHUP, signal_handler); signal(SIGINT, signal_handler); @@ -894,11 +904,11 @@ void VID_Finish (void) switch(vid.renderpath) { case RENDERPATH_SOFT: - vidx11_ximage_pos = !vidx11_ximage_pos; - vid.softpixels = (unsigned int *) vidx11_ximage[vidx11_ximage_pos]->data; - DPSOFTRAST_SetRenderTargets(vid.width, vid.height, vid.softdepthpixels, vid.softpixels, NULL, NULL, NULL); - if(vidx11_shmevent >= 0) { + vidx11_ximage_pos = !vidx11_ximage_pos; + vid.softpixels = (unsigned int *) vidx11_ximage[vidx11_ximage_pos]->data; + DPSOFTRAST_SetRenderTargets(vid.width, vid.height, vid.softdepthpixels, vid.softpixels, NULL, NULL, NULL); + // save mouse motion so we can deal with it later in_mouse_x = 0; in_mouse_y = 0; @@ -912,13 +922,16 @@ void VID_Finish (void) ++vidx11_shmwait; XShmPutImage(vidx11_display, win, vidx11_gc, vidx11_ximage[!vidx11_ximage_pos], 0, 0, 0, 0, vid.width, vid.height, True); } else { - XPutImage(vidx11_display, win, vidx11_gc, vidx11_ximage[!vidx11_ximage_pos], 0, 0, 0, 0, vid.width, vid.height); + // no buffer switching here, we just flush the renderer + DPSOFTRAST_Finish(); + XPutImage(vidx11_display, win, vidx11_gc, vidx11_ximage[vidx11_ximage_pos], 0, 0, 0, 0, vid.width, vid.height); } break; case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: if (vid_usingvsync != vid_usevsync) { @@ -958,7 +971,7 @@ int VID_GetGamma(unsigned short *ramps, int rampsize) void VID_Init(void) { -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA Cvar_RegisterVariable (&vid_dgamouse); #endif Cvar_RegisterVariable (&vid_netwmfullscreen); @@ -970,7 +983,7 @@ void VID_Init(void) vidx11_shminfo[1].shmid = -1; } -void VID_BuildGLXAttrib(int *attrib, qboolean stencil, qboolean stereobuffer, int samples) +static void VID_BuildGLXAttrib(int *attrib, qboolean stencil, qboolean stereobuffer, int samples) { *attrib++ = GLX_RGBA; *attrib++ = GLX_RED_SIZE;*attrib++ = stencil ? 8 : 5; @@ -996,7 +1009,7 @@ void VID_BuildGLXAttrib(int *attrib, qboolean stencil, qboolean stereobuffer, in *attrib++ = None; } -qboolean VID_InitModeSoft(viddef_mode_t *mode) +static qboolean VID_InitModeSoft(viddef_mode_t *mode) { int i, j; XSetWindowAttributes attr; @@ -1010,6 +1023,7 @@ qboolean VID_InitModeSoft(viddef_mode_t *mode) unsigned char *data; XGCValues gcval; const char *dpyname; + char vabuf[1024]; vid_isfullscreen = false; vid_isnetwmfullscreen = false; @@ -1183,7 +1197,7 @@ qboolean VID_InitModeSoft(viddef_mode_t *mode) } ++i; Mem_Free(data); - data = loadimagepixelsbgra(va("darkplaces-icon%d", i), false, false, false, NULL); + data = loadimagepixelsbgra(va(vabuf, sizeof(vabuf), "darkplaces-icon%d", i), false, false, false, NULL); } XChangeProperty(vidx11_display, win, net_wm_icon, cardinal, 32, PropModeReplace, (const unsigned char *) netwm_icon, pos); } @@ -1283,7 +1297,7 @@ qboolean VID_InitModeSoft(viddef_mode_t *mode) vid_hidden = false; vid_activewindow = true; vid_x11_hardwaregammasupported = XF86VidModeGetGammaRampSize(vidx11_display, vidx11_screen, &vid_x11_gammarampsize) != 0; -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA vid_x11_dgasupported = XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion); if (!vid_x11_dgasupported) Con_Print( "Failed to detect XF86DGA Mouse extension\n" ); @@ -1293,7 +1307,8 @@ qboolean VID_InitModeSoft(viddef_mode_t *mode) return true; } -qboolean VID_InitModeGL(viddef_mode_t *mode) + +static qboolean VID_InitModeGL(viddef_mode_t *mode) { int i, j; int attrib[32]; @@ -1308,6 +1323,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) char *xpm; char **idata; unsigned char *data; + char vabuf[1024]; vid_isfullscreen = false; vid_isnetwmfullscreen = false; @@ -1516,7 +1532,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) } ++i; Mem_Free(data); - data = loadimagepixelsbgra(va("darkplaces-icon%d", i), false, false, false, NULL); + data = loadimagepixelsbgra(va(vabuf, sizeof(vabuf), "darkplaces-icon%d", i), false, false, false, NULL); } XChangeProperty(vidx11_display, win, net_wm_icon, cardinal, 32, PropModeReplace, (const unsigned char *) netwm_icon, pos); } @@ -1621,7 +1637,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) vid_hidden = false; vid_activewindow = true; vid_x11_hardwaregammasupported = XF86VidModeGetGammaRampSize(vidx11_display, vidx11_screen, &vid_x11_gammarampsize) != 0; -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA vid_x11_dgasupported = XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion); if (!vid_x11_dgasupported) Con_Print( "Failed to detect XF86DGA Mouse extension\n" ); @@ -1666,8 +1682,34 @@ void Sys_SendKeyEvents(void) HandleEvents(); } +void VID_BuildJoyState(vid_joystate_t *joystate) +{ + VID_Shared_BuildJoyState_Begin(joystate); + VID_Shared_BuildJoyState_Finish(joystate); +} + +void VID_EnableJoystick(qboolean enable) +{ + int index = joy_enable.integer > 0 ? joy_index.integer : -1; + qboolean success = false; + int sharedcount = 0; + sharedcount = VID_Shared_SetJoystick(index); + if (index >= 0 && index < sharedcount) + success = true; + + // update cvar containing count of XInput joysticks + if (joy_detected.integer != sharedcount) + Cvar_SetValueQuick(&joy_detected, sharedcount); + + Cvar_SetValueQuick(&joy_active, success ? 1 : 0); +} + void IN_Move (void) { + vid_joystate_t joystate; + VID_EnableJoystick(true); + VID_BuildJoyState(&joystate); + VID_ApplyJoyState(&joystate); } size_t VID_ListModes(vid_mode_t *modes, size_t maxcount)