From 39282915f8366f16304efffc6e982ddd5d7aae36 Mon Sep 17 00:00:00 2001 From: natinusala Date: Wed, 2 Jan 2019 16:24:31 +0100 Subject: [PATCH] libnx: implement swkbd for menu drivers --- menu/widgets/menu_input_dialog.c | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/menu/widgets/menu_input_dialog.c b/menu/widgets/menu_input_dialog.c index 1017c4c4d5..462eaf6ddb 100644 --- a/menu/widgets/menu_input_dialog.c +++ b/menu/widgets/menu_input_dialog.c @@ -21,6 +21,11 @@ #include "../menu_driver.h" #include "../../input/input_driver.h" +#ifdef HAVE_LIBNX +#include +#include "menu_osk.h" +#endif + static const char **menu_input_dialog_keyboard_buffer = {NULL}; static bool menu_input_dialog_keyboard_display = false; static unsigned menu_input_dialog_keyboard_type = 0; @@ -84,8 +89,58 @@ unsigned menu_input_dialog_get_kb_idx(void) return menu_input_dialog_keyboard_idx; } +#ifdef HAVE_LIBNX +#define LIBNX_SWKBD_LIMIT 500 /* enforced by HOS */ +#endif + bool menu_input_dialog_get_display_kb(void) { +#ifdef HAVE_LIBNX + if (!menu_input_dialog_keyboard_display) + return false; + + SwkbdConfig kbd; + + Result rc = swkbdCreate(&kbd, 0); + + if (R_SUCCEEDED(rc)) + { + char buf[LIBNX_SWKBD_LIMIT] = {'\0'}; + swkbdConfigMakePresetDefault(&kbd); + + swkbdConfigSetGuideText(&kbd, menu_input_dialog_keyboard_label); + + rc = swkbdShow(&kbd, buf, sizeof(buf)); + + swkbdClose(&kbd); + + /* RetroArch uses key-by-key input + so we need to simulate it */ + for (int i = 0; i < LIBNX_SWKBD_LIMIT; i++) + { + /* In case a previous "Enter" press closed the keyboard */ + if (!menu_input_dialog_keyboard_display) + break; + + if (buf[i] == '\n' || buf[i] == '\0') + input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); + else + { + /* input_keyboard_line_append expects a null-terminated + string, so just make one (yes, the touch keyboard is + a list of null-terminated characters) */ + char oldchar = buf[i+1]; + buf[i+1] = '\0'; + input_keyboard_line_append(&buf[i]); + buf[i+1] = oldchar; + } + } + + return false; + } + else + return menu_input_dialog_keyboard_display; +#endif return menu_input_dialog_keyboard_display; }