diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8838dea..38e399e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -189,19 +189,6 @@ else( WIN32 )
 				set( NO_GTK ON )
 			endif( GTK2_FOUND )
 		endif( NOT NO_GTK )
-
-		# Check for Xcursor library and header files
-		find_library( XCURSOR_LIB Xcursor )
-		if( XCURSOR_LIB )
-			find_file( XCURSOR_HEADER "X11/Xcursor/Xcursor.h" )
-			if( XCURSOR_HEADER )
-				add_definitions( -DUSE_XCURSOR=1 )
-				message( STATUS "Found Xcursor at ${XCURSOR_LIB}" )
-				set( ZDOOM_LIBS ${ZDOOM_LIBS} ${XCURSOR_LIB} )
-			else( XCURSOR_HEADER )
-				unset( XCURSOR_LIB )
-			endif( XCURSOR_HEADER )
-		endif( XCURSOR_LIB )
 	endif( APPLE )
 	set( NASM_NAMES nasm )
 	
diff --git a/src/sdl/i_gui.cpp b/src/sdl/i_gui.cpp
index 39b66c0..c2b91b3 100644
--- a/src/sdl/i_gui.cpp
+++ b/src/sdl/i_gui.cpp
@@ -9,22 +9,6 @@
 #include "v_palette.h"
 #include "textures.h"
 
-#ifdef USE_XCURSOR
-// Xlib has its own GC, so don't let it interfere.
-#define GC XGC
-#include <X11/Xcursor/Xcursor.h>
-#undef GC
-
-bool UseXCursor;
-SDL_Cursor *X11Cursor;
-SDL_Cursor *FirstCursor;
-
-SDL_Cursor *CreateColorCursor(FTexture *cursorpic)
-{
-	return NULL;
-}
-#endif
-
 bool I_SetCursor(FTexture *cursorpic)
 {
 	static SDL_Cursor *cursor;
@@ -38,21 +22,6 @@ bool I_SetCursor(FTexture *cursorpic)
 			return false;
 		}
 
-#ifdef USE_XCURSOR
-		if (UseXCursor)
-		{
-			if (FirstCursor == NULL)
-			{
-				FirstCursor = SDL_GetCursor();
-			}
-			X11Cursor = CreateColorCursor(cursorpic);
-			if (X11Cursor != NULL)
-			{
-				SDL_SetCursor(X11Cursor);
-				return true;
-			}
-		}
-#endif
 		if (cursorSurface == NULL)
 			cursorSurface = SDL_CreateRGBSurface (0, 32, 32, 32, MAKEARGB(0,255,0,0), MAKEARGB(0,0,255,0), MAKEARGB(0,0,0,255), MAKEARGB(255,0,0,0));
 
@@ -82,14 +51,6 @@ bool I_SetCursor(FTexture *cursorpic)
 			SDL_FreeSurface(cursorSurface);
 			cursorSurface = NULL;
 		}
-#ifdef USE_XCURSOR
-		if (X11Cursor != NULL)
-		{
-			SDL_SetCursor(FirstCursor);
-			SDL_FreeCursor(X11Cursor);
-			X11Cursor = NULL;
-		}
-#endif
 	}
 	return true;
 }
diff --git a/src/sdl/i_input.cpp b/src/sdl/i_input.cpp
index 722345c..da97c58 100644
--- a/src/sdl/i_input.cpp
+++ b/src/sdl/i_input.cpp
@@ -34,20 +34,20 @@ EXTERN_CVAR (Bool, fullscreen)
 
 extern int WaitingForKey, chatmodeon;
 extern constate_e ConsoleState;
+extern SDL_Window *CurrentWindow;
 
-static TMap<SDL_Keycode, BYTE> KeySymToDIK;
 static bool DownState[SDL_NUM_SCANCODES];
 
