rnd-20140104-1-src
authorHolger Schemel <info@artsoft.org>
Sat, 4 Jan 2014 02:08:37 +0000 (03:08 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 09:00:26 +0000 (11:00 +0200)
* fixed key code problems with certain keys for SDL2
* fixed text input problems for text characters using modifier keys

ChangeLog
src/conftime.h
src/events.c
src/events.h
src/libgame/misc.c
src/libgame/sdl.h
src/libgame/setup.c

index a575452509037cd290f3781b5ef2d39c56bfa1b7..4e650a734761c0377c2517d3750286af5ad8a25f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2014-01-03
+       * fixed key code problems with certain keys for SDL2
+       * fixed text input problems for text characters using modifier keys
+
 2014-01-02
        * fixed fullscreen option for SDL2 (using only desktop fullscreen now)
 
index b78c57732ed0f2404a93dddab468eaecca6930be..09eada1eeb7fb63d25189243aa3ddd029b150fd4 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2014-01-03 16:39"
+#define COMPILE_DATE_STRING "2014-01-04 02:29"
index 0be6815b798acfd855e5644d1e745e3c721efcc9..50a39762865d8b0e6e1c5ee3714f998ec164d49a 100644 (file)
@@ -167,13 +167,17 @@ void EventLoop(void)
          case EVENT_FINGERMOTION:
            HandleFingerEvent((FingerEvent *) &event);
            break;
+
+         case EVENT_TEXTINPUT:
+           HandleTextEvent((TextEvent *) &event);
+           break;
 #endif
 
          case EVENT_KEYPRESS:
          case EVENT_KEYRELEASE:
            HandleKeyEvent((KeyEvent *) &event);
            break;
-  
+
          default:
            HandleOtherEvents(&event);
            break;
@@ -472,6 +476,25 @@ void HandleFingerEvent(FingerEvent *event)
   }
 #endif
 }
+
+void HandleTextEvent(TextEvent *event)
+{
+  char *text = event->text;
+  Key key = getKeyFromKeyName(text);
+
+#if DEBUG_EVENTS
+  Error(ERR_DEBUG, "TEXT EVENT: text == '%s', resulting key == %d (%s)",
+       text,
+       key,
+       getKeyNameFromKey(key));
+#endif
+
+  if (game_status != GAME_MODE_PLAYING && GetKeyModState() != KMOD_None)
+  {
+    HandleKey(key, KEY_PRESSED);
+    HandleKey(key, KEY_RELEASED);
+  }
+}
 #endif
 
 void HandleKeyEvent(KeyEvent *event)
@@ -482,11 +505,13 @@ void HandleKeyEvent(KeyEvent *event)
   Key keymod = (with_modifiers ? GetEventKey(event, FALSE) : key);
 
 #if DEBUG_EVENTS
-  Error(ERR_DEBUG, "KEY EVENT: key was %s, keysym.scancode == %d, keysym.sym == %d, resulting key == %d (%s)",
+  Error(ERR_DEBUG, "KEY EVENT: key was %s, keysym.scancode == %d, keysym.sym == %d, keymod = %d, GetKeyModState() = 0x%04x, resulting key == %d (%s)",
        event->type == EVENT_KEYPRESS ? "pressed" : "released",
        event->keysym.scancode,
        event->keysym.sym,
-       GetEventKey(event, TRUE),
+       keymod,
+       GetKeyModState(),
+       key,
        getKeyNameFromKey(key));
 #endif
 
@@ -503,8 +528,15 @@ void HandleKeyEvent(KeyEvent *event)
     key = KSYM_Escape;
 #endif
 
+#if defined(TARGET_SDL2)
+  HandleKeyModState(keymod, key_status);
+
+  if (game_status == GAME_MODE_PLAYING || GetKeyModState() == KMOD_None)
+    HandleKey(key, key_status);
+#else
   HandleKeyModState(keymod, key_status);
   HandleKey(key, key_status);
+#endif
 }
 
 void HandleFocusEvent(FocusChangeEvent *event)
index 02ad166069b583bc18251b93031531434b2e0626..7a6a7cb0029c24129749687d74783c797deef2ad 100644 (file)
@@ -33,6 +33,7 @@ void HandleButtonEvent(ButtonEvent *);
 void HandleMotionEvent(MotionEvent *);
 #if defined(TARGET_SDL2)
 void HandleFingerEvent(FingerEvent *);
+void HandleTextEvent(TextEvent *);
 #endif
 void HandleKeyEvent(KeyEvent *);
 void HandleFocusEvent(FocusChangeEvent *);
