fixed text event handling for newer SDL versions (again)
authorHolger Schemel <info@artsoft.org>
Wed, 16 Sep 2020 21:52:56 +0000 (23:52 +0200)
committerHolger Schemel <info@artsoft.org>
Wed, 16 Sep 2020 21:52:56 +0000 (23:52 +0200)
This fixes another regression of commit 5a53ae0c888ee049 and
35da46e4 that still causes incorrect key/text event handling.

The problem occurs when entering uppercase letters, which creates two
key events (pressed and released) with the lowercase letter (while
modifier state indicates that the Shift key is active), plus one text
event with the uppercase letter. The previous logic caused both cases
to be handled as a new key event, effectively handling that letter
twice (one time in lowercase, and another time in uppercase).

An additional check for text input style modifier keys prevents the
lowercase variant of the case described above not to be handled.

src/events.c
src/libgame/sdl.h

index 24106461affff97d5be9f3fef5ac0134b6ea4db2..f4311bfdee435c6701cc11f3feb8d2342d501cd6 100644 (file)
@@ -1386,6 +1386,10 @@ static boolean checkTextInputKey(Key key)
   if (game_status == GAME_MODE_PLAYING)
     return FALSE;
 
+  // if Shift or right Alt key is pressed, handle key as text input
+  if ((GetKeyModState() & KMOD_TextInput) != KMOD_None)
+    return TRUE;
+
   // ignore raw keys as text input when not in text input mode
   if (KSYM_RAW(key) && !textinput_status)
     return FALSE;
index dfdd4a407e239f84ecd3f0593715983600be7505..4fec8030082d1927c3b7192dd03a7e5a0a789ed3 100644 (file)
@@ -386,6 +386,9 @@ typedef struct UserEventInfo        UserEvent;
                                 KMOD_Meta    | \
                                 KMOD_Alt)
 
+#define KMOD_TextInput         (KMOD_Shift | KMOD_Alt_R)
+
+
 // SDL function definitions
 
 const char *SDLGetRendererName(void);