You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.7 KiB
115 lines
2.7 KiB
/* |
|
in_psvita.h - psvita-specific input code |
|
Copyright (C) 2021-2023 fgsfds |
|
|
|
This program is free software: you can redistribute it and/or modify |
|
it under the terms of the GNU General Public License as published by |
|
the Free Software Foundation, either version 3 of the License, or |
|
(at your option) any later version. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU General Public License for more details. |
|
*/ |
|
|
|
/* |
|
the SDL fork that we use sometimes fails to call sceImeUpdate, |
|
which leads to input being consumed forever without ever showing the keyboard, |
|
so we just reimplement the whole thing here using SceCommonDialog |
|
*/ |
|
|
|
#include "platform/platform.h" |
|
#include <vitasdk.h> |
|
#include <SDL.h> |
|
|
|
extern int SDL_SendKeyboardText( const char *text ); |
|
|
|
static qboolean ime_enabled; |
|
static SceWChar16 ime_string[SCE_IME_MAX_TEXT_LENGTH + 1]; |
|
|
|
/* this is dumb but will probably work fine enough */ |
|
static inline void utf2ascii( char *dst, const SceWChar16 *src, unsigned dstsize ) |
|
{ |
|
if ( !src || !dst || !dstsize ) |
|
return; |
|
while ( *src && ( dstsize-- > 0 ) ) |
|
*(dst++) = (*(src++)) & 0xFF; |
|
*dst = 0x00; |
|
} |
|
|
|
static void IME_Open( void ) |
|
{ |
|
SceInt32 res; |
|
SceImeDialogParam param; |
|
|
|
memset( ime_string, 0, sizeof( ime_string ) ); |
|
|
|
sceImeDialogParamInit( ¶m ); |
|
param.supportedLanguages = SCE_IME_LANGUAGE_ENGLISH; |
|
param.languagesForced = SCE_TRUE; |
|
param.type = SCE_IME_TYPE_BASIC_LATIN; |
|
param.title = u"Input text"; |
|
param.maxTextLength = SCE_IME_MAX_TEXT_LENGTH; |
|
param.initialText = (SceWChar16 *)u""; |
|
param.inputTextBuffer = ime_string; |
|
|
|
res = sceImeDialogInit( ¶m ); |
|
if ( res < 0 ) |
|
{ |
|
Con_Reportf( S_WARN "Could not open IME keyboard: %d\n", res ); |
|
} |
|
else |
|
{ |
|
ime_enabled = true; |
|
} |
|
} |
|
|
|
static void IME_Close( void ) |
|
{ |
|
if ( ime_enabled ) |
|
{ |
|
ime_enabled = false; |
|
sceImeDialogTerm( ); |
|
} |
|
} |
|
|
|
static void IME_Update( void ) |
|
{ |
|
char ascii_string[SCE_IME_MAX_TEXT_LENGTH + 2] = { 0 }; |
|
SceImeDialogResult result; |
|
SceCommonDialogStatus status = sceImeDialogGetStatus( ); |
|
if( status == 2 ) |
|
{ |
|
memset( &result, 0, sizeof( SceImeDialogResult ) ); |
|
sceImeDialogGetResult( &result ); |
|
if( result.button == SCE_IME_DIALOG_BUTTON_ENTER ) |
|
{ |
|
utf2ascii( ascii_string, ime_string, SCE_IME_MAX_TEXT_LENGTH ); |
|
SDL_SendKeyboardText( ascii_string ); |
|
} |
|
IME_Close(); |
|
} |
|
} |
|
|
|
void Platform_EnableTextInput( qboolean enable ) |
|
{ |
|
if ( enable ) |
|
{ |
|
if ( ime_enabled ) |
|
IME_Close(); |
|
IME_Open(); |
|
SDL_EventState( SDL_TEXTINPUT, SDL_ENABLE ); |
|
} |
|
else |
|
{ |
|
SDL_EventState( SDL_TEXTINPUT, SDL_DISABLE ); |
|
IME_Close(); |
|
} |
|
} |
|
|
|
void PSVita_InputUpdate( void ) |
|
{ |
|
if ( ime_enabled ) |
|
IME_Update(); |
|
}
|
|
|