switch: add software keyboard support (#49)

This commit is contained in:
Cpasjuste 2020-05-03 17:07:59 +02:00 committed by Dave Murphy
parent f94ecdc57f
commit 69747d1378
4 changed files with 153 additions and 8 deletions

View File

@ -156,7 +156,7 @@ SWITCH_JoystickUpdate(SDL_Joystick *joystick)
static JoystickState pad_old[JOYSTICK_COUNT]; static JoystickState pad_old[JOYSTICK_COUNT];
int index = (int) SDL_JoystickInstanceID(joystick); int index = (int) SDL_JoystickInstanceID(joystick);
if (index > JOYSTICK_COUNT) { if (index > JOYSTICK_COUNT || SDL_IsTextInputActive()) {
return; return;
} }

View File

@ -0,0 +1,111 @@
//
// Created by cpasjuste on 22/04/2020.
//
#include "../../SDL_internal.h"
#if SDL_VIDEO_DRIVER_SWITCH
#include <switch.h>
#include "SDL_switchswkb.h"
static SwkbdInline kbd;
static SwkbdAppearArg kbdAppearArg;
static bool kbdInited = SDL_FALSE;
static bool kbdShown = SDL_FALSE;
void
SWITCH_InitSwkb()
{
}
void
SWITCH_PollSwkb(void)
{
if(kbdInited) {
if(kbdShown) {
swkbdInlineUpdate(&kbd, NULL);
} else if(SDL_IsTextInputActive()) {
SDL_StopTextInput();
}
}
}
void
SWITCH_QuitSwkb()
{
if(kbdInited) {
swkbdInlineClose(&kbd);
kbdInited = false;
}
}
SDL_bool
SWITCH_HasScreenKeyboardSupport(_THIS)
{
return SDL_TRUE;
}
SDL_bool
SWITCH_IsScreenKeyboardShown(_THIS, SDL_Window *window)
{
return kbdShown;
}
static void
SWITCH_EnterCb(const char *str, SwkbdDecidedEnterArg* arg)
{
if(arg->stringLen > 0) {
SDL_SendKeyboardText(str);
}
kbdShown = false;
}
static void
SWITCH_CancelCb(void)
{
SDL_StopTextInput();
}
void
SWITCH_StartTextInput(_THIS)
{
Result rc;
if(!kbdInited) {
rc = swkbdInlineCreate(&kbd);
if (R_SUCCEEDED(rc)) {
rc = swkbdInlineLaunchForLibraryApplet(&kbd, SwkbdInlineMode_AppletDisplay, 0);
if(R_SUCCEEDED(rc)) {
swkbdInlineSetDecidedEnterCallback(&kbd, SWITCH_EnterCb);
swkbdInlineSetDecidedCancelCallback(&kbd, SWITCH_CancelCb);
swkbdInlineMakeAppearArg(&kbdAppearArg, SwkbdType_Normal);
swkbdInlineAppearArgSetOkButtonText(&kbdAppearArg, "Submit");
kbdAppearArg.dicFlag = 1;
kbdAppearArg.returnButtonFlag = 1;
kbdInited = true;
}
}
}
if(kbdInited) {
swkbdInlineSetInputText(&kbd, "");
swkbdInlineSetCursorPos(&kbd, 0);
swkbdInlineUpdate(&kbd, NULL);
swkbdInlineAppear(&kbd, &kbdAppearArg);
kbdShown = true;
}
}
void
SWITCH_StopTextInput(_THIS)
{
if(kbdInited) {
swkbdInlineDisappear(&kbd);
}
kbdShown = false;
}
#endif

View File

@ -0,0 +1,20 @@
//
// Created by cpasjuste on 22/04/2020.
//
#ifndef SDL2_SDL_SWITCHSWKB_H
#define SDL2_SDL_SWITCHSWKB_H
#include "../../events/SDL_events_c.h"
extern void SWITCH_InitSwkb();
extern void SWITCH_PollSwkb();
extern void SWITCH_QuitSwkb();
extern SDL_bool SWITCH_HasScreenKeyboardSupport(_THIS);
extern SDL_bool SWITCH_IsScreenKeyboardShown(_THIS, SDL_Window * window);
extern void SWITCH_StartTextInput(_THIS);
extern void SWITCH_StopTextInput(_THIS);
#endif //SDL2_SDL_SWITCHSWKB_H

View File

@ -34,6 +34,7 @@
#include "SDL_switchtouch.h" #include "SDL_switchtouch.h"
#include "SDL_switchkeyboard.h" #include "SDL_switchkeyboard.h"
#include "SDL_switchmouse_c.h" #include "SDL_switchmouse_c.h"
#include "SDL_switchswkb.h"
/* Currently only one window */ /* Currently only one window */
static SDL_Window *switch_window = NULL; static SDL_Window *switch_window = NULL;
@ -105,6 +106,11 @@ SWITCH_CreateDevice(int devindex)
device->GL_DeleteContext = SWITCH_GLES_DeleteContext; device->GL_DeleteContext = SWITCH_GLES_DeleteContext;
device->GL_DefaultProfileConfig = SWITCH_GLES_DefaultProfileConfig; device->GL_DefaultProfileConfig = SWITCH_GLES_DefaultProfileConfig;
device->StartTextInput = SWITCH_StartTextInput;
device->StopTextInput = SWITCH_StopTextInput;
device->HasScreenKeyboardSupport = SWITCH_HasScreenKeyboardSupport;
device->IsScreenKeyboardShown = SWITCH_IsScreenKeyboardShown;
device->PumpEvents = SWITCH_PumpEvents; device->PumpEvents = SWITCH_PumpEvents;
return device; return device;
@ -141,10 +147,12 @@ SWITCH_VideoInit(_THIS)
// init touch // init touch
SWITCH_InitTouch(); SWITCH_InitTouch();
//init keyboard // init keyboard
SWITCH_InitKeyboard(); SWITCH_InitKeyboard();
//init mouse // init mouse
SWITCH_InitMouse(); SWITCH_InitMouse();
// init software keyboard
SWITCH_InitSwkb();
return 0; return 0;
} }
@ -158,10 +166,12 @@ SWITCH_VideoQuit(_THIS)
// exit touch // exit touch
SWITCH_QuitTouch(); SWITCH_QuitTouch();
//exit keyboard // exit keyboard
SWITCH_QuitKeyboard(); SWITCH_QuitKeyboard();
//exit mouse // exit mouse
SWITCH_QuitMouse(); SWITCH_QuitMouse();
// exit software keyboard
SWITCH_QuitSwkb();
} }
void void
@ -343,9 +353,13 @@ SWITCH_PumpEvents(_THIS)
} }
hidScanInput(); hidScanInput();
SWITCH_PollTouch(); // we don't want other inputs overlapping with software keyboard
SWITCH_PollKeyboard(); if(!SDL_IsTextInputActive()) {
SWITCH_PollMouse(); SWITCH_PollTouch();
SWITCH_PollKeyboard();
SWITCH_PollMouse();
}
SWITCH_PollSwkb();
// handle docked / un-docked modes // handle docked / un-docked modes
// note that SDL_WINDOW_RESIZABLE is only possible in windowed mode, // note that SDL_WINDOW_RESIZABLE is only possible in windowed mode,