2020-12-05 13:08:24 +01:00
# include "stdafx.h"
2017-05-15 13:58:32 +02:00
# include "Emu/System.h"
2020-03-14 22:03:56 +01:00
# include "Emu/system_config.h"
2018-12-30 02:34:15 +01:00
# include "Emu/Cell/PPUModule.h"
2020-10-04 22:46:28 +02:00
# include "Emu/Io/interception.h"
2020-02-24 20:09:46 +01:00
# include "Emu/RSX/Overlays/overlay_osk.h"
2020-11-06 18:45:06 +01:00
# include "Emu/IdManager.h"
2017-05-15 13:58:32 +02:00
2017-01-18 23:01:25 +01:00
# include "cellSysutil.h"
# include "cellOskDialog.h"
2017-01-23 18:14:12 +01:00
# include "cellMsgDialog.h"
2015-07-30 03:43:03 +02:00
2019-09-26 20:35:27 +02:00
# include "util/init_mutex.hpp"
2020-11-06 18:45:06 +01:00
# include <thread>
2018-08-25 14:39:00 +02:00
LOG_CHANNEL ( cellOskDialog ) ;
2015-07-30 03:43:03 +02:00
2019-01-04 14:45:32 +01:00
template < >
void fmt_class_string < CellOskDialogError > : : format ( std : : string & out , u64 arg )
{
format_enum ( out , arg , [ ] ( auto error )
{
switch ( error )
{
STR_CASE ( CELL_OSKDIALOG_ERROR_IME_ALREADY_IN_USE ) ;
STR_CASE ( CELL_OSKDIALOG_ERROR_GET_SIZE_ERROR ) ;
STR_CASE ( CELL_OSKDIALOG_ERROR_UNKNOWN ) ;
STR_CASE ( CELL_OSKDIALOG_ERROR_PARAM ) ;
}
return unknown ;
} ) ;
}
2019-01-04 22:28:52 +01:00
OskDialogBase : : ~ OskDialogBase ( )
{
}
2017-01-23 18:14:12 +01:00
2019-09-26 20:35:27 +02:00
struct osk_info
2019-01-29 17:29:55 +01:00
{
2019-09-26 20:35:27 +02:00
std : : shared_ptr < OskDialogBase > dlg ;
atomic_t < bool > use_separate_windows = false ;
atomic_t < CellOskDialogContinuousMode > osk_continuous_mode = CELL_OSKDIALOG_CONTINUOUS_MODE_NONE ;
atomic_t < vm : : ptr < cellOskDialogConfirmWordFilterCallback > > osk_confirm_callback { } ;
stx : : init_mutex init ;
} ;
// TODO: don't use this function
std : : shared_ptr < OskDialogBase > _get_osk_dialog ( bool create = false )
{
2021-03-02 12:59:19 +01:00
auto & osk = g_fxo - > get < osk_info > ( ) ;
2019-09-26 20:35:27 +02:00
if ( create )
2019-01-29 17:29:55 +01:00
{
2021-03-02 12:59:19 +01:00
const auto init = osk . init . init ( ) ;
2019-09-26 20:35:27 +02:00
if ( ! init )
2019-01-29 17:29:55 +01:00
{
2019-09-26 20:35:27 +02:00
return nullptr ;
}
2021-02-03 19:14:31 +01:00
if ( auto manager = g_fxo - > try_get < rsx : : overlays : : display_manager > ( ) )
2019-09-26 20:35:27 +02:00
{
2020-03-14 22:03:56 +01:00
std : : shared_ptr < rsx : : overlays : : osk_dialog > dlg = std : : make_shared < rsx : : overlays : : osk_dialog > ( ) ;
2021-03-02 12:59:19 +01:00
osk . dlg = manager - > add ( dlg ) ;
2019-09-26 20:35:27 +02:00
}
else
{
2021-03-02 12:59:19 +01:00
osk . dlg = Emu . GetCallbacks ( ) . get_osk_dialog ( ) ;
2019-01-29 17:29:55 +01:00
}
2021-03-02 12:59:19 +01:00
return osk . dlg ;
2019-01-29 17:29:55 +01:00
}
else
{
2021-03-02 12:59:19 +01:00
const auto init = osk . init . access ( ) ;
2019-09-26 20:35:27 +02:00
if ( ! init )
2019-01-29 17:29:55 +01:00
{
2019-09-26 20:35:27 +02:00
return nullptr ;
2019-01-29 17:29:55 +01:00
}
2021-03-02 12:59:19 +01:00
return osk . dlg ;
2019-01-29 17:29:55 +01:00
}
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogLoadAsync ( u32 container , vm : : ptr < CellOskDialogParam > dialogParam , vm : : ptr < CellOskDialogInputFieldInfo > inputFieldInfo )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . warning ( " cellOskDialogLoadAsync(container=0x%x, dialogParam=*0x%x, inputFieldInfo=*0x%x) " , container , dialogParam , inputFieldInfo ) ;
2017-01-23 18:14:12 +01:00
2019-01-05 18:11:43 +01:00
if ( ! dialogParam | | ! inputFieldInfo | | ! inputFieldInfo - > message | | ! inputFieldInfo - > init_text | | inputFieldInfo - > limit_length > CELL_OSKDIALOG_STRING_SIZE )
2018-12-30 22:27:37 +01:00
{
return CELL_OSKDIALOG_ERROR_PARAM ;
}
2019-01-29 17:29:55 +01:00
auto osk = _get_osk_dialog ( true ) ;
2018-12-30 22:27:37 +01:00
2019-01-04 02:02:26 +01:00
// Can't open another dialog if this one is already open.
2019-01-04 22:28:52 +01:00
if ( ! osk | | osk - > state . load ( ) = = OskDialogState : : Open )
2018-12-30 22:27:37 +01:00
{
return CELL_SYSUTIL_ERROR_BUSY ;
}
2019-01-05 18:11:43 +01:00
// Get the OSK options
2019-12-02 22:31:34 +01:00
u32 maxLength = ( inputFieldInfo - > limit_length > = CELL_OSKDIALOG_STRING_SIZE ) ? 511 : u32 { inputFieldInfo - > limit_length } ;
2020-03-14 22:03:56 +01:00
const u32 prohibitFlgs = dialogParam - > prohibitFlgs ;
const u32 allowOskPanelFlg = dialogParam - > allowOskPanelFlg ;
const u32 firstViewPanel = dialogParam - > firstViewPanel ;
2017-08-21 01:10:28 +02:00
2019-01-04 14:05:37 +01:00
// Get init text and prepare return value
2019-01-04 22:28:52 +01:00
osk - > osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK ;
std : : memset ( osk - > osk_text , 0 , sizeof ( osk - > osk_text ) ) ;
std : : memset ( osk - > osk_text_old , 0 , sizeof ( osk - > osk_text_old ) ) ;
2017-01-23 18:14:12 +01:00
2019-12-20 04:51:16 +01:00
if ( inputFieldInfo - > init_text )
2018-12-30 20:58:56 +01:00
{
2017-08-21 01:10:28 +02:00
for ( u32 i = 0 ; ( i < maxLength ) & & ( inputFieldInfo - > init_text [ i ] ! = 0 ) ; i + + )
2018-12-30 20:58:56 +01:00
{
2019-01-04 22:28:52 +01:00
osk - > osk_text [ i ] = inputFieldInfo - > init_text [ i ] ;
osk - > osk_text_old [ i ] = inputFieldInfo - > init_text [ i ] ;
2018-12-30 20:58:56 +01:00
}
}
2017-08-21 01:10:28 +02:00
2019-01-04 14:05:37 +01:00
// Get message to display above the input field
// Guarantees 0 terminated (+1). In praxis only 128 but for now lets display all of it
2019-12-20 04:51:16 +01:00
char16_t message [ CELL_OSKDIALOG_STRING_SIZE + 1 ] { } ;
2019-01-04 14:05:37 +01:00
2019-12-20 04:51:16 +01:00
if ( inputFieldInfo - > message )
2019-01-04 14:05:37 +01:00
{
for ( u32 i = 0 ; ( i < CELL_OSKDIALOG_STRING_SIZE ) & & ( inputFieldInfo - > message [ i ] ! = 0 ) ; i + + )
{
message [ i ] = inputFieldInfo - > message [ i ] ;
}
}
2021-02-13 17:05:31 +01:00
atomic_t < bool > result = false ;
2017-01-23 18:14:12 +01:00
2021-04-09 21:12:47 +02:00
osk - > on_osk_close = [ wptr = std : : weak_ptr < OskDialogBase > ( osk ) ] ( s32 status )
2017-01-23 18:14:12 +01:00
{
2018-12-30 02:34:15 +01:00
const auto osk = wptr . lock ( ) ;
2019-01-12 11:30:33 +01:00
2019-01-12 12:53:18 +01:00
if ( osk - > state . atomic_op ( [ & ] ( OskDialogState & state )
{
if ( state = = OskDialogState : : Abort )
{
return true ;
}
state = OskDialogState : : Close ;
return false ;
} ) )
2019-01-12 11:30:33 +01:00
{
2020-10-04 22:46:28 +02:00
input : : SetIntercepted ( false ) ;
2019-01-12 11:30:33 +01:00
sysutil_send_system_cmd ( CELL_SYSUTIL_OSKDIALOG_FINISHED , 0 ) ;
return ;
}
2019-01-05 18:11:43 +01:00
const bool accepted = status = = CELL_MSGDIALOG_BUTTON_OK ;
2019-01-04 04:33:05 +01:00
2019-01-05 18:11:43 +01:00
if ( accepted )
2019-01-04 04:33:05 +01:00
{
2021-03-02 12:59:19 +01:00
if ( auto ccb = g_fxo - > get < osk_info > ( ) . osk_confirm_callback . exchange ( { } ) )
2019-01-05 01:32:45 +01:00
{
2021-09-21 10:29:32 +02:00
std : : vector < u16 > string_to_send ( CELL_OSKDIALOG_STRING_SIZE ) ;
2019-01-05 01:32:45 +01:00
atomic_t < bool > done = false ;
2019-06-07 06:27:49 +02:00
u32 i ;
2019-01-05 01:32:45 +01:00
2019-06-07 06:27:49 +02:00
for ( i = 0 ; i < CELL_OSKDIALOG_STRING_SIZE - 1 ; i + + )
2019-01-05 01:32:45 +01:00
{
string_to_send [ i ] = osk - > osk_text [ i ] ;
if ( osk - > osk_text [ i ] = = 0 ) break ;
}
2021-09-21 10:29:32 +02:00
sysutil_register_cb ( [ & , length = i , string_to_send = std : : move ( string_to_send ) ] ( ppu_thread & cb_ppu ) - > s32
2019-01-05 01:32:45 +01:00
{
2021-09-21 10:29:32 +02:00
vm : : var < u16 [ ] , vm : : page_allocator < > > string_var ( CELL_OSKDIALOG_STRING_SIZE , string_to_send . data ( ) ) ;
const u32 return_value = ccb ( cb_ppu , string_var . begin ( ) , static_cast < s32 > ( length ) ) ;
2019-01-05 01:32:45 +01:00
cellOskDialog . warning ( " osk_confirm_callback return_value=%d " , return_value ) ;
for ( u32 i = 0 ; i < CELL_OSKDIALOG_STRING_SIZE - 1 ; i + + )
{
2021-09-21 10:29:32 +02:00
osk - > osk_text [ i ] = string_var . begin ( ) [ i ] ;
2019-01-05 01:32:45 +01:00
}
done = true ;
return 0 ;
} ) ;
2019-01-05 18:11:43 +01:00
// wait for check callback
2021-02-13 17:05:31 +01:00
while ( ! done & & ! Emu . IsStopped ( ) )
2019-01-05 01:32:45 +01:00
{
2019-01-05 18:11:43 +01:00
std : : this_thread : : yield ( ) ;
2019-01-05 01:32:45 +01:00
}
}
2019-01-05 18:11:43 +01:00
2021-03-02 12:59:19 +01:00
if ( g_fxo - > get < osk_info > ( ) . use_separate_windows . load ( ) & & osk - > osk_text [ 0 ] = = 0 )
2019-01-05 18:11:43 +01:00
{
2019-01-06 13:40:03 +01:00
cellOskDialog . warning ( " cellOskDialogLoadAsync: input result is CELL_OSKDIALOG_INPUT_FIELD_RESULT_NO_INPUT_TEXT " ) ;
osk - > osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_NO_INPUT_TEXT ;
2019-01-05 18:11:43 +01:00
}
else
{
osk - > osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK ;
}
}
else
{
osk - > osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_CANCELED ;
2019-01-04 04:33:05 +01:00
}
2019-01-05 18:11:43 +01:00
// Send OSK status
2021-03-02 12:59:19 +01:00
if ( g_fxo - > get < osk_info > ( ) . use_separate_windows . load ( ) & & ( g_fxo - > get < osk_info > ( ) . osk_continuous_mode . load ( ) ! = CELL_OSKDIALOG_CONTINUOUS_MODE_NONE ) )
2019-01-05 18:11:43 +01:00
{
if ( accepted )
{
2019-01-06 13:40:03 +01:00
sysutil_send_system_cmd ( CELL_SYSUTIL_OSKDIALOG_INPUT_ENTERED , 0 ) ;
2019-01-05 18:11:43 +01:00
}
else
{
sysutil_send_system_cmd ( CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED , 0 ) ;
}
}
else
{
sysutil_send_system_cmd ( CELL_SYSUTIL_OSKDIALOG_FINISHED , 0 ) ;
}
2018-12-30 02:34:15 +01:00
2020-10-04 22:46:28 +02:00
input : : SetIntercepted ( false ) ;
2017-01-23 18:14:12 +01:00
} ;
2019-01-06 13:40:03 +01:00
osk - > on_osk_input_entered = [ wptr = std : : weak_ptr < OskDialogBase > ( osk ) ] ( )
2017-03-16 10:34:47 +01:00
{
2019-01-06 13:40:03 +01:00
const auto osk = wptr . lock ( ) ;
2021-09-19 20:32:47 +02:00
if ( g_fxo - > get < osk_info > ( ) . use_separate_windows . load ( ) & & ( g_fxo - > get < osk_info > ( ) . osk_continuous_mode . load ( ) ! = CELL_OSKDIALOG_CONTINUOUS_MODE_NONE ) )
2019-01-04 04:33:05 +01:00
{
sysutil_send_system_cmd ( CELL_SYSUTIL_OSKDIALOG_INPUT_ENTERED , 0 ) ;
}
2017-03-16 10:34:47 +01:00
} ;
2020-10-04 22:46:28 +02:00
input : : SetIntercepted ( true ) ;
2018-12-30 02:34:15 +01:00
2019-01-05 18:11:43 +01:00
Emu . CallAfter ( [ = , & result ] ( )
2017-01-23 18:14:12 +01:00
{
2020-09-03 20:56:02 +02:00
osk - > Create ( get_localized_string ( localized_string_id : : CELL_OSK_DIALOG_TITLE ) , message , osk - > osk_text , maxLength , prohibitFlgs , allowOskPanelFlg , firstViewPanel ) ;
2018-12-30 02:34:15 +01:00
result = true ;
2021-02-13 17:05:31 +01:00
result . notify_one ( ) ;
2017-01-23 18:14:12 +01:00
} ) ;
2017-03-16 10:34:47 +01:00
sysutil_send_system_cmd ( CELL_SYSUTIL_OSKDIALOG_LOADED , 0 ) ;
2021-02-13 17:05:31 +01:00
while ( ! result & & ! Emu . IsStopped ( ) )
2017-01-23 18:14:12 +01:00
{
2021-02-13 17:05:31 +01:00
thread_ctrl : : wait_on ( result , false ) ;
2017-01-23 18:14:12 +01:00
}
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-04-05 20:14:01 +02:00
error_code cellOskDialogLoadAsyncExt ( )
{
UNIMPLEMENTED_FUNC ( cellOskDialog ) ;
return CELL_OK ;
}
2019-01-04 14:45:32 +01:00
error_code getText ( vm : : ptr < CellOskDialogCallbackReturnParam > OutputInfo , bool is_unload )
2015-07-30 03:43:03 +02:00
{
2018-12-30 20:58:56 +01:00
if ( ! OutputInfo | | OutputInfo - > numCharsResultString < 0 )
{
return CELL_OSKDIALOG_ERROR_PARAM ;
}
2019-01-29 17:29:55 +01:00
const auto osk = _get_osk_dialog ( ) ;
2019-01-04 22:28:52 +01:00
if ( ! osk )
{
return CELL_MSGDIALOG_ERROR_DIALOG_NOT_OPENED ;
}
2018-12-30 20:58:56 +01:00
if ( is_unload )
{
2019-01-06 13:40:03 +01:00
OutputInfo - > result = osk - > osk_input_result . load ( ) ;
2018-12-30 20:58:56 +01:00
}
else
{
2019-01-04 22:28:52 +01:00
if ( memcmp ( osk - > osk_text_old , osk - > osk_text , sizeof ( osk - > osk_text ) ) = = 0 )
2018-12-30 20:58:56 +01:00
{
OutputInfo - > result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_NO_INPUT_TEXT ;
}
else
{
OutputInfo - > result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK ;
}
}
2017-01-18 23:01:25 +01:00
2019-01-12 09:23:43 +01:00
bool do_copy = OutputInfo - > pResultString & & ( OutputInfo - > result = = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK | | ( is_unload & & OutputInfo - > result = = CELL_OSKDIALOG_INPUT_FIELD_RESULT_NO_INPUT_TEXT ) ) ;
2019-01-04 02:02:26 +01:00
2019-05-16 20:49:48 +02:00
for ( s32 i = 0 ; i < CELL_OSKDIALOG_STRING_SIZE - 1 ; i + + )
2017-05-15 13:58:32 +02:00
{
2019-01-04 22:28:52 +01:00
osk - > osk_text_old [ i ] = osk - > osk_text [ i ] ;
2018-12-30 20:58:56 +01:00
2019-01-12 12:00:50 +01:00
if ( do_copy )
2018-12-30 20:58:56 +01:00
{
2019-01-12 12:00:50 +01:00
if ( i < OutputInfo - > numCharsResultString )
2019-01-12 09:23:43 +01:00
{
2019-01-12 12:00:50 +01:00
if ( osk - > osk_text [ i ] = = 0 )
{
do_copy = false ;
}
OutputInfo - > pResultString [ i ] = osk - > osk_text [ i ] ;
}
else
{
OutputInfo - > pResultString [ i ] = 0 ;
2019-01-12 09:23:43 +01:00
do_copy = false ;
}
2018-12-30 20:58:56 +01:00
}
2017-01-23 18:14:12 +01:00
}
2017-01-18 23:01:25 +01:00
2019-01-04 22:28:52 +01:00
if ( is_unload )
{
// Unload should be called last, so remove the dialog here
2021-03-02 12:59:19 +01:00
if ( const auto reset_lock = g_fxo - > get < osk_info > ( ) . init . reset ( ) )
2019-09-26 20:35:27 +02:00
{
// TODO
2021-03-02 12:59:19 +01:00
g_fxo - > get < osk_info > ( ) . dlg . reset ( ) ;
2019-09-26 20:35:27 +02:00
}
2019-01-04 22:28:52 +01:00
sysutil_send_system_cmd ( CELL_SYSUTIL_OSKDIALOG_UNLOADED , 0 ) ;
}
2017-03-16 10:34:47 +01:00
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogUnloadAsync ( vm : : ptr < CellOskDialogCallbackReturnParam > OutputInfo )
2018-12-30 20:58:56 +01:00
{
cellOskDialog . warning ( " cellOskDialogUnloadAsync(OutputInfo=*0x%x) " , OutputInfo ) ;
return getText ( OutputInfo , true ) ;
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogGetSize ( vm : : ptr < u16 > width , vm : : ptr < u16 > height , u32 /*CellOskDialogType*/ dialogType )
2015-07-30 03:43:03 +02:00
{
2019-01-04 22:28:52 +01:00
cellOskDialog . warning ( " cellOskDialogGetSize(width=*0x%x, height=*0x%x, dialogType=%d) " , width , height , dialogType ) ;
2018-12-30 22:27:37 +01:00
if ( ! width | | ! height )
{
return CELL_OSKDIALOG_ERROR_PARAM ;
}
if ( dialogType > = CELL_OSKDIALOG_TYPE_SEPARATE_SINGLELINE_TEXT_WINDOW )
{
* width = 0 ;
}
else
{
* width = 1 ;
}
2017-01-18 23:01:25 +01:00
* height = 1 ;
2018-12-30 22:27:37 +01:00
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogAbort ( )
2015-07-30 03:43:03 +02:00
{
2017-01-23 18:14:12 +01:00
cellOskDialog . warning ( " cellOskDialogAbort() " ) ;
2018-12-30 02:34:15 +01:00
2019-01-29 17:29:55 +01:00
const auto osk = _get_osk_dialog ( ) ;
2018-12-30 02:34:15 +01:00
2019-01-12 12:53:18 +01:00
if ( ! osk )
2018-12-30 02:34:15 +01:00
{
return CELL_MSGDIALOG_ERROR_DIALOG_NOT_OPENED ;
}
2019-01-12 12:53:18 +01:00
const s32 result = osk - > state . atomic_op ( [ ] ( OskDialogState & state )
2018-12-30 02:34:15 +01:00
{
2019-01-12 12:53:18 +01:00
// Check for open dialog. In this case the dialog is only "Open" if it was not aborted before.
if ( state = = OskDialogState : : Abort )
{
return static_cast < s32 > ( CELL_MSGDIALOG_ERROR_DIALOG_NOT_OPENED ) ;
}
// If the dialog has the Open state then it is in use. Only dialogs with the Close state can be aborted.
if ( state = = OskDialogState : : Open )
{
return static_cast < s32 > ( CELL_SYSUTIL_ERROR_BUSY ) ;
}
state = OskDialogState : : Abort ;
return static_cast < s32 > ( CELL_OK ) ;
} ) ;
if ( result ! = CELL_OK )
{
return result ;
2018-12-30 02:34:15 +01:00
}
2019-01-04 22:28:52 +01:00
osk - > osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_ABORT ;
2019-01-05 18:11:43 +01:00
osk - > Close ( false ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogSetDeviceMask ( u32 deviceMask )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogSetDeviceMask(deviceMask=0x%x) " , deviceMask ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogSetSeparateWindowOption ( vm : : ptr < CellOskDialogSeparateWindowOption > windowOption )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogSetSeparateWindowOption(windowOption=*0x%x) " , windowOption ) ;
2019-01-04 04:33:05 +01:00
2019-01-06 13:40:03 +01:00
if ( ! windowOption )
{
return CELL_OSKDIALOG_ERROR_PARAM ;
}
2021-03-02 12:59:19 +01:00
if ( auto & osk = g_fxo - > get < osk_info > ( ) ; true )
2019-06-20 15:51:50 +02:00
{
2021-03-02 12:59:19 +01:00
osk . use_separate_windows = true ;
osk . osk_continuous_mode = static_cast < CellOskDialogContinuousMode > ( + windowOption - > continuousMode ) ;
2019-06-20 15:51:50 +02:00
}
2019-01-04 04:33:05 +01:00
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogSetInitialInputDevice ( vm : : ptr < CellOskDialogInputDevice > inputDevice )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogSetInitialInputDevice(inputDevice=*0x%x) " , inputDevice ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogSetInitialKeyLayout ( vm : : ptr < CellOskDialogInitialKeyLayout > initialKeyLayout )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogSetInitialKeyLayout(initialKeyLayout=*0x%x) " , initialKeyLayout ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogDisableDimmer ( )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogDisableDimmer() " ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogSetKeyLayoutOption ( u32 option )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogSetKeyLayoutOption(option=0x%x) " , option ) ;
2019-10-06 11:32:54 +02:00
if ( option = = 0 | | option > 3 ) // CELL_OSKDIALOG_10KEY_PANEL OR CELL_OSKDIALOG_FULLKEY_PANEL
{
return CELL_OSKDIALOG_ERROR_PARAM ;
}
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogAddSupportLanguage ( u32 supportLanguage )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogAddSupportLanguage(supportLanguage=0x%x) " , supportLanguage ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogSetLayoutMode ( s32 layoutMode )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogSetLayoutMode(layoutMode=%d) " , layoutMode ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogGetInputText ( vm : : ptr < CellOskDialogCallbackReturnParam > OutputInfo )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . warning ( " cellOskDialogGetInputText(OutputInfo=*0x%x) " , OutputInfo ) ;
2018-12-30 20:58:56 +01:00
return getText ( OutputInfo , false ) ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtInputDeviceUnlock ( )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogExtInputDeviceUnlock() " ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-10-06 11:32:54 +02:00
error_code register_keyboard_event_hook_callback ( u16 hookEventMode , vm : : ptr < cellOskDialogHardwareKeyboardEventHookCallback > pCallback )
{
cellOskDialog . todo ( " register_keyboard_event_hook_callback(hookEventMode=%u, pCallback=*0x%x) " , hookEventMode , pCallback ) ;
if ( ! pCallback )
{
return CELL_OSKDIALOG_ERROR_PARAM ;
}
return CELL_OK ;
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtRegisterKeyboardEventHookCallback ( u16 hookEventMode , vm : : ptr < cellOskDialogHardwareKeyboardEventHookCallback > pCallback )
2015-07-30 03:43:03 +02:00
{
2017-01-26 15:53:07 +01:00
cellOskDialog . todo ( " cellOskDialogExtRegisterKeyboardEventHookCallback(hookEventMode=%u, pCallback=*0x%x) " , hookEventMode , pCallback ) ;
2019-10-06 11:32:54 +02:00
if ( hookEventMode = = 0 | | hookEventMode > 3 ) // CELL_OSKDIALOG_EVENT_HOOK_TYPE_FUNCTION_KEY OR CELL_OSKDIALOG_EVENT_HOOK_TYPE_ASCII_KEY
{
return CELL_OSKDIALOG_ERROR_PARAM ;
}
return register_keyboard_event_hook_callback ( hookEventMode , pCallback ) ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtRegisterKeyboardEventHookCallbackEx ( u16 hookEventMode , vm : : ptr < cellOskDialogHardwareKeyboardEventHookCallback > pCallback )
2017-07-21 17:41:11 +02:00
{
cellOskDialog . todo ( " cellOskDialogExtRegisterKeyboardEventHookCallbackEx(hookEventMode=%u, pCallback=*0x%x) " , hookEventMode , pCallback ) ;
2019-10-06 11:32:54 +02:00
if ( hookEventMode = = 0 | | hookEventMode > 7 ) // CELL_OSKDIALOG_EVENT_HOOK_TYPE_FUNCTION_KEY OR CELL_OSKDIALOG_EVENT_HOOK_TYPE_ASCII_KEY OR CELL_OSKDIALOG_EVENT_HOOK_TYPE_ONLY_MODIFIER
{
return CELL_OSKDIALOG_ERROR_PARAM ;
}
return register_keyboard_event_hook_callback ( hookEventMode , pCallback ) ;
2017-07-21 17:41:11 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtAddJapaneseOptionDictionary ( vm : : cpptr < char > filePath )
2015-07-30 03:43:03 +02:00
{
2017-01-26 15:53:07 +01:00
cellOskDialog . todo ( " cellOskDialogExtAddJapaneseOptionDictionary(filePath=**0x%0x) " , filePath ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtEnableClipboard ( )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogExtEnableClipboard() " ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-05 18:11:43 +01:00
error_code cellOskDialogExtSendFinishMessage ( u32 /*CellOskDialogFinishReason*/ finishReason )
2015-07-30 03:43:03 +02:00
{
2019-01-05 18:11:43 +01:00
cellOskDialog . warning ( " cellOskDialogExtSendFinishMessage(finishReason=%d) " , finishReason ) ;
2019-01-29 17:29:55 +01:00
const auto osk = _get_osk_dialog ( ) ;
2019-01-05 18:11:43 +01:00
// Check for open dialog.
if ( ! osk | | osk - > state . load ( ) ! = OskDialogState : : Open )
{
return CELL_MSGDIALOG_ERROR_DIALOG_NOT_OPENED ;
}
osk - > Close ( finishReason = = CELL_OSKDIALOG_CLOSE_CONFIRM ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtAddOptionDictionary ( vm : : cptr < CellOskDialogImeDictionaryInfo > dictionaryInfo )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogExtAddOptionDictionary(dictionaryInfo=*0x%x) " , dictionaryInfo ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtSetInitialScale ( f32 initialScale )
2015-07-30 03:43:03 +02:00
{
2017-01-26 15:53:07 +01:00
cellOskDialog . todo ( " cellOskDialogExtSetInitialScale(initialScale=%f) " , initialScale ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtInputDeviceLock ( )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogExtInputDeviceLock() " ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtSetBaseColor ( f32 red , f32 blue , f32 green , f32 alpha )
2015-07-30 03:43:03 +02:00
{
2019-01-04 22:28:52 +01:00
cellOskDialog . todo ( " cellOskDialogExtSetBaseColor(red=%f, blue=%f, green=%f, alpha=%f) " , red , blue , green , alpha ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtRegisterConfirmWordFilterCallback ( vm : : ptr < cellOskDialogConfirmWordFilterCallback > pCallback )
2015-07-30 03:43:03 +02:00
{
2019-01-04 22:28:52 +01:00
cellOskDialog . warning ( " cellOskDialogExtRegisterConfirmWordFilterCallback(pCallback=*0x%x) " , pCallback ) ;
2019-01-05 01:32:45 +01:00
2019-01-12 09:23:43 +01:00
if ( ! pCallback )
{
return CELL_OSKDIALOG_ERROR_PARAM ;
}
2021-03-02 12:59:19 +01:00
if ( auto & osk = g_fxo - > get < osk_info > ( ) ; true )
2019-06-20 15:51:50 +02:00
{
2021-03-02 12:59:19 +01:00
osk . osk_confirm_callback = pCallback ;
2019-06-20 15:51:50 +02:00
}
2019-01-05 01:32:45 +01:00
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtUpdateInputText ( )
2015-07-30 03:43:03 +02:00
{
2017-01-26 15:53:07 +01:00
cellOskDialog . todo ( " cellOskDialogExtUpdateInputText() " ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtDisableHalfByteKana ( )
2015-07-30 03:43:03 +02:00
{
2017-01-26 15:53:07 +01:00
cellOskDialog . todo ( " cellOskDialogExtDisableHalfByteKana() " ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtSetPointerEnable ( b8 enable )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogExtSetPointerEnable(enable=%d) " , enable ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtUpdatePointerDisplayPos ( /*const CellOskDialogPoint pos*/ )
2015-07-30 03:43:03 +02:00
{
2018-12-30 02:34:15 +01:00
cellOskDialog . todo ( " cellOskDialogExtUpdatePointerDisplayPos(posX=%f, posY=%f) " /*, pos.x, pos.y*/ ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtEnableHalfByteKana ( )
2015-07-30 03:43:03 +02:00
{
2017-01-18 23:01:25 +01:00
cellOskDialog . todo ( " cellOskDialogExtEnableHalfByteKana() " ) ;
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
2019-01-04 14:45:32 +01:00
error_code cellOskDialogExtRegisterForceFinishCallback ( vm : : ptr < cellOskDialogForceFinishCallback > pCallback )
2015-07-30 03:43:03 +02:00
{
2017-01-26 15:53:07 +01:00
cellOskDialog . todo ( " cellOskDialogExtRegisterForceFinishCallback(pCallback=*0x%x) " , pCallback ) ;
2019-10-06 11:32:54 +02:00
if ( ! pCallback )
{
return CELL_OSKDIALOG_ERROR_PARAM ;
}
2017-05-15 13:58:32 +02:00
return CELL_OK ;
2015-07-30 03:43:03 +02:00
}
void cellSysutil_OskDialog_init ( )
{
REG_FUNC ( cellSysutil , cellOskDialogLoadAsync ) ;
2019-04-05 20:14:01 +02:00
REG_FUNC ( cellSysutil , cellOskDialogLoadAsyncExt ) ;
2015-07-30 03:43:03 +02:00
REG_FUNC ( cellSysutil , cellOskDialogUnloadAsync ) ;
REG_FUNC ( cellSysutil , cellOskDialogGetSize ) ;
REG_FUNC ( cellSysutil , cellOskDialogAbort ) ;
REG_FUNC ( cellSysutil , cellOskDialogSetDeviceMask ) ;
REG_FUNC ( cellSysutil , cellOskDialogSetSeparateWindowOption ) ;
REG_FUNC ( cellSysutil , cellOskDialogSetInitialInputDevice ) ;
REG_FUNC ( cellSysutil , cellOskDialogSetInitialKeyLayout ) ;
REG_FUNC ( cellSysutil , cellOskDialogDisableDimmer ) ;
REG_FUNC ( cellSysutil , cellOskDialogSetKeyLayoutOption ) ;
REG_FUNC ( cellSysutil , cellOskDialogAddSupportLanguage ) ;
REG_FUNC ( cellSysutil , cellOskDialogSetLayoutMode ) ;
REG_FUNC ( cellSysutil , cellOskDialogGetInputText ) ;
}
2016-03-21 20:43:03 +01:00
DECLARE ( ppu_module_manager : : cellOskDialog ) ( " cellOskExtUtility " , [ ] ( )
{
REG_FUNC ( cellOskExtUtility , cellOskDialogExtInputDeviceUnlock ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtRegisterKeyboardEventHookCallback ) ;
2017-07-21 17:41:11 +02:00
REG_FUNC ( cellOskExtUtility , cellOskDialogExtRegisterKeyboardEventHookCallbackEx ) ;
2016-03-21 20:43:03 +01:00
REG_FUNC ( cellOskExtUtility , cellOskDialogExtAddJapaneseOptionDictionary ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtEnableClipboard ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtSendFinishMessage ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtAddOptionDictionary ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtSetInitialScale ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtInputDeviceLock ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtSetBaseColor ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtRegisterConfirmWordFilterCallback ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtUpdateInputText ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtDisableHalfByteKana ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtSetPointerEnable ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtUpdatePointerDisplayPos ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtEnableHalfByteKana ) ;
REG_FUNC ( cellOskExtUtility , cellOskDialogExtRegisterForceFinishCallback ) ;
2015-07-30 03:43:03 +02:00
} ) ;