From 1a73b1d144e0c1242ab68afcf0357a631f624303 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sat, 29 Oct 2016 19:51:02 -0400 Subject: [PATCH] OSK cleanup, add katakana support --- input/input_keyboard.c | 2 +- input/input_keyboard.h | 2 +- menu/drivers/materialui.c | 4 +- menu/drivers/xmb.c | 4 +- menu/menu_event.c | 113 ++++++++++++++++++++++++++++---------- menu/menu_event.h | 5 +- 6 files changed, 93 insertions(+), 37 deletions(-) diff --git a/input/input_keyboard.c b/input/input_keyboard.c index 3322b3a739..31256bc693 100644 --- a/input/input_keyboard.c +++ b/input/input_keyboard.c @@ -166,7 +166,7 @@ static bool input_keyboard_line_event( return false; } -bool input_keyboard_line_append(char* word) +bool input_keyboard_line_append(const char *word) { unsigned len = strlen(word); diff --git a/input/input_keyboard.h b/input/input_keyboard.h index 52c36c7c80..fc287e1c0c 100644 --- a/input/input_keyboard.h +++ b/input/input_keyboard.h @@ -77,7 +77,7 @@ typedef struct input_keyboard_ctx_wait void input_keyboard_event(bool down, unsigned code, uint32_t character, uint16_t mod, unsigned device); -bool input_keyboard_line_append(char* word); +bool input_keyboard_line_append(const char *word); /** * input_keyboard_start_line: diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 628fe05fe1..64dbd02d4c 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -271,7 +271,7 @@ static void mui_draw_text(font_data_t *font, float x, float y, unsigned width, u menu_display_draw_text(font, msg, width, height, ¶ms); } -static void mui_render_keyboard(mui_handle_t *mui, char* grid[], unsigned id) +static void mui_render_keyboard(mui_handle_t *mui, const char *grid[], unsigned id) { unsigned i, width, height; float dark[16]= { @@ -456,7 +456,7 @@ static void mui_render_messagebox(mui_handle_t *mui, } if (menu_input_dialog_get_display_kb()) - mui_render_keyboard(mui, osk_grid, osk_ptr); + mui_render_keyboard(mui, menu_event_get_osk_grid(), menu_event_get_osk_ptr()); end: string_list_free(list); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 23a0d853a8..4caea3661f 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -686,7 +686,7 @@ static void xmb_messagebox(void *data, const char *message) strlcpy(xmb->box_message, message, sizeof(xmb->box_message)); } -static void xmb_render_keyboard(xmb_handle_t *xmb, char* grid[], unsigned id) +static void xmb_render_keyboard(xmb_handle_t *xmb, const char *grid[], unsigned id) { unsigned i, width, height; float dark[16]= { @@ -787,7 +787,7 @@ static void xmb_render_messagebox_internal( } if (menu_input_dialog_get_display_kb()) - xmb_render_keyboard(xmb, osk_grid, osk_ptr); + xmb_render_keyboard(xmb, menu_event_get_osk_grid(), menu_event_get_osk_ptr()); end: string_list_free(list); diff --git a/menu/menu_event.c b/menu/menu_event.c index 9c7f68a07c..6b9735786e 100644 --- a/menu/menu_event.c +++ b/menu/menu_event.c @@ -44,6 +44,68 @@ static unsigned char menu_keyboard_key_state[RETROK_LAST]; +enum osk_type +{ + OSK_TYPE_UNKNOWN = 0U, + OSK_UPPERCASE_LATIN, + OSK_LOWERCASE_LATIN, + OSK_HIRAGANA_PAGE1, + OSK_HIRAGANA_PAGE2, + OSK_KATAKANA_PAGE1, + OSK_KATAKANA_PAGE2, + OSK_TYPE_LAST +}; + +static enum osk_type osk_idx = OSK_UPPERCASE_LATIN; +static unsigned osk_ptr; +static const char *osk_grid[41]; + +static const char *uppercase_grid[] = { + "!","@","#","$","%","^","&","*","(",")", + "Q","W","E","R","T","Y","U","I","O","P", + "A","S","D","F","G","H","J","K","L",":", + "Z","X","C","V","B","N","M"," ","<",">"}; + +static const char *lowercase_grid[] = { + "1","2","3","4","5","6","7","8","9","0", + "q","w","e","r","t","y","u","i","o","p", + "a","s","d","f","g","h","j","k","l",";", + "z","x","c","v","b","n","m"," ",",","."}; + +static const char *hiragana_page1_grid[] = { + "あ","い","う","え","お","ら","り","る","れ","ろ", + "か","き","く","け","こ","が","ぎ","ぐ","げ","ご", + "さ","し","す","せ","そ","ざ","じ","ず","ぜ","ぞ", + "た","ち","つ","て","と","だ","ぢ","づ","で","ど"}; + +static const char *hiragana_page2_grid[] = { + "な","に","ぬ","ね","の","ば","び","ぶ","べ","ぼ", + "は","ひ","ふ","へ","ほ","ぱ","ぴ","ぷ","ぺ","ぽ", + "ま","み","む","め","も","ん","っ","ゃ","ゅ","ょ", + "や","ゆ","よ","わ","を","ぁ","ぃ","ぅ","ぇ","ぉ"}; + +static const char *katakana_page1_grid[] = { + "ア","イ","ウ","エ","オ","ラ","リ","ル","レ","ロ", + "カ","キ","ク","ケ","コ","ガ","ギ","グ","ゲ","ゴ", + "サ","シ","ス","セ","ソ","ザ","ジ","ズ","ゼ","ゾ", + "タ","チ","ツ","テ","ト","ダ","ヂ","ヅ","デ","ド"}; + +static const char *katakana_page2_grid[] = { + "ナ","ニ","ヌ","ネ","ノ","バ","ビ","ブ","ベ","ボ", + "ハ","ヒ","フ","ヘ","ホ","パ","ピ","プ","ペ","ポ", + "マ","ミ","ム","メ","モ","ン","ッ","ャ","ュ","ョ", + "ヤ","ユ","ヨ","ワ","ヲ","ァ","ィ","ゥ","ェ","ォ"}; + +unsigned menu_event_get_osk_ptr() +{ + return osk_ptr; +} + +const char** menu_event_get_osk_grid() +{ + return osk_grid; +} + static int menu_event_pointer(unsigned *action) { const struct retro_keybind *binds[MAX_USERS] = {NULL}; @@ -163,40 +225,35 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) { switch (osk_idx) { - case 0: + case OSK_HIRAGANA_PAGE1: { - char* grid[] = {"!","@","#","$","%","^","&","*","(",")", - "Q","W","E","R","T","Y","U","I","O","P", - "A","S","D","F","G","H","J","K","L",":", - "Z","X","C","V","B","N","M"," ","<",">"}; - memcpy(osk_grid, grid, sizeof(grid)); + memcpy(osk_grid, hiragana_page1_grid, sizeof(hiragana_page1_grid)); break; } - case 1: + case OSK_HIRAGANA_PAGE2: { - char* grid[] = {"1","2","3","4","5","6","7","8","9","0", - "q","w","e","r","t","y","u","i","o","p", - "a","s","d","f","g","h","j","k","l",";", - "z","x","c","v","b","n","m"," ",",","."}; - memcpy(osk_grid, grid, sizeof(grid)); + memcpy(osk_grid, hiragana_page2_grid, sizeof(hiragana_page2_grid)); break; } - case 2: + case OSK_KATAKANA_PAGE1: { - char* grid[] = {"あ","い","う","え","お","ら","り","る","れ","ろ", - "か","き","く","け","こ","が","ぎ","ぐ","げ","ご", - "さ","し","す","せ","そ","ざ","じ","ず","ぜ","ぞ", - "た","ち","つ","て","と","だ","ぢ","づ","で","ど"}; - memcpy(osk_grid, grid, sizeof(grid)); + memcpy(osk_grid, katakana_page1_grid, sizeof(katakana_page1_grid)); break; } - case 3: + case OSK_KATAKANA_PAGE2: { - char* grid[] = {"な","に","ぬ","ね","の","ば","び","ぶ","べ","ぼ", - "は","ひ","ふ","へ","ほ","ぱ","ぴ","ぷ","ぺ","ぽ", - "ま","み","む","め","も","ん","っ","ゃ","ゅ","ょ", - "や","ゆ","よ","わ","を","ぁ","ぃ","ぅ","ぇ","ぉ"}; - memcpy(osk_grid, grid, sizeof(grid)); + memcpy(osk_grid, katakana_page2_grid, sizeof(katakana_page2_grid)); + break; + } + case OSK_LOWERCASE_LATIN: + { + memcpy(osk_grid, lowercase_grid, sizeof(lowercase_grid)); + break; + } + case OSK_UPPERCASE_LATIN: + default: + { + memcpy(osk_grid, uppercase_grid, sizeof(uppercase_grid)); break; } } @@ -227,18 +284,18 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L)) { - if (osk_idx > 0) + if (osk_idx > OSK_TYPE_UNKNOWN + 1) osk_idx--; else - osk_idx = 3; + osk_idx = OSK_TYPE_LAST - 1; } if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R)) { - if (osk_idx < 3) + if (osk_idx < OSK_TYPE_LAST - 1) osk_idx++; else - osk_idx = 0; + osk_idx = OSK_TYPE_UNKNOWN + 1; } if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A)) diff --git a/menu/menu_event.h b/menu/menu_event.h index 8e1eed2a05..15b22df6f6 100644 --- a/menu/menu_event.h +++ b/menu/menu_event.h @@ -39,9 +39,8 @@ void menu_event_keyboard_set(bool down, enum retro_key key); unsigned char menu_event_keyboard_is_set(enum retro_key key); -unsigned osk_ptr; -unsigned osk_idx; -char* osk_grid[41]; +unsigned menu_event_get_osk_ptr(); +const char** menu_event_get_osk_grid(); RETRO_END_DECLS