CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Core/Dialog/PSPOskDialog.h
Views: 1401
// Copyright (c) 2012- PPSSPP Project.12// This program is free software: you can redistribute it and/or modify3// it under the terms of the GNU General Public License as published by4// the Free Software Foundation, version 2.0 or later versions.56// This program is distributed in the hope that it will be useful,7// but WITHOUT ANY WARRANTY; without even the implied warranty of8// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9// GNU General Public License 2.0 for more details.1011// A copy of the GPL 2.0 should have been included with the program.12// If not, see http://www.gnu.org/licenses/1314// Official git repository and contact information can be found at15// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.1617#pragma once1819#include <mutex>20#include <string>2122#include "Core/Dialog/PSPDialog.h"23#include "Core/MemMap.h"24#include "Common/CommonTypes.h"252627/**28* Enumeration for input language29*/30enum SceUtilityOskInputLanguage31{32PSP_UTILITY_OSK_LANGUAGE_DEFAULT = 0x00,33PSP_UTILITY_OSK_LANGUAGE_JAPANESE = 0x01,34PSP_UTILITY_OSK_LANGUAGE_ENGLISH = 0x02,35PSP_UTILITY_OSK_LANGUAGE_FRENCH = 0x03,36PSP_UTILITY_OSK_LANGUAGE_SPANISH = 0x04,37PSP_UTILITY_OSK_LANGUAGE_GERMAN = 0x05,38PSP_UTILITY_OSK_LANGUAGE_ITALIAN = 0x06,39PSP_UTILITY_OSK_LANGUAGE_DUTCH = 0x07,40PSP_UTILITY_OSK_LANGUAGE_PORTUGESE = 0x08,41PSP_UTILITY_OSK_LANGUAGE_RUSSIAN = 0x09,42PSP_UTILITY_OSK_LANGUAGE_KOREAN = 0x0a43};4445/**46* Enumeration for OSK internal state47*/48enum SceUtilityOskState49{50PSP_UTILITY_OSK_DIALOG_NONE = 0, /**< No OSK is currently active */51PSP_UTILITY_OSK_DIALOG_INITING = 1, /**< The OSK is currently being initialized */52PSP_UTILITY_OSK_DIALOG_INITED = 2, /**< The OSK is initialised */53PSP_UTILITY_OSK_DIALOG_VISIBLE = 3, /**< The OSK is visible and ready for use */54PSP_UTILITY_OSK_DIALOG_QUIT = 4, /**< The OSK has been cancelled and should be shut down */55PSP_UTILITY_OSK_DIALOG_FINISHED = 5 /**< The OSK has successfully shut down */56};5758/**59* Enumeration for OSK field results60*/61enum SceUtilityOskResult62{63PSP_UTILITY_OSK_RESULT_UNCHANGED = 0,64PSP_UTILITY_OSK_RESULT_CANCELLED = 1,65PSP_UTILITY_OSK_RESULT_CHANGED = 266};6768/**69* Enumeration for input types (these are limited by initial choice of language)70*/71enum SceUtilityOskInputType72{73PSP_UTILITY_OSK_INPUTTYPE_ALL = 0x00000000,74PSP_UTILITY_OSK_INPUTTYPE_LATIN_DIGIT = 0x00000001,75PSP_UTILITY_OSK_INPUTTYPE_LATIN_SYMBOL = 0x00000002,76PSP_UTILITY_OSK_INPUTTYPE_LATIN_LOWERCASE = 0x00000004,77PSP_UTILITY_OSK_INPUTTYPE_LATIN_UPPERCASE = 0x00000008,78PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_DIGIT = 0x00000100,79PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_SYMBOL = 0x00000200,80PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_LOWERCASE = 0x00000400,81PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_UPPERCASE = 0x00000800,82// http://en.wikipedia.org/wiki/Hiragana83PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_HIRAGANA = 0x00001000,84// http://en.wikipedia.org/wiki/Katakana85// Half-width Katakana86PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_HALF_KATAKANA = 0x00002000,87PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_KATAKANA = 0x00004000,88// http://en.wikipedia.org/wiki/Kanji89PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_KANJI = 0x00008000,90PSP_UTILITY_OSK_INPUTTYPE_RUSSIAN_LOWERCASE = 0x00010000,91PSP_UTILITY_OSK_INPUTTYPE_RUSSIAN_UPPERCASE = 0x00020000,92PSP_UTILITY_OSK_INPUTTYPE_KOREAN = 0x00040000,93PSP_UTILITY_OSK_INPUTTYPE_URL = 0x0008000094};9596#if COMMON_LITTLE_ENDIAN97typedef SceUtilityOskState SceUtilityOskState_le;98typedef SceUtilityOskInputLanguage SceUtilityOskInputLanguage_le;99typedef SceUtilityOskResult SceUtilityOskResult_le;100#else101typedef swap_struct_t<SceUtilityOskState, swap_32_t<SceUtilityOskState> > SceUtilityOskState_le;102typedef swap_struct_t<SceUtilityOskInputLanguage, swap_32_t<SceUtilityOskInputLanguage> > SceUtilityOskInputLanguage_le;103typedef swap_struct_t<SceUtilityOskResult, swap_32_t<SceUtilityOskResult> > SceUtilityOskResult_le;104#endif105106/**107* OSK Field data108*/109struct SceUtilityOskData110{111/** Unknown. Pass 0. */112s32_le unk_00;113/** Unknown. Pass 0. */114s32_le unk_04;115/** One of ::SceUtilityOskInputLanguage */116SceUtilityOskInputLanguage_le language;117/** Unknown. Pass 0. */118s32_le unk_12;119/** One or more of ::SceUtilityOskInputType (types that are selectable by pressing SELECT) */120s32_le inputtype;121/** Number of lines */122s32_le lines;123/** Unknown. Pass 0. */124s32_le unk_24;125/** Description text */126PSPPointer<u16_le> desc;127/** Initial text */128PSPPointer<u16_le> intext;129// Length, in unsigned shorts, including the terminator.130u32_le outtextlength;131/** Pointer to the output text */132PSPPointer<u16_le> outtext;133/** Result. One of ::SceUtilityOskResult */134SceUtilityOskResult_le result;135// Number of characters to allow, not including terminator (if less than outtextlength - 1.)136u32_le outtextlimit;137};138139// Parameters to sceUtilityOskInitStart140struct SceUtilityOskParams141{142pspUtilityDialogCommon base;143// Number of fields.144s32_le fieldCount;145// Pointer to an array of fields (see SceUtilityOskData.)146PSPPointer<SceUtilityOskData> fields;147SceUtilityOskState_le state;148// Maybe just padding?149s32_le unk_60;150};151152// Internal enum, not from PSP.153enum OskKeyboardDisplay154{155OSK_KEYBOARD_LATIN_LOWERCASE,156OSK_KEYBOARD_LATIN_UPPERCASE,157OSK_KEYBOARD_HIRAGANA,158OSK_KEYBOARD_KATAKANA,159OSK_KEYBOARD_KOREAN,160OSK_KEYBOARD_RUSSIAN_LOWERCASE,161OSK_KEYBOARD_RUSSIAN_UPPERCASE,162OSK_KEYBOARD_LATIN_FW_LOWERCASE,163OSK_KEYBOARD_LATIN_FW_UPPERCASE,164// TODO: Something to do native?165OSK_KEYBOARD_COUNT166};167168// Internal enum, not from PSP.169enum OskKeyboardLanguage170{171OSK_LANGUAGE_ENGLISH, //English half-width172OSK_LANGUAGE_JAPANESE,173OSK_LANGUAGE_KOREAN,174OSK_LANGUAGE_RUSSIAN,175OSK_LANGUAGE_ENGLISH_FW, //English full-width (mostly used in Japanese games)176OSK_LANGUAGE_COUNT177};178179// Internal enum, not from PSP.180enum181{182LOWERCASE,183UPPERCASE184};185186const OskKeyboardDisplay OskKeyboardCases[OSK_LANGUAGE_COUNT][2] =187{188{ OSK_KEYBOARD_LATIN_LOWERCASE, OSK_KEYBOARD_LATIN_UPPERCASE },189{ OSK_KEYBOARD_HIRAGANA, OSK_KEYBOARD_KATAKANA },190{ OSK_KEYBOARD_KOREAN, OSK_KEYBOARD_KOREAN }, // Korean only has one case, so just repeat it.191{ OSK_KEYBOARD_RUSSIAN_LOWERCASE, OSK_KEYBOARD_RUSSIAN_UPPERCASE },192{ OSK_KEYBOARD_LATIN_FW_LOWERCASE, OSK_KEYBOARD_LATIN_FW_UPPERCASE }193};194195static const std::string OskKeyboardNames[] =196{197"en_US",198"ja_JP",199"ko_KR",200"ru_RU",201"English Full-width",202};203204enum class PSPOskNativeStatus {205IDLE,206DONE,207WAITING,208SUCCESS,209FAILURE,210};211212class PSPOskDialog: public PSPDialog {213public:214PSPOskDialog(UtilityDialogType type);215~PSPOskDialog();216217int Init(u32 oskPtr);218int Update(int animSpeed) override;219int Shutdown(bool force = false) override;220void DoState(PointerWrap &p) override;221pspUtilityDialogCommon *GetCommonParam() override;222223protected:224bool UseAutoStatus() override {225return false;226}227228private:229static void ConvertUCS2ToUTF8(std::string& _string, const PSPPointer<u16_le>& em_address);230static void ConvertUCS2ToUTF8(std::string& _string, const char16_t *input);231void RenderKeyboard();232int NativeKeyboard();233234std::u16string CombinationString(bool isInput); // for Japanese, Korean235std::u16string CombinationKorean(bool isInput); // for Korea236void RemoveKorean(); // for Korean character removal237238u32 FieldMaxLength();239int GetIndex(const wchar_t* src, wchar_t ch);240241PSPPointer<SceUtilityOskParams> oskParams{};242std::string oskDesc;243std::string oskIntext;244std::string oskOuttext;245246int selectedChar = 0;247std::u16string inputChars;248OskKeyboardDisplay currentKeyboard = OSK_KEYBOARD_LATIN_LOWERCASE;249OskKeyboardLanguage currentKeyboardLanguage = OSK_LANGUAGE_ENGLISH;250bool isCombinated = false;251252std::mutex nativeMutex_;253PSPOskNativeStatus nativeStatus_ = PSPOskNativeStatus::IDLE;254std::string nativeValue_;255256int i_level = 0; // for Korean Keyboard support257int i_value[3]{}; // for Korean Keyboard support258};259260261