Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hrydgard
GitHub Repository: hrydgard/ppsspp
Path: blob/master/Core/Dialog/PSPOskDialog.h
3186 views
1
// Copyright (c) 2012- PPSSPP Project.
2
3
// This program is free software: you can redistribute it and/or modify
4
// it under the terms of the GNU General Public License as published by
5
// the Free Software Foundation, version 2.0 or later versions.
6
7
// This program is distributed in the hope that it will be useful,
8
// but WITHOUT ANY WARRANTY; without even the implied warranty of
9
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
// GNU General Public License 2.0 for more details.
11
12
// A copy of the GPL 2.0 should have been included with the program.
13
// If not, see http://www.gnu.org/licenses/
14
15
// Official git repository and contact information can be found at
16
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
17
18
#pragma once
19
20
#include <mutex>
21
#include <string>
22
23
#include "Core/Dialog/PSPDialog.h"
24
#include "Core/MemMap.h"
25
#include "Common/CommonTypes.h"
26
#include "Core/Dialog/PSPOskConstants.h"
27
28
/**
29
* Enumeration for input language
30
*/
31
enum SceUtilityOskInputLanguage
32
{
33
PSP_UTILITY_OSK_LANGUAGE_DEFAULT = 0x00,
34
PSP_UTILITY_OSK_LANGUAGE_JAPANESE = 0x01,
35
PSP_UTILITY_OSK_LANGUAGE_ENGLISH = 0x02,
36
PSP_UTILITY_OSK_LANGUAGE_FRENCH = 0x03,
37
PSP_UTILITY_OSK_LANGUAGE_SPANISH = 0x04,
38
PSP_UTILITY_OSK_LANGUAGE_GERMAN = 0x05,
39
PSP_UTILITY_OSK_LANGUAGE_ITALIAN = 0x06,
40
PSP_UTILITY_OSK_LANGUAGE_DUTCH = 0x07,
41
PSP_UTILITY_OSK_LANGUAGE_PORTUGESE = 0x08,
42
PSP_UTILITY_OSK_LANGUAGE_RUSSIAN = 0x09,
43
PSP_UTILITY_OSK_LANGUAGE_KOREAN = 0x0a
44
};
45
46
/**
47
* Enumeration for OSK internal state
48
*/
49
enum SceUtilityOskState
50
{
51
PSP_UTILITY_OSK_DIALOG_NONE = 0, /**< No OSK is currently active */
52
PSP_UTILITY_OSK_DIALOG_INITING = 1, /**< The OSK is currently being initialized */
53
PSP_UTILITY_OSK_DIALOG_INITED = 2, /**< The OSK is initialised */
54
PSP_UTILITY_OSK_DIALOG_VISIBLE = 3, /**< The OSK is visible and ready for use */
55
PSP_UTILITY_OSK_DIALOG_QUIT = 4, /**< The OSK has been cancelled and should be shut down */
56
PSP_UTILITY_OSK_DIALOG_FINISHED = 5 /**< The OSK has successfully shut down */
57
};
58
59
/**
60
* Enumeration for OSK field results
61
*/
62
enum SceUtilityOskResult
63
{
64
PSP_UTILITY_OSK_RESULT_UNCHANGED = 0,
65
PSP_UTILITY_OSK_RESULT_CANCELLED = 1,
66
PSP_UTILITY_OSK_RESULT_CHANGED = 2
67
};
68
69
/**
70
* Enumeration for input types (these are limited by initial choice of language)
71
*/
72
enum SceUtilityOskInputType
73
{
74
PSP_UTILITY_OSK_INPUTTYPE_ALL = 0x00000000,
75
PSP_UTILITY_OSK_INPUTTYPE_LATIN_DIGIT = 0x00000001,
76
PSP_UTILITY_OSK_INPUTTYPE_LATIN_SYMBOL = 0x00000002,
77
PSP_UTILITY_OSK_INPUTTYPE_LATIN_LOWERCASE = 0x00000004,
78
PSP_UTILITY_OSK_INPUTTYPE_LATIN_UPPERCASE = 0x00000008,
79
PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_DIGIT = 0x00000100,
80
PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_SYMBOL = 0x00000200,
81
PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_LOWERCASE = 0x00000400,
82
PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_UPPERCASE = 0x00000800,
83
// http://en.wikipedia.org/wiki/Hiragana
84
PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_HIRAGANA = 0x00001000,
85
// http://en.wikipedia.org/wiki/Katakana
86
// Half-width Katakana
87
PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_HALF_KATAKANA = 0x00002000,
88
PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_KATAKANA = 0x00004000,
89
// http://en.wikipedia.org/wiki/Kanji
90
PSP_UTILITY_OSK_INPUTTYPE_JAPANESE_KANJI = 0x00008000,
91
PSP_UTILITY_OSK_INPUTTYPE_RUSSIAN_LOWERCASE = 0x00010000,
92
PSP_UTILITY_OSK_INPUTTYPE_RUSSIAN_UPPERCASE = 0x00020000,
93
PSP_UTILITY_OSK_INPUTTYPE_KOREAN = 0x00040000,
94
PSP_UTILITY_OSK_INPUTTYPE_URL = 0x00080000
95
};
96
97
#if COMMON_LITTLE_ENDIAN
98
typedef SceUtilityOskState SceUtilityOskState_le;
99
typedef SceUtilityOskInputLanguage SceUtilityOskInputLanguage_le;
100
typedef SceUtilityOskResult SceUtilityOskResult_le;
101
#else
102
typedef swap_struct_t<SceUtilityOskState, swap_32_t<SceUtilityOskState> > SceUtilityOskState_le;
103
typedef swap_struct_t<SceUtilityOskInputLanguage, swap_32_t<SceUtilityOskInputLanguage> > SceUtilityOskInputLanguage_le;
104
typedef swap_struct_t<SceUtilityOskResult, swap_32_t<SceUtilityOskResult> > SceUtilityOskResult_le;
105
#endif
106
107
/**
108
* OSK Field data
109
*/
110
struct SceUtilityOskData
111
{
112
/** Unknown. Pass 0. */
113
s32_le unk_00;
114
/** Unknown. Pass 0. */
115
s32_le unk_04;
116
/** One of ::SceUtilityOskInputLanguage */
117
SceUtilityOskInputLanguage_le language;
118
/** Unknown. Pass 0. */
119
s32_le unk_12;
120
/** One or more of ::SceUtilityOskInputType (types that are selectable by pressing SELECT) */
121
s32_le inputtype;
122
/** Number of lines */
123
s32_le lines;
124
/** Unknown. Pass 0. */
125
s32_le unk_24;
126
/** Description text */
127
PSPPointer<u16_le> desc;
128
/** Initial text */
129
PSPPointer<u16_le> intext;
130
// Length, in unsigned shorts, including the terminator.
131
u32_le outtextlength;
132
/** Pointer to the output text */
133
PSPPointer<u16_le> outtext;
134
/** Result. One of ::SceUtilityOskResult */
135
SceUtilityOskResult_le result;
136
// Number of characters to allow, not including terminator (if less than outtextlength - 1.)
137
u32_le outtextlimit;
138
};
139
140
// Parameters to sceUtilityOskInitStart
141
struct SceUtilityOskParams
142
{
143
pspUtilityDialogCommon base;
144
// Number of fields.
145
s32_le fieldCount;
146
// Pointer to an array of fields (see SceUtilityOskData.)
147
PSPPointer<SceUtilityOskData> fields;
148
SceUtilityOskState_le state;
149
// Maybe just padding?
150
s32_le unk_60;
151
};
152
153
// Internal enum, not from PSP.
154
enum OskKeyboardLanguage
155
{
156
OSK_LANGUAGE_ENGLISH, //English half-width
157
OSK_LANGUAGE_JAPANESE,
158
OSK_LANGUAGE_KOREAN,
159
OSK_LANGUAGE_RUSSIAN,
160
OSK_LANGUAGE_ENGLISH_FW, //English full-width (mostly used in Japanese games)
161
OSK_LANGUAGE_COUNT
162
};
163
164
// Internal enum, not from PSP.
165
enum
166
{
167
LOWERCASE,
168
UPPERCASE
169
};
170
171
const OskKeyboardDisplay OskKeyboardCases[OSK_LANGUAGE_COUNT][2] =
172
{
173
{ OSK_KEYBOARD_LATIN_LOWERCASE, OSK_KEYBOARD_LATIN_UPPERCASE },
174
{ OSK_KEYBOARD_HIRAGANA, OSK_KEYBOARD_KATAKANA },
175
{ OSK_KEYBOARD_KOREAN, OSK_KEYBOARD_KOREAN }, // Korean only has one case, so just repeat it.
176
{ OSK_KEYBOARD_RUSSIAN_LOWERCASE, OSK_KEYBOARD_RUSSIAN_UPPERCASE },
177
{ OSK_KEYBOARD_LATIN_FW_LOWERCASE, OSK_KEYBOARD_LATIN_FW_UPPERCASE }
178
};
179
180
enum class PSPOskNativeStatus {
181
IDLE,
182
DONE,
183
WAITING,
184
SUCCESS,
185
FAILURE,
186
};
187
188
class PSPOskDialog: public PSPDialog {
189
public:
190
PSPOskDialog(UtilityDialogType type);
191
~PSPOskDialog();
192
193
int Init(u32 oskPtr);
194
int Update(int animSpeed) override;
195
int Shutdown(bool force = false) override;
196
void DoState(PointerWrap &p) override;
197
pspUtilityDialogCommon *GetCommonParam() override;
198
199
protected:
200
bool UseAutoStatus() override {
201
return false;
202
}
203
204
private:
205
static void ConvertUCS2ToUTF8(std::string& _string, const PSPPointer<u16_le>& em_address);
206
static void ConvertUCS2ToUTF8(std::string& _string, const char16_t *input);
207
void RenderKeyboard();
208
int NativeKeyboard();
209
210
std::u16string CombinationString(bool isInput); // for Japanese, Korean
211
std::u16string CombinationKorean(bool isInput); // for Korea
212
void RemoveKorean(); // for Korean character removal
213
214
u32 FieldMaxLength();
215
int GetIndex(const wchar_t* src, wchar_t ch);
216
217
PSPPointer<SceUtilityOskParams> oskParams{};
218
std::string oskDesc;
219
std::string oskIntext;
220
std::string oskOuttext;
221
222
int selectedChar = 0;
223
std::u16string inputChars;
224
OskKeyboardDisplay currentKeyboard = OSK_KEYBOARD_LATIN_LOWERCASE;
225
OskKeyboardLanguage currentKeyboardLanguage = OSK_LANGUAGE_ENGLISH;
226
bool isCombinated = false;
227
228
std::mutex nativeMutex_;
229
PSPOskNativeStatus nativeStatus_ = PSPOskNativeStatus::IDLE;
230
std::string nativeValue_;
231
232
int i_level = 0; // for Korean Keyboard support
233
int i_value[3]{}; // for Korean Keyboard support
234
};
235
236