Browse Source

engine: input: psvita: reimplement OSK manually

pull/2/head
fgsfds 2 years ago committed by Alibek Omarov
parent
commit
fe3f15ad33
  1. 1
      engine/platform/platform.h
  2. 115
      engine/platform/psvita/in_psvita.c
  3. 4
      engine/platform/sdl/events.c
  4. 4
      engine/platform/sdl/in_sdl.c

1
engine/platform/platform.h

@ -60,6 +60,7 @@ void NSwitch_Shutdown( void ); @@ -60,6 +60,7 @@ void NSwitch_Shutdown( void );
void PSVita_Init( void );
void PSVita_Shutdown( void );
qboolean PSVita_GetBasePath( char *buf, const size_t buflen );
void PSVita_InputUpdate( void );
#endif
/*

115
engine/platform/psvita/in_psvita.c

@ -0,0 +1,115 @@ @@ -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( &param );
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( &param );
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();
}

4
engine/platform/sdl/events.c

@ -671,6 +671,10 @@ void Platform_RunEvents( void ) @@ -671,6 +671,10 @@ void Platform_RunEvents( void )
while( !host.crashed && !host.shutdown_issued && SDL_PollEvent( &event ) )
SDLash_EventFilter( &event );
#if XASH_PSVITA
PSVita_InputUpdate();
#endif
}
void* Platform_GetNativeObject( const char *name )

4
engine/platform/sdl/in_sdl.c

@ -126,6 +126,8 @@ void Platform_Vibrate( float time, char flags ) @@ -126,6 +126,8 @@ void Platform_Vibrate( float time, char flags )
SDL_JoystickRumble( g_joy, 0xFFFF, 0xFFFF, time * 1000.0f );
}
#if !XASH_PSVITA
/*
=============
SDLash_EnableTextInput
@ -139,6 +141,8 @@ void Platform_EnableTextInput( qboolean enable ) @@ -139,6 +141,8 @@ void Platform_EnableTextInput( qboolean enable )
#endif // SDL_VERSION_ATLEAST( 2, 0, 0 )
}
#endif // !XASH_PSVITA
/*
=============
SDLash_JoyInit_Old

Loading…
Cancel
Save