diff --git a/engine/gl/gl_vidlinuxglx.c b/engine/gl/gl_vidlinuxglx.c
index 9c2fbf829..0a566d923 100644
--- a/engine/gl/gl_vidlinuxglx.c
+++ b/engine/gl/gl_vidlinuxglx.c
@@ -74,6 +74,9 @@ static qboolean vidmode_ext = false;
 static XF86VidModeModeInfo **vidmodes;
 static int num_vidmodes;
 static qboolean vidmode_active = false;
+
+unsigned short origionalramps[3][256];
+qboolean origionalapplied;
 #endif
 
 extern cvar_t	_windowed_mouse;
@@ -107,7 +110,7 @@ qboolean is8bit = false;
 qboolean isPermedia = false;
 float vid_gamma = 1.0;
 qboolean mouseactive = false;
-qboolean has_focus = false;
+qboolean ActiveApp = false;
 
 int gl_canstencil;
 
@@ -344,6 +347,20 @@ static void uninstall_grabs(void)
 //	XSync(vid_dpy, True);
 }
 
+void ClearAllStates (void)
+{
+	int		i;
+	
+// send an up event for each key, to make sure the server clears them all
+	for (i=0 ; i<256 ; i++)
+	{
+		Key_Event (i, false);
+	}
+
+	Key_ClearStates ();
+//	IN_ClearStates ();
+}
+
 static void GetEvent(void)
 {
 	XEvent event;
@@ -418,15 +435,21 @@ static void GetEvent(void)
 		break;
 
 	case FocusIn:
-		has_focus = true;
+		v_gamma.modified = true;
+		ActiveApp = true;
 		break;
 	case FocusOut:
-		has_focus = false;
+#ifdef WITH_VMODE
+		if (origionalapplied)
+			XF86VidModeSetGammaRamp(vid_dpy, scrnum, 256, origionalramps[0], origionalramps[1], origionalramps[2]);
+#endif
+		ActiveApp = false;
+		ClearAllStates();
 		break;
 	}
 
 	wantwindowed = !!_windowed_mouse.value;
-	if (!has_focus)
+	if (!ActiveApp)
 		wantwindowed = false;
 	if (key_dest == key_console)
 		wantwindowed = false;
@@ -460,6 +483,12 @@ printf("GLVID_Shutdown");
 		uninstall_grabs();
 
 	qglXDestroyContext(vid_dpy, ctx);
+	
+#ifdef WITH_VMODE
+	if (origionalapplied)
+		XF86VidModeSetGammaRamp(vid_dpy, scrnum, 256, origionalramps[0], origionalramps[1], origionalramps[2]);
+#endif
+
 	if (vid_window)
 		XDestroyWindow(vid_dpy, vid_window);
 #ifdef WITH_VMODE
@@ -525,9 +554,27 @@ static Cursor CreateNullCursor(Display *display, Window root)
     return cursor;
 }
 
-void GLVID_ShiftPalette(unsigned char *p)
+void	GLVID_ShiftPalette (unsigned char *palette)
 {
-//	VID_SetPalette(p);
+#ifdef WITH_VMODE
+	extern qboolean gammaworks;
+	extern cvar_t vid_hardwaregamma;
+	extern	unsigned short ramps[3][256];
+	
+//	VID_SetPalette (palette);
+
+	if (ActiveApp && vid_hardwaregamma.value)	//this is needed because ATI drivers don't work properly (or when task-switched out).
+	{
+		if (gammaworks)
+		{	//we have hardware gamma applied - if we're doing a BF, we don't want to reset to the default gamma (yuck)
+			XF86VidModeSetGammaRamp (vid_dpy, scrnum, 256, ramps[0], ramps[1], ramps[2]);
+			return;
+		}
+		gammaworks = !!XF86VidModeSetGammaRamp (vid_dpy, scrnum, 256, ramps[0], ramps[1], ramps[2]);
+	}
+	else
+		gammaworks = false;
+#endif
 }
 
 void	GLVID_SetPalette (unsigned char *palette)
@@ -747,7 +794,7 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
 	}
 #endif
 
-	has_focus = false;
+	ActiveApp = false;
 	vid_window = XCreateWindow(vid_dpy, root, 0, 0, info->width, info->height,
 						0, visinfo->depth, InputOutput,
 						visinfo->visual, mask, &attr);
@@ -769,6 +816,10 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
 	XDefineCursor(vid_dpy, vid_window, CreateNullCursor(vid_dpy, vid_window));
 
 	XFlush(vid_dpy);
+	
+#ifdef WITH_VMODE
+	origionalapplied = XF86VidModeGetGammaRamp(vid_dpy, scrnum, 256, origionalramps[0], origionalramps[1], origionalramps[2]);
+#endif
 
 	ctx = qglXCreateContext(vid_dpy, visinfo, NULL, True);