From 39282915f8366f16304efffc6e982ddd5d7aae36 Mon Sep 17 00:00:00 2001 From: natinusala Date: Wed, 2 Jan 2019 16:24:31 +0100 Subject: [PATCH 1/3] 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; } From a164f77c94ee33dc805f67d481d70956f64fb18b Mon Sep 17 00:00:00 2001 From: natinusala Date: Thu, 3 Jan 2019 14:14:13 +0100 Subject: [PATCH 2/3] libnx: only use swkbd if in an application --- menu/widgets/menu_input_dialog.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/menu/widgets/menu_input_dialog.c b/menu/widgets/menu_input_dialog.c index 462eaf6ddb..23ad790aff 100644 --- a/menu/widgets/menu_input_dialog.c +++ b/menu/widgets/menu_input_dialog.c @@ -91,11 +91,16 @@ unsigned menu_input_dialog_get_kb_idx(void) #ifdef HAVE_LIBNX #define LIBNX_SWKBD_LIMIT 500 /* enforced by HOS */ +extern u32 __nx_applet_type; #endif bool menu_input_dialog_get_display_kb(void) { #ifdef HAVE_LIBNX + /* swkbd only works on "real" titles */ + if (__nx_applet_type != AppletType_Application && __nx_applet_type != AppletType_SystemApplication) + return menu_input_dialog_keyboard_display; + if (!menu_input_dialog_keyboard_display) return false; @@ -128,7 +133,7 @@ bool menu_input_dialog_get_display_kb(void) { /* input_keyboard_line_append expects a null-terminated string, so just make one (yes, the touch keyboard is - a list of null-terminated characters) */ + a list of "null-terminated characters") */ char oldchar = buf[i+1]; buf[i+1] = '\0'; input_keyboard_line_append(&buf[i]); From 6cd7c49c66fec951342112f6b03e90f23c99723b Mon Sep 17 00:00:00 2001 From: natinusala Date: Fri, 4 Jan 2019 14:37:28 +0100 Subject: [PATCH 3/3] libnx: add fail-safe to swkbd --- menu/widgets/menu_input_dialog.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/menu/widgets/menu_input_dialog.c b/menu/widgets/menu_input_dialog.c index 23ad790aff..f339aaf38d 100644 --- a/menu/widgets/menu_input_dialog.c +++ b/menu/widgets/menu_input_dialog.c @@ -141,6 +141,10 @@ bool menu_input_dialog_get_display_kb(void) } } + /* fail-safe */ + if (menu_input_dialog_keyboard_display) + input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); + return false; } else