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:
Dean Galvin committed 2026-10-23 22:40:29 +13:00
1 parent d517eb7cfe
commit 835c2995ed
9 files changed
+102 -15

No files matched your search

+28
View File
@@ -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);