CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/Core/Dialog/PSPOskDialog.h
Views: 1401
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
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 OskKeyboardDisplay
155
{
156
OSK_KEYBOARD_LATIN_LOWERCASE,
157
OSK_KEYBOARD_LATIN_UPPERCASE,
158
OSK_KEYBOARD_HIRAGANA,
159
OSK_KEYBOARD_KATAKANA,
160
OSK_KEYBOARD_KOREAN,
161
OSK_KEYBOARD_RUSSIAN_LOWERCASE,
162
OSK_KEYBOARD_RUSSIAN_UPPERCASE,
163
OSK_KEYBOARD_LATIN_FW_LOWERCASE,
164
OSK_KEYBOARD_LATIN_FW_UPPERCASE,
165
// TODO: Something to do native?
166
OSK_KEYBOARD_COUNT
167
};
168
169
// Internal enum, not from PSP.
170
enum OskKeyboardLanguage
171
{
172
OSK_LANGUAGE_ENGLISH, //English half-width
173
OSK_LANGUAGE_JAPANESE,
174
OSK_LANGUAGE_KOREAN,
175
OSK_LANGUAGE_RUSSIAN,
176
OSK_LANGUAGE_ENGLISH_FW, //English full-width (mostly used in Japanese games)
177
OSK_LANGUAGE_COUNT
178
};
179
180
// Internal enum, not from PSP.
181
enum
182
{
183
LOWERCASE,
184
UPPERCASE
185
};
186
187
const OskKeyboardDisplay OskKeyboardCases[OSK_LANGUAGE_COUNT][2] =
188
{
189
{ OSK_KEYBOARD_LATIN_LOWERCASE, OSK_KEYBOARD_LATIN_UPPERCASE },
190
{ OSK_KEYBOARD_HIRAGANA, OSK_KEYBOARD_KATAKANA },
191
{ OSK_KEYBOARD_KOREAN, OSK_KEYBOARD_KOREAN }, // Korean only has one case, so just repeat it.
192
{ OSK_KEYBOARD_RUSSIAN_LOWERCASE, OSK_KEYBOARD_RUSSIAN_UPPERCASE },
193
{ OSK_KEYBOARD_LATIN_FW_LOWERCASE, OSK_KEYBOARD_LATIN_FW_UPPERCASE }
194
};
195
196
static const std::string OskKeyboardNames[] =
197
{
198
"en_US",
199
"ja_JP",
200
"ko_KR",
201
"ru_RU",
202
"English Full-width",
203
};
204
205
enum class PSPOskNativeStatus {
206
IDLE,
207
DONE,
208
WAITING,
209
SUCCESS,
210
FAILURE,
211
};
212
213
class PSPOskDialog: public PSPDialog {
214
public:
215
PSPOskDialog(UtilityDialogType type);
216
~PSPOskDialog();
217
218
int Init(u32 oskPtr);
219
int Update(int animSpeed) override;
220
int Shutdown(bool force = false) override;
221
void DoState(PointerWrap &p) override;
222
pspUtilityDialogCommon *GetCommonParam() override;
223
224
protected:
225
bool UseAutoStatus() override {
226
return false;
227
}
228
229
private:
230
static void ConvertUCS2ToUTF8(std::string& _string, const PSPPointer<u16_le>& em_address);
231
static void ConvertUCS2ToUTF8(std::string& _string, const char16_t *input);
232
void RenderKeyboard();
233
int NativeKeyboard();
234
235
std::u16string CombinationString(bool isInput); // for Japanese, Korean
236
std::u16string CombinationKorean(bool isInput); // for Korea
237
void RemoveKorean(); // for Korean character removal
238
239
u32 FieldMaxLength();
240
int GetIndex(const wchar_t* src, wchar_t ch);
241
242
PSPPointer<SceUtilityOskParams> oskParams{};
243
std::string oskDesc;
244
std::string oskIntext;
245
std::string oskOuttext;
246
247
int selectedChar = 0;
248
std::u16string inputChars;
249
OskKeyboardDisplay currentKeyboard = OSK_KEYBOARD_LATIN_LOWERCASE;
250
OskKeyboardLanguage currentKeyboardLanguage = OSK_LANGUAGE_ENGLISH;
251
bool isCombinated = false;
252
253
std::mutex nativeMutex_;
254
PSPOskNativeStatus nativeStatus_ = PSPOskNativeStatus::IDLE;
255
std::string nativeValue_;
256
257
int i_level = 0; // for Korean Keyboard support
258
int i_value[3]{}; // for Korean Keyboard support
259
};
260
261