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;
}
#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)
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
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)
}
#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)
#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;
int i;
for (i = 0; i < line_length; i++)
- fprintf(stream, "%s", line_chars);
+ fprintf_nonewline(stream, "%s", line_chars);
fprintf_newline(stream, "");
}
{
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);
{ 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", "Ä" },
{ 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 */
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)
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)
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");
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];
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];
#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;
#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
#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
#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)
#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
#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
#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