Index: emu/sdl.c
===================================================================
--- emu/sdl.c	(revision f28585850a4f27fe3a5996dcd3dce0fee4b42f33)
+++ emu/sdl.c	(revision b48c8a568ee36d983214437e4942672e4b73cfb1)
@@ -66,4 +66,6 @@
 #endif
 
+	bool rel_mod = false;
+
 	while (SDL_AtomicGet(&run) != 0) {
 		for (int32_t i = 0; i < ARRAY_COUNT(sdl_funcs); ++i) {
@@ -74,4 +76,6 @@
 
 		while (SDL_PollEvent(&ev) > 0) {
+			ver2("sdl ev %d", ev.type);
+
 #if defined EMU_LINUX
 			// Work around duplicate key-down events on Linux.
@@ -79,11 +83,14 @@
 			if (ev.type == SDL_KEYDOWN) {
 				if (down == ev.key.keysym.scancode) {
+					ver2("sdl dedup: skip %d", (int32_t)down);
 					continue;
 				}
 
 				down = ev.key.keysym.scancode;
+				ver2("sdl dedup: %d", (int32_t)down);
 			}
 			else if (ev.type == SDL_KEYUP) {
 				down = SDL_SCANCODE_UNKNOWN;
+				ver2("sdl dedup: reset");
 			}
 #endif
@@ -91,10 +98,23 @@
 			if (ev.type == SDL_QUIT ||
 					(ev.type == SDL_KEYDOWN && ev.key.keysym.sym == SDLK_ESCAPE)) {
-				ver("quit");
+				inf("quit event");
 				SDL_AtomicSet(&run, 0);
 				continue;
 			}
 
+			if (ev.type == SDL_KEYDOWN && ev.key.keysym.sym == SDLK_DOWN) {
+				ver("sdl ev down-arrow");
+				rel_mod = true;
+				continue;
+			}
+
+			if (ev.type == SDL_KEYDOWN && ev.key.keysym.sym == SDLK_UP) {
+				ver("sdl ev up-arrow");
+				rel_mod = false;
+				continue;
+			}
+
 			if (ev.type == SDL_TEXTINPUT) {
+				ver("sdl ev text input %d", ev.text.text[0]);
 				ser_text(&ev.text);
 				continue;
@@ -102,9 +122,21 @@
 
 			if (ev.type == SDL_KEYDOWN) {
+				ver("sdl ev key down %d", (int32_t)ev.key.keysym.sym);
 				ser_key(&ev.key);
 				continue;
 			}
+		}
 
-			SDL_Delay(50);
+		SDL_Delay(50);
+
+		if (SDL_GetRelativeMouseMode() != rel_mod) {
+			SDL_SetRelativeMouseMode(rel_mod);
+
+			if (rel_mod) {
+				inf("MOUSE CAPTURED - press UP-ARROW KEY to release");
+			}
+			else {
+				inf("mouse released");
+			}
 		}
 	}
