fgsfds
2 years ago
committed by
Alibek Omarov
4 changed files with 124 additions and 0 deletions
@ -0,0 +1,115 @@ |
|||||||
|
/*
|
||||||
|
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(); |
||||||
|
} |
Loading…
Reference in new issue