From ae14e080847207b20a8dbcdb0ad09f7ce8101e91 Mon Sep 17 00:00:00 2001 From: M4xw Date: Thu, 22 Jun 2023 00:46:02 +0200 Subject: [PATCH 1/2] [Switch] Base implementation for swkbd --- SDL/SDLMain.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/SDL/SDLMain.cpp b/SDL/SDLMain.cpp index ac47c7b478..b62ec69b6b 100644 --- a/SDL/SDLMain.cpp +++ b/SDL/SDLMain.cpp @@ -72,6 +72,11 @@ SDLJoystick *joystick = NULL; #include "CocoaBarItems.h" #endif +#if PPSSPP_PLATFORM(SWITCH) +#define LIBNX_SWKBD_LIMIT 500 // enforced by HOS +extern u32 __nx_applet_type; // Not exposed through a header? +#endif + GlobalUIState lastUIState = UISTATE_MENU; GlobalUIState GetUIState(); @@ -198,6 +203,37 @@ bool System_MakeRequest(SystemRequestType type, int requestId, const std::string // Do a clean exit g_QuitRequested = true; return true; +#if PPSSPP_PLATFORM(SWITCH) + case SystemRequestType::INPUT_TEXT_MODAL: { + Result rc; + SwkbdConfig kbd; + // swkbd only works on "real" titles + if (__nx_applet_type != AppletType_Application && __nx_applet_type != AppletType_SystemApplication) { + g_requestManager.PostSystemFailure(requestId); + return true; + } + + rc = swkbdCreate(&kbd, 0); + + if (R_SUCCEEDED(rc)) { + char buf[LIBNX_SWKBD_LIMIT] = {'\0'}; + swkbdConfigMakePresetDefault(&kbd); + + swkbdConfigSetHeaderText(&kbd, param1.c_str()); + swkbdConfigSetInitialText(&kbd, param2.c_str()); + + rc = swkbdShow(&kbd, buf, sizeof(buf)); + + swkbdClose(&kbd); + + g_requestManager.PostSystemSuccess(requestId, buf); + return true; + } + + g_requestManager.PostSystemFailure(requestId); + return true; + } +#endif // PPSSPP_PLATFORM(SWITCH) #if PPSSPP_PLATFORM(MAC) || PPSSPP_PLATFORM(IOS) case SystemRequestType::BROWSE_FOR_FILE: { From 71639acd162545ab4b0432ad502fc47572eb3852 Mon Sep 17 00:00:00 2001 From: M4xw Date: Thu, 22 Jun 2023 00:47:00 +0200 Subject: [PATCH 2/2] [Switch] Enable all System_InputBoxGetString usages --- UI/ChatScreen.cpp | 4 ++-- UI/GameSettingsScreen.cpp | 14 +++++++------- UI/MainScreen.cpp | 2 +- UI/MemStickScreen.cpp | 2 +- UI/RemoteISOScreen.cpp | 4 ++-- UI/SavedataScreen.cpp | 2 +- UI/TabbedDialogScreen.cpp | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/UI/ChatScreen.cpp b/UI/ChatScreen.cpp index 08538a547d..9d5b8536dd 100644 --- a/UI/ChatScreen.cpp +++ b/UI/ChatScreen.cpp @@ -90,12 +90,12 @@ void ChatMenu::CreateSubviews(const Bounds &screenBounds) { } UI::EventReturn ChatMenu::OnSubmit(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(SDL) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || (defined(SDL) && !PPSSPP_PLATFORM(SWITCH)) std::string chat = chatEdit_->GetText(); chatEdit_->SetText(""); chatEdit_->SetFocus(); sendChat(chat); -#elif PPSSPP_PLATFORM(ANDROID) +#elif PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(SWITCH) auto n = GetI18NCategory(I18NCat::NETWORKING); System_InputBoxGetString(n->T("Chat"), "", [](const std::string &value, int) { sendChat(value); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 5396976f21..61f8bb9ca1 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1443,7 +1443,7 @@ UI::EventReturn GameSettingsScreen::OnAudioDevice(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeQuickChat0(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(SWITCH) auto n = GetI18NCategory(I18NCat::NETWORKING); System_InputBoxGetString(n->T("Enter Quick Chat 1"), g_Config.sQuickChat0, [](const std::string &value, int) { g_Config.sQuickChat0 = value; @@ -1453,7 +1453,7 @@ UI::EventReturn GameSettingsScreen::OnChangeQuickChat0(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeQuickChat1(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(SWITCH) auto n = GetI18NCategory(I18NCat::NETWORKING); System_InputBoxGetString(n->T("Enter Quick Chat 2"), g_Config.sQuickChat1, [](const std::string &value, int) { g_Config.sQuickChat1 = value; @@ -1463,7 +1463,7 @@ UI::EventReturn GameSettingsScreen::OnChangeQuickChat1(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeQuickChat2(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(SWITCH) auto n = GetI18NCategory(I18NCat::NETWORKING); System_InputBoxGetString(n->T("Enter Quick Chat 3"), g_Config.sQuickChat2, [](const std::string &value, int) { g_Config.sQuickChat2 = value; @@ -1473,7 +1473,7 @@ UI::EventReturn GameSettingsScreen::OnChangeQuickChat2(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeQuickChat3(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(SWITCH) auto n = GetI18NCategory(I18NCat::NETWORKING); System_InputBoxGetString(n->T("Enter Quick Chat 4"), g_Config.sQuickChat3, [](const std::string &value, int) { g_Config.sQuickChat3 = value; @@ -1483,7 +1483,7 @@ UI::EventReturn GameSettingsScreen::OnChangeQuickChat3(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeQuickChat4(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(SWITCH) auto n = GetI18NCategory(I18NCat::NETWORKING); System_InputBoxGetString(n->T("Enter Quick Chat 5"), g_Config.sQuickChat4, [](const std::string &value, int) { g_Config.sQuickChat4 = value; @@ -1493,7 +1493,7 @@ UI::EventReturn GameSettingsScreen::OnChangeQuickChat4(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeNickname(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(SWITCH) auto n = GetI18NCategory(I18NCat::NETWORKING); System_InputBoxGetString(n->T("Enter a new PSP nickname"), g_Config.sNickName, [](const std::string &value, int) { g_Config.sNickName = StripSpaces(value); @@ -1946,7 +1946,7 @@ UI::EventReturn HostnameSelectScreen::OnDeleteAllClick(UI::EventParams &e) { UI::EventReturn HostnameSelectScreen::OnEditClick(UI::EventParams& e) { auto n = GetI18NCategory(I18NCat::NETWORKING); -#if PPSSPP_PLATFORM(ANDROID) +#if PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(SWITCH) System_InputBoxGetString(n->T("proAdhocServer Address:"), addrView_->GetText(), [this](const std::string& value, int) { addrView_->SetText(value); }); diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index c100266afa..2c28d54ea1 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -1292,7 +1292,7 @@ bool MainScreen::key(const KeyInput &touch) { if (touch.keyCode == NKCODE_CTRL_LEFT || touch.keyCode == NKCODE_CTRL_RIGHT) searchKeyModifier_ = true; if (touch.keyCode == NKCODE_F && searchKeyModifier_) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) || PPSSPP_PLATFORM(SWITCH) auto se = GetI18NCategory(I18NCat::SEARCH); System_InputBoxGetString(se->T("Search term"), searchFilter_, [&](const std::string &value, int) { searchFilter_ = StripSpaces(value); diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 8aad6a820a..721cf23a29 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -335,7 +335,7 @@ UI::EventReturn MemStickScreen::OnConfirmClick(UI::EventParams ¶ms) { UI::EventReturn MemStickScreen::SetFolderManually(UI::EventParams ¶ms) { // The old way, from before scoped storage. -#if PPSSPP_PLATFORM(ANDROID) +#if PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(SWITCH) auto sy = GetI18NCategory(I18NCat::SYSTEM); System_InputBoxGetString(sy->T("Memory Stick Folder"), g_Config.memStickDirectory.ToString(), [&](const std::string &value, int) { auto sy = GetI18NCategory(I18NCat::SYSTEM); diff --git a/UI/RemoteISOScreen.cpp b/UI/RemoteISOScreen.cpp index 5cb901e5ba..8506790267 100644 --- a/UI/RemoteISOScreen.cpp +++ b/UI/RemoteISOScreen.cpp @@ -641,7 +641,7 @@ void RemoteISOSettingsScreen::CreateViews() { } UI::EventReturn RemoteISOSettingsScreen::OnClickRemoteServer(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) || PPSSPP_PLATFORM(SWITCH) auto ri = GetI18NCategory(I18NCat::REMOTEISO); System_InputBoxGetString(ri->T("Remote Server"), g_Config.sLastRemoteISOServer, [](const std::string &value, int) { g_Config.sLastRemoteISOServer = value; @@ -661,7 +661,7 @@ static void CleanupRemoteISOSubdir() { } UI::EventReturn RemoteISOSettingsScreen::OnClickRemoteISOSubdir(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) || PPSSPP_PLATFORM(SWITCH) auto ri = GetI18NCategory(I18NCat::REMOTEISO); System_InputBoxGetString(ri->T("Remote Subdirectory"), g_Config.sRemoteISOSubdir, [](const std::string &value, int) { g_Config.sRemoteISOSubdir = value; diff --git a/UI/SavedataScreen.cpp b/UI/SavedataScreen.cpp index 77396a5f46..afe92c03db 100644 --- a/UI/SavedataScreen.cpp +++ b/UI/SavedataScreen.cpp @@ -672,7 +672,7 @@ UI::EventReturn SavedataScreen::OnSortClick(UI::EventParams &e) { UI::EventReturn SavedataScreen::OnSearch(UI::EventParams &e) { auto di = GetI18NCategory(I18NCat::DIALOG); -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) || PPSSPP_PLATFORM(SWITCH) System_InputBoxGetString(di->T("Filter"), searchFilter_, [](const std::string &value, int ivalue) { if (ivalue) { NativeMessageReceived("savedatascreen_search", value.c_str()); diff --git a/UI/TabbedDialogScreen.cpp b/UI/TabbedDialogScreen.cpp index 1e5f0af6a3..bf12c3e262 100644 --- a/UI/TabbedDialogScreen.cpp +++ b/UI/TabbedDialogScreen.cpp @@ -155,7 +155,7 @@ void TabbedUIDialogScreenWithGameBackground::ApplySearchFilter() { } UI::EventReturn TabbedUIDialogScreenWithGameBackground::OnChangeSearchFilter(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) || PPSSPP_PLATFORM(SWITCH) auto se = GetI18NCategory(I18NCat::SEARCH); System_InputBoxGetString(se->T("Search term"), searchFilter_, [](const std::string &value, int) { NativeMessageReceived("gameSettings_search", StripSpaces(value).c_str());