From: Holger Schemel Date: Sat, 4 Jan 2014 02:08:37 +0000 (+0100) Subject: rnd-20140104-1-src X-Git-Tag: 4.0.0.0-rc1~420 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=307f92e3ee14cdab72466e5998eef66c0ef3ae38 rnd-20140104-1-src * fixed key code problems with certain keys for SDL2 * fixed text input problems for text characters using modifier keys --- diff --git a/ChangeLog b/ChangeLog index a5754525..4e650a73 100644 --- 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) diff --git a/src/conftime.h b/src/conftime.h index b78c5773..09eada1e 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2014-01-03 16:39" +#define COMPILE_DATE_STRING "2014-01-04 02:29" diff --git a/src/events.c b/src/events.c index 0be6815b..50a39762 100644 --- a/src/events.c +++ b/src/events.c @@ -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) diff --git a/src/events.h b/src/events.h index 02ad1660..7a6a7cb0 100644 --- a/src/events.h +++ b/src/events.h @@ -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 *); diff --git a/src/libgame/misc.c b/src/libgame/misc.c index d2b7b4e7..d0746a46 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -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]; diff --git a/src/libgame/sdl.h b/src/libgame/sdl.h index 6f130bb1..254b9927 100644 --- a/src/libgame/sdl.h +++ b/src/libgame/sdl.h @@ -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 diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 5dbbdada..5fb7e466 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -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(),