index d2b7b4e7d45a06420265ba20e3dee56d14af77ce..d0746a46a1f650b4a1fcc2c5dcb8dbfac715f819 100644 (file)
@@ -65,6 +65,22 @@ static void fPrintLog(FILE *stream, char *format, va_list ap)
 }
 #endif
 
+static void vfprintf_nonewline(FILE *stream, char *format, va_list ap)
+{
+#if defined(PLATFORM_ANDROID)
+  // (prefix text of logging output is currently skipped on Android)
+  //__android_log_vprint(android_log_prio, program.program_title, format, ap);
+#else
+  va_list ap2;
+  va_copy(ap2, ap);
+
+  vfprintf(stream, format, ap);
+  vfprintf(stderr, format, ap2);
+
+  va_end(ap2);
+#endif
+}
+
 static void vfprintf_newline(FILE *stream, char *format, va_list ap)
 {
 #if defined(PLATFORM_ANDROID)
@@ -72,11 +88,28 @@ static void vfprintf_newline(FILE *stream, char *format, va_list ap)
 #else
   char *newline = STRING_NEWLINE;
 
+  va_list ap2;
+  va_copy(ap2, ap);
+
   vfprintf(stream, format, ap);
   fprintf(stream, "%s", newline);
+
+  vfprintf(stderr, format, ap2);
+  fprintf(stderr, "%s", newline);
+
+  va_end(ap2);
 #endif
 }
 
+static void fprintf_nonewline(FILE *stream, char *format, ...)
+{
+  va_list ap;
+
+  va_start(ap, format);
+  vfprintf_nonewline(stream, format, ap);
+  va_end(ap);
+}
+
 static void fprintf_newline(FILE *stream, char *format, ...)
 {
   va_list ap;
@@ -91,7 +124,7 @@ void fprintf_line(FILE *stream, char *line_chars, int line_length)
   int i;
 
   for (i = 0; i < line_length; i++)
-    fprintf(stream, "%s", line_chars);
+    fprintf_nonewline(stream, "%s", line_chars);
 
   fprintf_newline(stream, "");
 }
