262 lines
7.5 KiB
C++
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;
|
|
} |