-static SDL_Keycode DIKToKeySym[256] =
+static const SDL_Keycode DIKToKeySym[256] =
 {
-	0, SDLK_ESCAPE, '1', '2', '3', '4', '5', '6',
-	'7', '8', '9', '0', '-', '=', SDLK_BACKSPACE, SDLK_TAB,
-	'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
-	'o', 'p', '[', ']', SDLK_RETURN, SDLK_LCTRL, 'a', 's',
-	'd', 'f', 'g', 'h', 'j', 'k', 'l', SDLK_SEMICOLON,
-	'\'', '`', SDLK_LSHIFT, '\\', 'z', 'x', 'c', 'v',
-	'b', 'n', 'm', ',', '.', '/', SDLK_RSHIFT, SDLK_KP_MULTIPLY,
-	SDLK_LALT, ' ', SDLK_CAPSLOCK, SDLK_F1, SDLK_F2, SDLK_F3, SDLK_F4, SDLK_F5,
+	0, SDLK_ESCAPE, SDLK_1, SDLK_2, SDLK_3, SDLK_4, SDLK_5, SDLK_6,
+	SDLK_7, SDLK_8, SDLK_9, SDLK_0,SDLK_MINUS, SDLK_EQUALS, SDLK_BACKSPACE, SDLK_TAB,
+	SDLK_q, SDLK_w, SDLK_e, SDLK_r, SDLK_t, SDLK_y, SDLK_u, SDLK_i,
+	SDLK_o, SDLK_p, SDLK_LEFTBRACKET, SDLK_RIGHTBRACKET, SDLK_RETURN, SDLK_LCTRL, SDLK_a, SDLK_s,
+	SDLK_d, SDLK_f, SDLK_g, SDLK_h, SDLK_j, SDLK_k, SDLK_l, SDLK_SEMICOLON,
+	SDLK_QUOTE, SDLK_BACKQUOTE, SDLK_LSHIFT, SDLK_BACKSLASH, SDLK_z, SDLK_x, SDLK_c, SDLK_v,
+	SDLK_b, SDLK_n, SDLK_m, SDLK_COMMA, SDLK_PERIOD, SDLK_SLASH, SDLK_RSHIFT, SDLK_KP_MULTIPLY,
+	SDLK_LALT, SDLK_SPACE, SDLK_CAPSLOCK, SDLK_F1, SDLK_F2, SDLK_F3, SDLK_F4, SDLK_F5,
 	SDLK_F6, SDLK_F7, SDLK_F8, SDLK_F9, SDLK_F10, SDLK_NUMLOCKCLEAR, SDLK_SCROLLLOCK, SDLK_KP_7,
 	SDLK_KP_8, SDLK_KP_9, SDLK_KP_MINUS, SDLK_KP_4, SDLK_KP_5, SDLK_KP_6, SDLK_KP_PLUS, SDLK_KP_1,
 	SDLK_KP_2, SDLK_KP_3, SDLK_KP_0, SDLK_KP_PERIOD, 0, 0, 0, SDLK_F11,
@@ -62,24 +62,58 @@ static SDL_Keycode DIKToKeySym[256] =
 	0, 0, 0, 0, SDLK_KP_ENTER, SDLK_RCTRL, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, SDLK_KP_DIVIDE, 0, SDLK_SYSREQ,
+	0, 0, 0, SDLK_KP_COMMA, 0, SDLK_KP_DIVIDE, 0, SDLK_SYSREQ,
 	SDLK_RALT, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, SDLK_PAUSE, 0, SDLK_HOME,
 	SDLK_UP, SDLK_PAGEUP, 0, SDLK_LEFT, 0, SDLK_RIGHT, 0, SDLK_END,
 	SDLK_DOWN, SDLK_PAGEDOWN, SDLK_INSERT, SDLK_DELETE, 0, 0, 0, 0,
-	0, 0, 0, SDLK_LGUI, SDLK_RGUI, SDLK_MENU, SDLK_POWER, 0,
-	0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, SDLK_LGUI, SDLK_RGUI, SDLK_MENU, SDLK_POWER, SDLK_SLEEP,
+	0, 0, 0, 0, 0, SDLK_AC_SEARCH, SDLK_AC_BOOKMARKS, SDLK_AC_REFRESH,
+	SDLK_AC_STOP, SDLK_AC_FORWARD, SDLK_AC_BACK, SDLK_COMPUTER, SDLK_MAIL, SDLK_MEDIASELECT, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0
 };
 