@@ -1083,11 +1116,11 @@ void Error(int mode, char *format, ...)
   {
     va_list ap;
 
-    fprintf(program.error_file, "%s%s: ", program.command_basename,
-           process_name);
+    fprintf_nonewline(program.error_file, "%s%s: ", program.command_basename,
+                     process_name);
 
     if (mode & ERR_WARN)
-      fprintf(program.error_file, "warning: ");
+      fprintf_nonewline(program.error_file, "warning: ");
 
     va_start(ap, format);
     vfprintf_newline(program.error_file, format, ap);
@@ -1611,7 +1644,6 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
     { KSYM_braceright, "XK_braceright",        "brace right" },
     { KSYM_asciitilde, "XK_asciitilde",        "~" },
 
-#if !defined(TARGET_SDL2)
     /* special (non-ASCII) keys */
     { KSYM_degree,     "XK_degree",            "°" },
     { KSYM_Adiaeresis, "XK_Adiaeresis",        "Ä" },
@@ -1621,6 +1653,19 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
     { KSYM_odiaeresis, "XK_odiaeresis",        "ö" },
     { KSYM_udiaeresis, "XK_udiaeresis",        "ü" },
     { KSYM_ssharp,     "XK_ssharp",            "sharp s" },
+
+#if defined(TARGET_SDL2)
+    /* keypad keys are not in numerical order in SDL2 */
+    { KSYM_KP_0,       "XK_KP_0",              "keypad 0" },
+    { KSYM_KP_1,       "XK_KP_1",              "keypad 1" },
+    { KSYM_KP_2,       "XK_KP_2",              "keypad 2" },
+    { KSYM_KP_3,       "XK_KP_3",              "keypad 3" },
+    { KSYM_KP_4,       "XK_KP_4",              "keypad 4" },
+    { KSYM_KP_5,       "XK_KP_5",              "keypad 5" },
+    { KSYM_KP_6,       "XK_KP_6",              "keypad 6" },
+    { KSYM_KP_7,       "XK_KP_7",              "keypad 7" },
+    { KSYM_KP_8,       "XK_KP_8",              "keypad 8" },
+    { KSYM_KP_9,       "XK_KP_9",              "keypad 9" },
 #endif
 
     /* end-of-array identifier */
@@ -1640,8 +1685,10 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
       sprintf(name_buffer, "%c", 'a' + (char)(key - KSYM_a));
     else if (key >= KSYM_0 && key <= KSYM_9)
       sprintf(name_buffer, "%c", '0' + (char)(key - KSYM_0));
+#if !defined(TARGET_SDL2)
     else if (key >= KSYM_KP_0 && key <= KSYM_KP_9)
       sprintf(name_buffer, "keypad %c", '0' + (char)(key - KSYM_KP_0));
+#endif
     else if (key >= KSYM_FKEY_FIRST && key <= KSYM_FKEY_LAST)
       sprintf(name_buffer, "F%d", (int)(key - KSYM_FKEY_FIRST + 1));
     else if (key == KSYM_UNDEFINED)
@@ -1677,8 +1724,10 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
       sprintf(name_buffer, "XK_%c", 'a' + (char)(key - KSYM_a));
     else if (key >= KSYM_0 && key <= KSYM_9)
       sprintf(name_buffer, "XK_%c", '0' + (char)(key - KSYM_0));
+#if !defined(TARGET_SDL2)
     else if (key >= KSYM_KP_0 && key <= KSYM_KP_9)
       sprintf(name_buffer, "XK_KP_%c", '0' + (char)(key - KSYM_KP_0));
+#endif
     else if (key >= KSYM_FKEY_FIRST && key <= KSYM_FKEY_LAST)
       sprintf(name_buffer, "XK_F%d", (int)(key - KSYM_FKEY_FIRST + 1));
     else if (key == KSYM_UNDEFINED)
@@ -1706,17 +1755,34 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
   else if (mode == TRANSLATE_KEYNAME_TO_KEYSYM)
   {
     Key key = KSYM_UNDEFINED;
+    char *name_ptr = *name;
+
+    if (strlen(*name) == 1)
+    {
+      char c = name_ptr[0];
+
+      if (c >= 'A' && c <= 'Z')
+       key = KSYM_A + (Key)(c - 'A');
+      else if (c >= 'a' && c <= 'z')
+       key = KSYM_a + (Key)(c - 'a');
+      else if (c >= '0' && c <= '9')
+       key = KSYM_0 + (Key)(c - '0');
+    }
 
-    i = 0;
-    do
+    if (key == KSYM_UNDEFINED)
     {
-      if (strEqual(translate_key[i].name, *name))
+      i = 0;
+
+      do
       {
-       key = translate_key[i].key;
-       break;
+       if (strEqual(translate_key[i].name, *name))
+       {
+         key = translate_key[i].key;
+         break;
+       }
       }
+      while (translate_key[++i].x11name);
     }
-    while (translate_key[++i].x11name);
 
     if (key == KSYM_UNDEFINED)
       Error(ERR_WARN, "getKeyFromKeyName(): not completely implemented");
@@ -1739,6 +1805,7 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
       else if (c >= '0' && c <= '9')
        key = KSYM_0 + (Key)(c - '0');
     }
+#if !defined(TARGET_SDL2)
     else if (strPrefix(name_ptr, "XK_KP_") && strlen(name_ptr) == 7)
     {
       char c = name_ptr[6];
@@ -1746,6 +1813,7 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
       if (c >= '0' && c <= '9')
        key = KSYM_KP_0 + (Key)(c - '0');
     }
+#endif
     else if (strPrefix(name_ptr, "XK_F") && strlen(name_ptr) <= 6)
     {
       char c1 = name_ptr[4];
index 6f130bb1bea70b6492cd1f91ef3596e4deed101b..254b9927166fc33d126911e9898c49b803610369 100644 (file)
@@ -63,16 +63,18 @@ typedef SDL_Cursor         *Cursor;
 
 #if defined(TARGET_SDL2)
 typedef SDL_Keycode            Key;
+typedef SDL_Keymod             KeyMod;
 #else
 typedef SDLKey                 Key;
-#endif
 typedef unsigned int           KeyMod;
+#endif
 
 typedef SDL_Event              Event;
 typedef SDL_MouseButtonEvent   ButtonEvent;
 typedef SDL_MouseMotionEvent   MotionEvent;
 #if defined(TARGET_SDL2)
 typedef SDL_TouchFingerEvent   FingerEvent;
+typedef SDL_TextInputEvent     TextEvent;
 #endif
 typedef SDL_KeyboardEvent      KeyEvent;
 typedef SDL_Event              ExposeEvent;
@@ -123,6 +125,7 @@ struct MouseCursorInfo
 #define        EVENT_FINGERPRESS       SDL_FINGERDOWN
 #define EVENT_FINGERRELEASE    SDL_FINGERUP
 #define EVENT_FINGERMOTION     SDL_FINGERMOTION
+#define EVENT_TEXTINPUT                SDL_TEXTINPUT
 #endif
 #define EVENT_KEYPRESS         SDL_KEYDOWN
 #define EVENT_KEYRELEASE       SDL_KEYUP
@@ -161,6 +164,7 @@ struct MouseCursorInfo
 #define KSYM_Shift_R           SDLK_RSHIFT
 #define KSYM_Control_L         SDLK_LCTRL
 #define KSYM_Control_R         SDLK_RCTRL
+
 #if defined(TARGET_SDL2)
 #define KSYM_Meta_L            SDLK_LGUI
 #define KSYM_Meta_R            SDLK_RGUI
@@ -168,6 +172,7 @@ struct MouseCursorInfo
 #define KSYM_Meta_L            SDLK_LMETA
 #define KSYM_Meta_R            SDLK_RMETA
 #endif
+
 #define KSYM_Alt_L             SDLK_LALT
 #define KSYM_Alt_R             SDLK_RALT
 #if !defined(TARGET_SDL2)
@@ -229,7 +234,16 @@ struct MouseCursorInfo
 #define KSYM_braceright                KSYM_UNDEFINED          /* undefined */
 #define KSYM_asciitilde                KSYM_UNDEFINED          /* undefined */
 
-#if !defined(TARGET_SDL2)
+#if defined(TARGET_SDL2)
+#define KSYM_degree            176
+#define KSYM_Adiaeresis                196
+#define KSYM_Odiaeresis                214
+#define KSYM_Udiaeresis                220
+#define KSYM_adiaeresis                228
+#define KSYM_odiaeresis                246
+#define KSYM_udiaeresis                252
+#define KSYM_ssharp            223
+#else
 #define KSYM_degree            SDLK_WORLD_16
 #define KSYM_Adiaeresis                SDLK_WORLD_36
 #define KSYM_Odiaeresis                SDLK_WORLD_54
@@ -370,28 +384,17 @@ struct MouseCursorInfo
 #define KSYM_F10               SDLK_F10
 #define KSYM_F11               SDLK_F11
 #define KSYM_F12               SDLK_F12
-#define KSYM_F13               SDLK_F13
-#define KSYM_F14               SDLK_F14
-#define KSYM_F15               SDLK_F15
-#define KSYM_F16               KSYM_UNDEFINED
-#define KSYM_F17               KSYM_UNDEFINED
-#define KSYM_F18               KSYM_UNDEFINED
-#define KSYM_F19               KSYM_UNDEFINED
-#define KSYM_F20               KSYM_UNDEFINED
-#define KSYM_F21               KSYM_UNDEFINED
-#define KSYM_F22               KSYM_UNDEFINED
-#define KSYM_F23               KSYM_UNDEFINED
-#define KSYM_F24               KSYM_UNDEFINED
 
 #define KSYM_FKEY_FIRST                KSYM_F1
-#define KSYM_FKEY_LAST         KSYM_F15
+#define KSYM_FKEY_LAST         KSYM_F12
 #define KSYM_NUM_FKEYS         (KSYM_FKEY_LAST - KSYM_FKEY_FIRST + 1)
 
-#define KMOD_None              None
+#define KMOD_None              KMOD_NONE
 #define KMOD_Shift_L           KMOD_LSHIFT
 #define KMOD_Shift_R           KMOD_RSHIFT
 #define KMOD_Control_L         KMOD_LCTRL
 #define KMOD_Control_R         KMOD_RCTRL
+
 #if defined(TARGET_SDL2)
 #define KMOD_Meta_L            KMOD_LGUI
 #define KMOD_Meta_R            KMOD_RGUI
@@ -399,6 +402,7 @@ struct MouseCursorInfo
 #define KMOD_Meta_L            KMOD_LMETA
 #define KMOD_Meta_R            KMOD_RMETA
 #endif
+
 #define KMOD_Alt_L             KMOD_LALT
 #define KMOD_Alt_R             KMOD_RALT
 
index 5dbbdada82fdd8309178c03eefd7bd04deeaad96..5fb7e466875f3e62d524c35548162457594c5f4a 100644 (file)
@@ -1377,7 +1377,7 @@ char *getUserGameDataDir(void)
 
 #if defined(PLATFORM_ANDROID)
   if (user_game_data_dir == NULL)
-    user_game_data_dir = SDL_AndroidGetInternalStoragePath();
+    user_game_data_dir = (char *)SDL_AndroidGetInternalStoragePath();
 #else
   if (user_game_data_dir == NULL)
     user_game_data_dir = getPath2(getPersonalDataDir(),