From 31073214b6b216a349b178406e7bc4fcedeccecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Andr=C3=A9=20Santoni?= Date: Mon, 31 Oct 2016 19:36:33 +0100 Subject: [PATCH] Add special keys on the OSK --- menu/drivers/xmb.c | 18 ++++----- menu/menu_event.c | 98 +++++++++++++++++++++++++++++++--------------- menu/menu_event.h | 1 + menu/menu_input.c | 4 +- 4 files changed, 78 insertions(+), 43 deletions(-) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index a2cbaa4932..58bb9bce45 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -713,22 +713,22 @@ static void xmb_render_keyboard(xmb_handle_t *xmb, const char *grid[], unsigned width, height, &dark[0]); - for (i = 0; i <= 40; i++) + for (i = 0; i <= 44; i++) { int line_y; - int ptr_width = height / 12; - line_y = (i / 10)*height/10.0; + int ptr_width = height / 13; + line_y = (i / 11)*height/10.0; if (i == id) menu_display_draw_quad( - width/11.0 + (i % 10) * width/11.0 - ptr_width/2, + width/12.0 + (i % 11) * width/12.0 - ptr_width/2, height*2.5/4.0 + line_y - ptr_width/2 - xmb->font->size / 4, ptr_width, ptr_width, width, height, &light[0]); xmb_draw_text(xmb, grid[i], - width/11.0 + (i % 10) * width/11.0, + width/12.0 + (i % 11) * width/12.0, height*2.5/4.0 + line_y, 1, 1, TEXT_ALIGN_CENTER, width, height, xmb->font); } @@ -745,11 +745,11 @@ static int xmb_osk_ptr_at_pos(void *data, int x, int y) video_driver_get_size(&width, &height); - for (i = 0; i <= 40; i++) + for (i = 0; i <= 44; i++) { - int ptr_width = height / 12; - int line_y = (i / 10)*height/10.0; - int ptr_x = width/11.0 + (i % 10) * width/11.0 - ptr_width/2; + int ptr_width = height / 13; + int line_y = (i / 11)*height/10.0; + int ptr_x = width/12.0 + (i % 11) * width/12.0 - ptr_width/2; int ptr_y = height*2.5/4.0 + line_y - ptr_width/2 - xmb->font->size / 4; if (x > ptr_x && x < ptr_x + ptr_width diff --git a/menu/menu_event.c b/menu/menu_event.c index 0191906f50..ebf86d640d 100644 --- a/menu/menu_event.c +++ b/menu/menu_event.c @@ -49,8 +49,8 @@ static unsigned char menu_keyboard_key_state[RETROK_LAST]; enum osk_type { OSK_TYPE_UNKNOWN = 0U, - OSK_UPPERCASE_LATIN, OSK_LOWERCASE_LATIN, + OSK_UPPERCASE_LATIN, OSK_HIRAGANA_PAGE1, OSK_HIRAGANA_PAGE2, OSK_KATAKANA_PAGE1, @@ -58,47 +58,47 @@ enum osk_type OSK_TYPE_LAST }; -static enum osk_type osk_idx = OSK_UPPERCASE_LATIN; +static enum osk_type osk_idx = OSK_LOWERCASE_LATIN; static int osk_ptr; -static const char *osk_grid[41]; +static const char *osk_grid[45]; static unsigned osk_last_codepoint = 0; static unsigned osk_last_codepoint_len = 0; 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"," ","<",">"}; + "!","@","#","$","%","^","&","*","(",")","⇦", + "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"," ",",","."}; + "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[] = { - "ナ","ニ","ヌ","ネ","ノ","バ","ビ","ブ","ベ","ボ", - "ハ","ヒ","フ","ヘ","ホ","パ","ピ","プ","ペ","ポ", - "マ","ミ","ム","メ","モ","ン","ッ","ャ","ュ","ョ", - "ヤ","ユ","ヨ","ワ","ヲ","ァ","ィ","ゥ","ェ","ォ"}; + "ナ","ニ","ヌ","ネ","ノ","バ","ビ","ブ","ベ","ボ","⇦", + "ハ","ヒ","フ","ヘ","ホ","パ","ピ","プ","ペ","ポ","⏎", + "マ","ミ","ム","メ","モ","ン","ッ","ャ","ュ","ョ","⇧", + "ヤ","ユ","ヨ","ワ","ヲ","ァ","ィ","ゥ","ェ","ォ","⊕"}; int menu_event_get_osk_ptr() { @@ -110,6 +110,40 @@ void menu_event_set_osk_ptr(int i) osk_ptr = i; } +void menu_event_osk_append(int ptr) +{ + if (ptr >= 0) + { + if (!strcmp(osk_grid[ptr],"⇦")) + { + input_keyboard_event(true, '\x7f', '\x7f', 0, RETRO_DEVICE_KEYBOARD); + } + else if (!strcmp(osk_grid[ptr],"⏎")) + { + input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); + } + else if (!strcmp(osk_grid[ptr],"⇧")) + { + osk_idx = OSK_UPPERCASE_LATIN; + } + else if (!strcmp(osk_grid[ptr],"⇩")) + { + osk_idx = OSK_LOWERCASE_LATIN; + } + else if (!strcmp(osk_grid[ptr],"⊕")) + { + if (osk_idx < OSK_TYPE_LAST - 1) + osk_idx = (enum osk_type)(osk_idx + 1); + else + osk_idx = (enum osk_type)(OSK_TYPE_UNKNOWN + 1); + } + else + { + input_keyboard_line_append(osk_grid[ptr]); + } + } +} + const char** menu_event_get_osk_grid() { return osk_grid; @@ -269,19 +303,19 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN)) { - if (osk_ptr < 30) - osk_ptr = osk_ptr + 10; + if (osk_ptr < 33) + osk_ptr = osk_ptr + 11; } if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP)) { if (osk_ptr >= 10) - osk_ptr = osk_ptr - 10; + osk_ptr = osk_ptr - 11; } if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT)) { - if (osk_ptr < 39) + if (osk_ptr < 44) osk_ptr = osk_ptr + 1; } @@ -316,7 +350,7 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) osk_last_codepoint_len = strlen(osk_grid[osk_ptr]); osk_last_codepoint = utf8_walk(&letter); - input_keyboard_line_append(osk_grid[osk_ptr]); + menu_event_osk_append(osk_ptr); } } diff --git a/menu/menu_event.h b/menu/menu_event.h index 55d5c78c20..a16ce753b8 100644 --- a/menu/menu_event.h +++ b/menu/menu_event.h @@ -41,6 +41,7 @@ unsigned char menu_event_keyboard_is_set(enum retro_key key); int menu_event_get_osk_ptr(); void menu_event_set_osk_ptr(int); +void menu_event_osk_append(int); const char** menu_event_get_osk_grid(); RETRO_END_DECLS diff --git a/menu/menu_input.c b/menu/menu_input.c index 61c8430d0d..3ae987dd08 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -255,7 +255,7 @@ static int menu_input_mouse_frame( if (point.retcode > -1) { menu_event_set_osk_ptr(point.retcode); - input_keyboard_line_append(menu_event_get_osk_grid()[point.retcode]); + menu_event_osk_append(point.retcode); } } else @@ -457,7 +457,7 @@ static int menu_input_pointer_post_iterate( if (point.retcode > -1) { menu_event_set_osk_ptr(point.retcode); - input_keyboard_line_append(menu_event_get_osk_grid()[point.retcode]); + menu_event_osk_append(point.retcode); } } else