mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-28 12:05:06 +00:00
feat(libSceUserService): report the keyboard type of the system language
sceUserServiceGetKeyboardType now returns the keyboard type of the configured system language from the repository owner's table (languages 0 to 29), with 20 (US English) for a language outside it. The input variants stay 0, the only value the table gives for Japanese and Traditional Chinese. sceConvertKeycodeGetImeKeyboardType takes the PS4 client rule from the title ID prefix (CUSA is PS4); a missing or custom ID is treated as PS5. Tests walk the owner's table through both calls and the title ID cases; both debt entries updated.
This commit is contained in:
1 parent
d517eb7cfe
commit
835c2995ed
9 files changed
+102
-15
No files matched your search
@@ -9,6 +9,7 @@
|
||||
#include <cstdlib>
|
||||
#include <initializer_list>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
extern "C" {
|
||||
@@ -19,6 +20,14 @@ int APS5_VABI sceConvertKeycodeGetCharacter(std::uint16_t, std::uint32_t, std::u
|
||||
|
||||
static void Require(bool value) { if (!value) std::abort(); }
|
||||
|
||||
static void SetLanguage(const char* value) {
|
||||
#ifdef _WIN32
|
||||
Require(_putenv_s("ANYPS5_LANGUAGE", value != nullptr ? value : "") == 0);
|
||||
#else
|
||||
Require((value != nullptr ? ::setenv("ANYPS5_LANGUAGE", value, 1) : ::unsetenv("ANYPS5_LANGUAGE")) == 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
struct FakeUser {
|
||||
@@ -148,7 +157,26 @@ int main() {
|
||||
Require(sceConvertKeycodeGetImeKeyboardType(-1, &type) == invalidUserId);
|
||||
Require(sceConvertKeycodeGetImeKeyboardType(0, &type) == invalidUserId);
|
||||
Require(type == 0xFFFFFFFFu);
|
||||
SetLanguage(nullptr);
|
||||
Require(sceConvertKeycodeGetImeKeyboardType(0x10000000, &type) == 0 && type == 4);
|
||||
constexpr std::uint32_t imeTypeByLanguage[] = {22, 4, 9, 6, 2, 13, 14, 18, 19, 24, 26, 25, 8, 20, 1, 15, 16, 17, 5, 21, 7, 30, 11, 32, 37, 33, 36, 31, 35, 34};
|
||||
for (int language = 0; language < 30; ++language) {
|
||||
SetLanguage(std::to_string(language).c_str());
|
||||
type = 0xFFFFFFFFu;
|
||||
Require(sceConvertKeycodeGetImeKeyboardType(0x10000000, &type) == 0 && type == imeTypeByLanguage[language]);
|
||||
}
|
||||
SetLanguage("30");
|
||||
Require(sceConvertKeycodeGetImeKeyboardType(0x10000000, &type) == 0 && type == 4);
|
||||
SetLanguage(nullptr);
|
||||
|
||||
Require(ImeKeyboardType::IsPs4TitleId("CUSA00000"));
|
||||
Require(ImeKeyboardType::IsPs4TitleId("CUSA"));
|
||||
Require(!ImeKeyboardType::IsPs4TitleId("PPSA00000"));
|
||||
Require(!ImeKeyboardType::IsPs4TitleId(""));
|
||||
Require(!ImeKeyboardType::IsPs4TitleId("CUS"));
|
||||
Require(!ImeKeyboardType::IsPs4TitleId("cusa00000"));
|
||||
Require(!ImeKeyboardType::IsPs4TitleId("XCUSA0000"));
|
||||
Require(!ImeKeyboardType::IsPs4TitleId("HOMEBREW1"));
|
||||
|
||||
RequireImeKeyboardTypeMapping();
|
||||
Require(sceConvertKeycodeGetCharacter(4, 0, 0, nullptr) == invalidAddress);
|
||||
|
||||
Reference in new issue
Block a user