X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=vid_glx.c;h=4c5c9c9d02f6b5b852b5dce49712289cd66a015d;hb=refs%2Fheads%2FColdSpirit%2Fcvar_onchange_stable;hp=b9c72d46e5197ac6c0acb8eed348ab253681bcaf;hpb=3bcfd24aa96ba851e8ba728a0c5e94dba19d44ad;p=xonotic%2Fdarkplaces.git diff --git a/vid_glx.c b/vid_glx.c index b9c72d46..4c5c9c9d 100644 --- a/vid_glx.c +++ b/vid_glx.c @@ -119,11 +119,9 @@ static qboolean vid_usingmouse = false; 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; #ifdef USEDGA cvar_t vid_dgamouse = {CVAR_SAVE, "vid_dgamouse", "0", "make use of DGA mouse input"}; @@ -140,6 +138,7 @@ static qboolean vid_isvidmodefullscreen = false; static qboolean vid_isdesktopfullscreen = false; static qboolean vid_isoverrideredirect = false; +static vid_mode_t desktop_mode; static Visual *vidx11_visual; static Colormap vidx11_colormap; @@ -283,6 +282,10 @@ 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_Num_Lock: key = K_NUMLOCK; break; + case XK_Caps_Lock: key = K_CAPSLOCK; break; + case XK_Scroll_Lock: key = K_SCROLLOCK; break; + case XK_asciicircum: *ascii = key = '^'; break; // for some reason, XLookupString returns "" on this one for Grunt|2 case XK_section: *ascii = key = '~'; break; @@ -653,6 +656,15 @@ static void HandleEvents(void) // window changed size/location win_x = event.xconfigure.x; win_y = event.xconfigure.y; + // HACK on X11, we just request fullscreen mode, but + // cannot guess what the window manager will do for us + // exactly. That is why we read back the resolution we + // actually got here. + if(vid_isdesktopfullscreen) + { + desktop_mode.width = event.xconfigure.width; + desktop_mode.height = event.xconfigure.height; + } if((vid_resizable.integer < 2 || vid_isdesktopfullscreen) && (vid.width != event.xconfigure.width || vid.height != event.xconfigure.height)) { vid.width = event.xconfigure.width; @@ -662,19 +674,19 @@ static void HandleEvents(void) else Con_DPrintf("Updating to ConfigureNotify resolution %dx%d\n", vid.width, vid.height); - DPSOFTRAST_Flush(); - - if(vid.softdepthpixels) - free(vid.softdepthpixels); - - DestroyXImages(); - XSync(vidx11_display, False); - if(!BuildXImages(vid.width, vid.height)) - return; - XSync(vidx11_display, False); - - vid.softpixels = (unsigned int *) vidx11_ximage[vidx11_ximage_pos]->data; - vid.softdepthpixels = (unsigned int *)calloc(4, vid.width * vid.height); + if(vid.renderpath == RENDERPATH_SOFT) + { + DPSOFTRAST_Flush(); + if(vid.softdepthpixels) + free(vid.softdepthpixels); + DestroyXImages(); + XSync(vidx11_display, False); + if(!BuildXImages(vid.width, vid.height)) + return; + XSync(vidx11_display, False); + vid.softpixels = (unsigned int *) vidx11_ximage[vidx11_ximage_pos]->data; + vid.softdepthpixels = (unsigned int *)calloc(4, vid.width * vid.height); + } } break; case DestroyNotify: @@ -691,7 +703,6 @@ static void HandleEvents(void) break; // window restored vid_hidden = false; - VID_RestoreSystemGamma(); if(vid_isvidmodefullscreen) { @@ -728,7 +739,6 @@ static void HandleEvents(void) break; // window iconified/rolledup/whatever vid_hidden = true; - VID_RestoreSystemGamma(); if(vid_isvidmodefullscreen) XF86VidModeSwitchToMode(vidx11_display, vidx11_screen, &init_vidmode); @@ -765,7 +775,6 @@ static void HandleEvents(void) // window is no longer the input focus vid_activewindow = false; - VID_RestoreSystemGamma(); break; case EnterNotify: @@ -841,7 +850,6 @@ void VID_Shutdown(void) VID_EnableJoystick(false); VID_SetMouse(false, false, false); - VID_RestoreSystemGamma(); // FIXME: glXDestroyContext here? if (vid_isvidmodefullscreen) @@ -873,13 +881,11 @@ void VID_Shutdown(void) ctx = NULL; GL_CloseLibrary(); - Key_ClearStates (); } static void signal_handler(int sig) { Con_Printf("Received signal %d, exiting...\n", sig); - VID_RestoreSystemGamma(); Sys_Quit(1); } @@ -954,18 +960,7 @@ void VID_Finish (void) break; } - if (vid_x11_hardwaregammasupported) - VID_UpdateGamma(false, vid_x11_gammarampsize); -} - -int VID_SetGamma(unsigned short *ramps, int rampsize) -{ - return XF86VidModeSetGammaRamp(vidx11_display, vidx11_screen, rampsize, ramps, ramps + rampsize, ramps + rampsize*2); -} - -int VID_GetGamma(unsigned short *ramps, int rampsize) -{ - return XF86VidModeGetGammaRamp(vidx11_display, vidx11_screen, rampsize, ramps, ramps + rampsize, ramps + rampsize*2); + VID_UpdateGamma(); } void VID_Init(void) @@ -1051,6 +1046,13 @@ static qboolean VID_InitModeSoft(viddef_mode_t *mode) vidx11_screen = DefaultScreen(vidx11_display); root = RootWindow(vidx11_display, vidx11_screen); + desktop_mode.width = DisplayWidth(vidx11_display, vidx11_screen); + desktop_mode.height = DisplayHeight(vidx11_display, vidx11_screen); + desktop_mode.bpp = DefaultDepth(vidx11_display, vidx11_screen); + desktop_mode.refreshrate = 60; // FIXME + desktop_mode.pixelheight_num = 1; // FIXME + desktop_mode.pixelheight_denom = 1; // FIXME + // Get video mode list MajorVersion = MinorVersion = 0; if (!XF86VidModeQueryVersion(vidx11_display, &MajorVersion, &MinorVersion)) @@ -1295,7 +1297,6 @@ static qboolean VID_InitModeSoft(viddef_mode_t *mode) vid_usingvsync = false; vid_hidden = false; vid_activewindow = true; - vid_x11_hardwaregammasupported = XF86VidModeGetGammaRampSize(vidx11_display, vidx11_screen, &vid_x11_gammarampsize) != 0; #ifdef USEDGA vid_x11_dgasupported = XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion); if (!vid_x11_dgasupported) @@ -1367,6 +1368,13 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) vidx11_screen = DefaultScreen(vidx11_display); root = RootWindow(vidx11_display, vidx11_screen); + desktop_mode.width = DisplayWidth(vidx11_display, vidx11_screen); + desktop_mode.height = DisplayHeight(vidx11_display, vidx11_screen); + desktop_mode.bpp = DefaultDepth(vidx11_display, vidx11_screen); + desktop_mode.refreshrate = 60; // FIXME + desktop_mode.pixelheight_num = 1; // FIXME + desktop_mode.pixelheight_denom = 1; // FIXME + // Get video mode list MajorVersion = MinorVersion = 0; if (!XF86VidModeQueryVersion(vidx11_display, &MajorVersion, &MinorVersion)) @@ -1635,7 +1643,6 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) vid_usingvsync = false; vid_hidden = false; vid_activewindow = true; - vid_x11_hardwaregammasupported = XF86VidModeGetGammaRampSize(vidx11_display, vidx11_screen, &vid_x11_gammarampsize) != 0; #ifdef USEDGA vid_x11_dgasupported = XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion); if (!vid_x11_dgasupported) @@ -1711,6 +1718,11 @@ void IN_Move (void) VID_ApplyJoyState(&joystate); } +vid_mode_t *VID_GetDesktopMode(void) +{ + return &desktop_mode; +} + size_t VID_ListModes(vid_mode_t *modes, size_t maxcount) { if(vidmode_ext)