Files
4JLibs/4J_Input/PS3/INP_OnScreenKeyboard.cpp
T

262 lines
7.5 KiB
C++

#include "INP_Main.h"
#include "INP_OnScreenKeyboard.h"
CKeyboard::CKeyboard()
{
m_pInstance = this;
m_iMode = 0;
cellSysutilRegisterCallback(3, (CellSysutilCallback)&CKeyboard::KeyboardEventsCallback, this);
SetKeyboardLanguage();
}
void CKeyboard::Tick()
{
if (m_iMode == 5)
{
cellOskDialogUnloadAsync(&m_pDialogReturn);
InternalInputManager.DebugPrintf("############## result ##############\n");
InternalInputManager.DebugPrintf("OskDialog result status:\t%d\n", m_pDialogReturn);
if (m_pDialogReturn.result == CELL_OK)
{
InternalInputManager.DebugPrintf("OskDialog return chars :\t%d\n", m_pDialogReturn.numCharsResultString);
InternalInputManager.DebugPrintf("OskDialog return text :\t%S\n", m_pDialogReturn.pResultString);
}
InternalInputManager.DebugPrintf("########################################\n\n");
if (m_pFunc)
{
m_pFunc(m_lpParam, m_pDialogReturn.result == CELL_OK);
}
m_iMode = 0;
}
else if (m_iMode != 4)
{
if (m_iMode == 3)
{
if (m_pTickCountdown)
m_pTickCountdown--;
else
m_iMode = 2;
}
else if (m_iMode == 2)
{
register_osk_callback();
cellOskDialogAddSupportLanguage(CELL_OSKDIALOG_PANELMODE_GERMAN |
CELL_OSKDIALOG_PANELMODE_ENGLISH |
CELL_OSKDIALOG_PANELMODE_SPANISH |
CELL_OSKDIALOG_PANELMODE_FRENCH |
CELL_OSKDIALOG_PANELMODE_ITALIAN |
CELL_OSKDIALOG_PANELMODE_PORTUGUESE |
CELL_OSKDIALOG_PANELMODE_KOREAN |
CELL_OSKDIALOG_PANELMODE_TRADITIONAL_CHINESE |
CELL_OSKDIALOG_PANELMODE_SIMPLIFIED_CHINESE |
CELL_OSKDIALOG_PANELMODE_PORTUGUESE_BRAZIL
);
int iResult;
iResult = cellOskDialogSetKeyLayoutOption(CELL_OSKDIALOG_10KEY_PANEL | CELL_OSKDIALOG_FULLKEY_PANEL);
if ( iResult )
InternalInputManager.DebugPrintf("cellOskDialogSetKeyLayoutOption() = 0x%x \n", iResult);
iResult = cellOskDialogSetInitialKeyLayout(CELL_OSKDIALOG_INITIAL_PANEL_LAYOUT_FULLKEY);
if ( iResult )
InternalInputManager.DebugPrintf("cellOskDialogSetKeyLayoutOption()= 0x%x \n", iResult);
iResult = cellOskDialogExtSetInitialScale(1.0f);
if ( iResult )
InternalInputManager.DebugPrintf("cellOskDialogExtSetInitialScale()= 0x%x \n", iResult);
cellOskDialogSetLayoutMode(CELL_OSKDIALOG_LAYOUTMODE_X_ALIGN_CENTER | CELL_OSKDIALOG_LAYOUTMODE_Y_ALIGN_CENTER);
iResult = cellOskDialogLoadAsync(SYS_MEMORY_CONTAINER_ID_INVALID, &m_pDialogParam, &inputFieldInfo);
if ( iResult != CELL_OK )
{
InternalInputManager.DebugPrintf("cellOskDialogLoadAsync() = 0x%x \n", iResult);
m_iMode = 0;
}
else
{
m_iMode = 4;
}
}
else
{
m_iMode = 3;
m_pTickCountdown = 5;
}
}
}
void CKeyboard::GetText(uint16_t *UTF16String)
{
memcpy(UTF16String, &m_pText, 2*m_pDialogReturn.numCharsResultString);
}
EKeyboardResult CKeyboard::RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int( *Func)(LPVOID,const bool),LPVOID lpParam,C_4JInput::EKeyboardMode eMode)
{
m_pFunc = Func;
m_lpParam = lpParam;
SetMode(1);
inputFieldInfo.message = (uint16_t *)Title;
inputFieldInfo.init_text = (uint16_t *)Text;
inputFieldInfo.limit_length = uiMaxChars;
m_fX = 0.0f;
m_fY = 0;
m_pDialogParam.allowOskPanelFlg = CELL_OSKDIALOG_PANELMODE_DEFAULT;
m_pDialogParam.firstViewPanel = CELL_OSKDIALOG_PANELMODE_DEFAULT;
switch (eMode)
{
case C_4JInput::EKeyboardMode_Alphabet_Extended:
m_pDialogParam.allowOskPanelFlg = CELL_OSKDIALOG_PANELMODE_LATIN;
m_pDialogParam.firstViewPanel = CELL_OSKDIALOG_PANELMODE_LATIN;
break;
case C_4JInput::EKeyboardMode_Alphabet:
m_pDialogParam.allowOskPanelFlg = CELL_OSKDIALOG_PANELMODE_ALPHABET;
m_pDialogParam.firstViewPanel = CELL_OSKDIALOG_PANELMODE_ALPHABET;
break;
case C_4JInput::EKeyboardMode_Password:
m_pDialogParam.allowOskPanelFlg = CELL_OSKDIALOG_PANELMODE_PASSWORD;
m_pDialogParam.firstViewPanel = CELL_OSKDIALOG_PANELMODE_PASSWORD;
break;
case C_4JInput::EKeyboardMode_Numeric:
m_pDialogParam.allowOskPanelFlg = CELL_OSKDIALOG_PANELMODE_NUMERAL;
m_pDialogParam.firstViewPanel = CELL_OSKDIALOG_PANELMODE_NUMERAL;
break;
}
m_pDialogParam.controlPoint.x = m_fX;
m_pDialogParam.prohibitFlgs = 0;
m_pDialogParam.controlPoint.y = m_fY;
m_pDialogReturn.result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK;
m_pDialogReturn.numCharsResultString = uiMaxChars;
memset(m_pText, 0, sizeof(*m_pText));
m_pDialogReturn.pResultString = (uint16_t *)m_pText;
return EKeyboard_Pending;
}
void CKeyboard::DestroyKeyboard()
{
if (m_iMode == 4)
m_pFunc = NULL;
}
void CKeyboard::register_osk_callback()
{
cellOskDialogExtRegisterKeyboardEventHookCallback(3, &CKeyboard::OSK_KeyhookCallback);
}
bool CKeyboard::OSK_KeyhookCallback(CellOskDialogKeyMessage *keyMessage, unsigned int *action, void *pActionInfo)
{
*action = CELL_OSKDIALOG_CHANGE_NO_EVENT;
return false;
}
void CKeyboard::KeyboardEventsCallback(uint64_t status, uint64_t param, CKeyboard* userdata)
{
switch (status)
{
case CELL_SYSUTIL_OSKDIALOG_DISPLAY_CHANGED:
InternalInputManager.DebugPrintf("CELL_SYSUTIL_OSKDIALOG_FINISHED");
if ( param == CELL_OSKDIALOG_DISPLAY_STATUS_HIDE )
{
InternalInputManager.DebugPrintf("CELL_SYSUTIL_OSKDIALOG_FINISHED\n");
InternalInputManager.DebugPrintf("Completed hide of OSK.\n");
}
InternalInputManager.DebugPrintf("CELL_SYSUTIL_OSKDIALOG_FINISHED\n");
break;
case CELL_SYSUTIL_OSKDIALOG_INPUT_DEVICE_CHANGED:
InternalInputManager.DebugPrintf("CELL_SYSUTIL_OSKDIALOG_FINISHED\n");
if ( param == CELL_OSKDIALOG_INPUT_DEVICE_KEYBOARD )
{
InternalInputManager.DebugPrintf("Input device changed to keyboard.\n");
}
else if( param == CELL_OSKDIALOG_INPUT_DEVICE_PAD)
{
InternalInputManager.DebugPrintf("Input device changed to pad.\n");
}
break;
case CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED:
case CELL_SYSUTIL_OSKDIALOG_INPUT_ENTERED:
InternalInputManager.DebugPrintf("CELL_SYSUTIL_OSKDIALOG_FINISHED\n");
break;
case CELL_SYSUTIL_OSKDIALOG_FINISHED:
InternalInputManager.DebugPrintf("CELL_SYSUTIL_OSKDIALOG_FINISHED\n");
if ( userdata->GetMode() == 4 )
userdata->SetMode(5);
break;
case CELL_SYSUTIL_OSKDIALOG_LOADED:
InternalInputManager.DebugPrintf("CELL_SYSUTIL_OSKDIALOG_LOADED\n");
break;
case CELL_SYSUTIL_SYSTEM_MENU_CLOSE:
InternalInputManager.DebugPrintf("CELL_SYSUTIL_OSKDIALOG_FINISHED\n");
InternalInputManager.DebugPrintf("CELL_SYSUTIL_SYSTEM_MENU_CLOSE\n");
break;
case CELL_SYSUTIL_SYSTEM_MENU_OPEN:
InternalInputManager.DebugPrintf("CELL_SYSUTIL_SYSTEM_MENU_OPEN\n");
break;
}
}
void CKeyboard::SetKeyboardLanguage()
{
int language;
cellSysutilGetSystemParamInt(CELL_SYSUTIL_SYSTEMPARAM_ID_LANG, &language);
switch (language)
{
case CELL_SYSUTIL_LANG_PORTUGUESE_BR:
m_iLanguage = 0x10000;
return;
case CELL_SYSUTIL_LANG_CHINESE_T:
case CELL_SYSUTIL_LANG_CHINESE_S:
m_iLanguage = 0x4000;
return;
case CELL_SYSUTIL_LANG_PORTUGUESE_PT:
m_iLanguage = 0x40;
return;
case CELL_SYSUTIL_LANG_ITALIAN:
m_iLanguage = 0x10;
return;
case CELL_SYSUTIL_LANG_GERMAN:
m_iLanguage = 0x1;
return;
case CELL_SYSUTIL_LANG_SPANISH:
m_iLanguage = 0x4;
return;
case CELL_SYSUTIL_LANG_FRENCH:
m_iLanguage = 0x8;
return;
case CELL_SYSUTIL_LANG_DUTCH:
case CELL_SYSUTIL_LANG_ENGLISH_US:
m_iLanguage = 0x2;
return;
case CELL_SYSUTIL_LANG_JAPANESE:
m_iLanguage = 0x200000;
return;
case CELL_SYSUTIL_LANG_KOREAN:
m_iLanguage = 0x1000;
return;
case CELL_SYSUTIL_LANG_RUSSIAN:
m_iLanguage = 0x80;
return;
}
m_iLanguage = 0x200000;
}
void CKeyboard::SetMode(int mode)
{
m_iMode = mode;
}
CKeyboard *CKeyboard::GetInstance()
{
return m_pInstance;
}
int CKeyboard::GetMode()
{
return m_iMode;
}