-static void FlushDIKState (int low=0, int high=NUM_KEYS-1)
+static const SDL_Scancode DIKToKeyScan[256] =
 {
-}
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_ESCAPE, SDL_SCANCODE_1, SDL_SCANCODE_2, SDL_SCANCODE_3, SDL_SCANCODE_4, SDL_SCANCODE_5, SDL_SCANCODE_6,
+	SDL_SCANCODE_7, SDL_SCANCODE_8, SDL_SCANCODE_9, SDL_SCANCODE_0 ,SDL_SCANCODE_MINUS, SDL_SCANCODE_EQUALS, SDL_SCANCODE_BACKSPACE, SDL_SCANCODE_TAB,
+	SDL_SCANCODE_Q, SDL_SCANCODE_W, SDL_SCANCODE_E, SDL_SCANCODE_R, SDL_SCANCODE_T, SDL_SCANCODE_Y, SDL_SCANCODE_U, SDL_SCANCODE_I,
+	SDL_SCANCODE_O, SDL_SCANCODE_P, SDL_SCANCODE_LEFTBRACKET, SDL_SCANCODE_RIGHTBRACKET, SDL_SCANCODE_RETURN, SDL_SCANCODE_LCTRL, SDL_SCANCODE_A, SDL_SCANCODE_S,
+	SDL_SCANCODE_D, SDL_SCANCODE_F, SDL_SCANCODE_G, SDL_SCANCODE_H, SDL_SCANCODE_J, SDL_SCANCODE_K, SDL_SCANCODE_L, SDL_SCANCODE_SEMICOLON,
+	SDL_SCANCODE_APOSTROPHE, SDL_SCANCODE_GRAVE, SDL_SCANCODE_LSHIFT, SDL_SCANCODE_BACKSLASH, SDL_SCANCODE_Z, SDL_SCANCODE_X, SDL_SCANCODE_C, SDL_SCANCODE_V,
+	SDL_SCANCODE_B, SDL_SCANCODE_N, SDL_SCANCODE_M, SDL_SCANCODE_COMMA, SDL_SCANCODE_PERIOD, SDL_SCANCODE_SLASH, SDL_SCANCODE_RSHIFT, SDL_SCANCODE_KP_MULTIPLY,
+	SDL_SCANCODE_LALT, SDL_SCANCODE_SPACE, SDL_SCANCODE_CAPSLOCK, SDL_SCANCODE_F1, SDL_SCANCODE_F2, SDL_SCANCODE_F3, SDL_SCANCODE_F4, SDL_SCANCODE_F5,
+	SDL_SCANCODE_F6, SDL_SCANCODE_F7, SDL_SCANCODE_F8, SDL_SCANCODE_F9, SDL_SCANCODE_F10, SDL_SCANCODE_NUMLOCKCLEAR, SDL_SCANCODE_SCROLLLOCK, SDL_SCANCODE_KP_7,
+	SDL_SCANCODE_KP_8, SDL_SCANCODE_KP_9, SDL_SCANCODE_KP_MINUS, SDL_SCANCODE_KP_4, SDL_SCANCODE_KP_5, SDL_SCANCODE_KP_6, SDL_SCANCODE_KP_PLUS, SDL_SCANCODE_KP_1,
+	SDL_SCANCODE_KP_2, SDL_SCANCODE_KP_3, SDL_SCANCODE_KP_0, SDL_SCANCODE_KP_PERIOD, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_F11,
+	SDL_SCANCODE_F12, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_F13, SDL_SCANCODE_F14, SDL_SCANCODE_F15, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_KP_EQUALS, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_KP_ENTER, SDL_SCANCODE_RCTRL, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_KP_COMMA, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_KP_DIVIDE, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_SYSREQ,
+	SDL_SCANCODE_RALT, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_PAUSE, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_HOME,
+	SDL_SCANCODE_UP, SDL_SCANCODE_PAGEUP, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_RIGHT, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_END,
+	SDL_SCANCODE_DOWN, SDL_SCANCODE_PAGEDOWN, SDL_SCANCODE_INSERT, SDL_SCANCODE_DELETE, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_LGUI, SDL_SCANCODE_RGUI, SDL_SCANCODE_MENU, SDL_SCANCODE_POWER, SDL_SCANCODE_SLEEP,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_AC_SEARCH, SDL_SCANCODE_AC_BOOKMARKS, SDL_SCANCODE_AC_REFRESH,
+	SDL_SCANCODE_AC_STOP, SDL_SCANCODE_AC_FORWARD, SDL_SCANCODE_AC_BACK, SDL_SCANCODE_COMPUTER, SDL_SCANCODE_MAIL, SDL_SCANCODE_MEDIASELECT, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN,
+	SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN
+};
 
