diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c
index e585781acb6c934df785dd63189179e67b66d40c..74e822bc27c5d68bfe2a83bbaa367842d0e0fcd8 100644
--- a/src/conio/sdl_con.c
+++ b/src/conio/sdl_con.c
@@ -795,6 +795,8 @@ void sdl_video_event_thread(void *data)
 	SDL_Event	ev;
 	int		old_w, old_h;
 	int		block_text = 0;
+	static SDL_Keycode last_sym = SDLK_UNKNOWN;
+	static Uint16 last_mod = 0;
 
 	pthread_mutex_lock(&vstatlock);
 	old_w = cvstat.winwidth;
@@ -816,6 +818,8 @@ void sdl_video_event_thread(void *data)
 		else {
 			switch (ev.type) {
 				case SDL_KEYDOWN:			/* Keypress */
+					last_mod = ev.key.keysym.mod;
+					last_sym = ev.key.keysym.sym;
 					if ((ev.key.keysym.mod & (KMOD_CTRL|KMOD_ALT|KMOD_GUI)) && !(ev.key.keysym.mod & KMOD_MODE)) {
 						block_text = 1;
 						if ((ev.key.keysym.mod & KMOD_ALT) &&
@@ -878,6 +882,10 @@ void sdl_video_event_thread(void *data)
 							break;
 						}
 					}
+					if (ev.key.keysym.mod & KMOD_RALT) {	// Possible AltGr, let textinput sort it out...
+						block_text = 0;
+						break;
+					}
 					if ((ev.key.keysym.mod & KMOD_SHIFT) && (ev.key.keysym.sym == '\t'))
 						block_text = 1;
 					if (block_text || ev.key.keysym.sym < 0 || ev.key.keysym.sym > 127) {
@@ -897,10 +905,17 @@ void sdl_video_event_thread(void *data)
 					}
 					break;
 				case SDL_TEXTINPUT:
-					if (!block_text)
-						sdl_add_keys((uint8_t *)ev.text.text);
+					if (!block_text) {
+						unsigned int charcode = sdl_get_char_code(last_sym, last_mod & ~(KMOD_ALT));
+						// If the key is exactly what we would expect, use sdl_get_char_code()
+						if (*(uint8_t *)ev.text.text == charcode)
+							sdl_add_key(sdl_get_char_code(last_sym, last_mod));
+						else
+							sdl_add_keys((uint8_t *)ev.text.text);
+					}
 					break;
 				case SDL_KEYUP:
+					last_mod = ev.key.keysym.mod;
 					if (!(ev.key.keysym.mod & (KMOD_CTRL|KMOD_ALT|KMOD_GUI)))
 						block_text = 0;
 					break;