#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; }