-static void InitKeySymMap ()
+static TMap<SDL_Keycode, BYTE> InitKeySymMap ()
 {
+	TMap<SDL_Keycode, BYTE> KeySymToDIK;
+
 	for (int i = 0; i < 256; ++i)
 	{
 		KeySymToDIK[DIKToKeySym[i]] = i;
@@ -90,7 +124,23 @@ static void InitKeySymMap ()
 	KeySymToDIK[SDLK_RALT] = DIK_LMENU;
 	// Depending on your Linux flavor, you may get SDLK_PRINT or SDLK_SYSREQ
 	KeySymToDIK[SDLK_PRINTSCREEN] = DIK_SYSRQ;
+
+	return KeySymToDIK;
+}
+static const TMap<SDL_Keycode, BYTE> KeySymToDIK(InitKeySymMap());
+
+static TMap<SDL_Scancode, BYTE> InitKeyScanMap ()
+{
+	TMap<SDL_Scancode, BYTE> KeyScanToDIK;
+
+	for (int i = 0; i < 256; ++i)
+	{
+		KeyScanToDIK[DIKToKeyScan[i]] = i;
+	}
+
+	return KeyScanToDIK;
 }
+static const TMap<SDL_Scancode, BYTE> KeyScanToDIK(InitKeyScanMap());
 
 static void I_CheckGUICapture ()
 {
@@ -110,7 +160,6 @@ static void I_CheckGUICapture ()
 		GUICapture = wantCapt;
 		if (wantCapt)
 		{
-			FlushDIKState ();
 			memset (DownState, 0, sizeof(DownState));
 		}
 	}
@@ -118,12 +167,19 @@ static void I_CheckGUICapture ()
 
 void I_SetMouseCapture()
 {
-	SDL_SetRelativeMouseMode (SDL_TRUE);
+	SDL_Window *CurrentWindow = SDL_GetKeyboardFocus();
+	Printf("Here\n");
+	int w, h;
+	SDL_GetWindowSize (CurrentWindow, &w, &h);
+	SDL_WarpMouseInWindow (CurrentWindow, w/2, h/2);
+	SDL_PumpEvents();
+
+	//SDL_SetRelativeMouseMode (SDL_TRUE);
 }
 
 void I_ReleaseMouseCapture()
 {
-	SDL_SetRelativeMouseMode (SDL_FALSE);
+	//SDL_SetRelativeMouseMode (SDL_FALSE);
 }
 
 static void PostMouseMove (int x, int y)
@@ -193,7 +249,7 @@ static bool inGame()
 
 static void I_CheckNativeMouse ()
 {
-	bool focus = SDL_GetMouseFocus() != NULL;
+	bool focus = SDL_GetKeyboardFocus() != NULL;
 	bool fs = screen->IsFullscreen();
 	
 	bool wantNative = !focus || (!use_mouse || GUICapture || paused || demoplayback || !inGame());
@@ -202,11 +258,11 @@ static void I_CheckNativeMouse ()
 	{
 		NativeMouse = wantNative;
 		SDL_ShowCursor (wantNative);
-		SDL_SetRelativeMouseMode (wantNative ? SDL_FALSE : SDL_TRUE);
 		if (wantNative)
-		{
-			FlushDIKState (KEY_MOUSE1, KEY_MOUSE8);
-		}
+			I_ReleaseMouseCapture ();
+		else
+			I_SetMouseCapture ();
+		//SDL_SetRelativeMouseMode (wantNative ? SDL_FALSE : SDL_TRUE);
 	}
 }
 
@@ -226,10 +282,6 @@ void MessagePump (const SDL_Event &sev)
 		{
 			case SDL_WINDOWEVENT_FOCUS_GAINED:
 			case SDL_WINDOWEVENT_FOCUS_LOST:
-				if (sev.window.event == SDL_WINDOWEVENT_FOCUS_LOST)
-				{ // kill focus
-					FlushDIKState ();
-				}
 				S_SetSoundPaused(sev.window.event == SDL_WINDOWEVENT_FOCUS_GAINED);
 				break;
 		}
@@ -309,7 +361,11 @@ void MessagePump (const SDL_Event &sev)
 		if (!GUICapture)
 		{
 			event.type = sev.type == SDL_KEYDOWN ? EV_KeyDown : EV_KeyUp;
-			event.data1 = KeySymToDIK[sev.key.keysym.sym];
+			if (const BYTE *dik = KeySymToDIK.CheckKey (sev.key.keysym.sym))
+				event.data1 = *dik;
+			else if (const BYTE *dik = KeyScanToDIK.CheckKey (sev.key.keysym.scancode))
+				event.data1 = *dik;
+
 			if (event.data1)
 			{
 				if (sev.key.keysym.sym < 256)
@@ -327,20 +383,17 @@ void MessagePump (const SDL_Event &sev)
 						  ((sev.key.keysym.mod & KMOD_CTRL) ? GKM_CTRL : 0) |
 						  ((sev.key.keysym.mod & KMOD_ALT) ? GKM_ALT : 0);
 
-			//if (sev.key.keysym.sym < SDLK_LAST)
+			if (event.subtype == EV_GUI_KeyDown)
 			{
-				if (event.subtype == EV_GUI_KeyDown)
-				{
-					if (DownState[sev.key.keysym.scancode])
-					{
-						event.subtype = EV_GUI_KeyRepeat;
-					}
-					DownState[sev.key.keysym.scancode] = 1;
-				}
-				else
+				if (DownState[sev.key.keysym.scancode])
 				{
-					DownState[sev.key.keysym.scancode] = 0;
+					event.subtype = EV_GUI_KeyRepeat;
 				}
+				DownState[sev.key.keysym.scancode] = 1;
+			}
+			else
+			{
+				DownState[sev.key.keysym.scancode] = 0;
 			}
 
 			switch (sev.key.keysym.sym)
@@ -430,10 +483,5 @@ void I_StartTic ()
 void I_ProcessJoysticks ();
 void I_StartFrame ()
 {
-	if (KeySymToDIK[SDLK_BACKSPACE] == 0)
-	{
-		InitKeySymMap ();
-	}
-
 	I_ProcessJoysticks();
 }
diff --git a/src/sdl/i_main.cpp b/src/sdl/i_main.cpp
index a928b7e..85be7dc 100644
--- a/src/sdl/i_main.cpp
+++ b/src/sdl/i_main.cpp
@@ -85,10 +85,6 @@ void Mac_I_FatalError(const char* errortext);
 
 // EXTERNAL DATA DECLARATIONS ----------------------------------------------
 
-#ifdef USE_XCURSOR
-extern bool UseXCursor;
-#endif
-
 // PUBLIC DATA DEFINITIONS -------------------------------------------------
 
 #ifndef NO_GTK
@@ -279,9 +275,6 @@ int main (int argc, char **argv)
 	atterm (SDL_Quit);
 
 	printf("Using video driver %s\n", SDL_GetCurrentVideoDriver());
-#ifdef USE_XCURSOR
-	UseXCursor = (strcmp(SDL_GetCurrentVideoDriver(), "x11") == 0);
-#endif
 	printf("\n");
 
 #ifdef __APPLE__
diff --git a/src/sdl/sdlvideo.cpp b/src/sdl/sdlvideo.cpp
index 71a534f..5a02407 100644
--- a/src/sdl/sdlvideo.cpp
+++ b/src/sdl/sdlvideo.cpp
@@ -126,6 +126,10 @@ CUSTOM_CVAR (Float, bgamma, 1.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
 	}
 }
 
+// SDL2 is more object oriented and since our normal Window object is buried
+// in the frame buffer object, lets provide access through here.
+SDL_Window *CurrentWindow = NULL;
+
 // PRIVATE DATA DEFINITIONS ------------------------------------------------
 
 // Dummy screen sizes to pass when windowed
@@ -334,6 +338,8 @@ SDLFB::SDLFB (int width, int height, bool fullscreen)
 	if (Screen == NULL)
 		return;
 
+	CurrentWindow = Screen;
+
 	Renderer = NULL;
 	Texture = NULL;
 	ResetSDLRenderer ();
@@ -362,6 +368,10 @@ SDLFB::~SDLFB ()
 				SDL_DestroyTexture (Texture);
 			SDL_DestroyRenderer (Renderer);
 		}
+
+		if (CurrentWindow == Screen)
+			CurrentWindow = NULL;
+
 		SDL_DestroyWindow (Screen);
 	}
 }
@@ -657,6 +667,6 @@ ADD_STAT (blit)
 {
 	FString out;
 	out.Format ("blit=%04.1f ms  flip=%04.1f ms",
-		BlitCycles.Time() * 1e-3, SDLFlipCycles.TimeMS());
+		BlitCycles.TimeMS(), SDLFlipCycles.TimeMS());
 	return out;
 }
