Skip to content

Commit

Permalink
switch: add software keyboard support (devkitPro#49)
Browse files Browse the repository at this point in the history
  • Loading branch information
Cpasjuste authored and WinterMute committed Jan 20, 2024
1 parent 0428021 commit 84fd9f5
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/joystick/switch/SDL_sysjoystick.c
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ SWITCH_JoystickUpdate(SDL_Joystick *joystick)
static JoystickState pad_old[JOYSTICK_COUNT];

int index = (int) SDL_JoystickInstanceID(joystick);
if (index > JOYSTICK_COUNT) {
if (index > JOYSTICK_COUNT || SDL_IsTextInputActive()) {
return;
}

Expand Down
111 changes: 111 additions & 0 deletions src/video/switch/SDL_switchswkb.c
Original file line number Diff line number Diff line change
@@ -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
20 changes: 20 additions & 0 deletions src/video/switch/SDL_switchswkb.h
Original file line number Diff line number Diff line change
@@ -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
28 changes: 21 additions & 7 deletions src/video/switch/SDL_switchvideo.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "SDL_switchtouch.h"
#include "SDL_switchkeyboard.h"
#include "SDL_switchmouse_c.h"
#include "SDL_switchswkb.h"

/* Currently only one window */
static SDL_Window *switch_window = NULL;
Expand Down Expand Up @@ -105,6 +106,11 @@ SWITCH_CreateDevice(int devindex)
device->GL_DeleteContext = SWITCH_GLES_DeleteContext;
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;

return device;
Expand Down Expand Up @@ -141,10 +147,12 @@ SWITCH_VideoInit(_THIS)

// init touch
SWITCH_InitTouch();
//init keyboard
// init keyboard
SWITCH_InitKeyboard();
//init mouse
// init mouse
SWITCH_InitMouse();
// init software keyboard
SWITCH_InitSwkb();

return 0;
}
Expand All @@ -158,10 +166,12 @@ SWITCH_VideoQuit(_THIS)

// exit touch
SWITCH_QuitTouch();
//exit keyboard
// exit keyboard
SWITCH_QuitKeyboard();
//exit mouse
// exit mouse
SWITCH_QuitMouse();
// exit software keyboard
SWITCH_QuitSwkb();
}

void
Expand Down Expand Up @@ -343,9 +353,13 @@ SWITCH_PumpEvents(_THIS)
}

hidScanInput();
SWITCH_PollTouch();
SWITCH_PollKeyboard();
SWITCH_PollMouse();
// we don't want other inputs overlapping with software keyboard
if(!SDL_IsTextInputActive()) {
SWITCH_PollTouch();
SWITCH_PollKeyboard();
SWITCH_PollMouse();
}
SWITCH_PollSwkb();

// handle docked / un-docked modes
// note that SDL_WINDOW_RESIZABLE is only possible in windowed mode,
Expand Down

0 comments on commit 84fd9f5

Please sign in to comment.