#include #include #include #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" namespace { constexpr int kErrInvalidAddress = static_cast(0x80BC0031u); constexpr int kErrInvalidUserId = static_cast(0x80BC0010u); constexpr std::array BaseVirtualKeys = { 255, 255, 255, 255, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 13, 27, 8, 9, 32, 187, 219, 221, 186, 191, 191, 192, 222, 220, 188, 190, 189, 20, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 44, 145, 19, 45, 36, 33, 46, 35, 34, 39, 37, 40, 38, 144, 111, 106, 109, 107, 13, 97, 98, 99, 100, 101, 102, 103, 104, 105, 96, 110, 226, 93, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 12, 255, 255, 255, 255, 255, 255, 255, 162, 160, 164, 91, 163, 161, 165, 92, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, }; constexpr auto VirtualKeys = [] { std::array, 39> layouts{}; for (auto& layout : layouts) layout = BaseVirtualKeys; layouts[1][28] = 90; layouts[1][29] = 89; layouts[1][45] = 189; layouts[1][46] = 221; layouts[1][47] = 186; layouts[1][48] = 187; layouts[2][28] = 90; layouts[2][29] = 89; layouts[2][45] = 219; layouts[2][46] = 221; layouts[2][47] = 186; layouts[2][48] = 192; layouts[2][49] = 223; layouts[2][50] = 223; layouts[2][51] = 222; layouts[2][52] = 220; layouts[2][53] = 191; layouts[3][45] = 189; layouts[3][46] = 187; layouts[3][47] = 219; layouts[3][48] = 221; layouts[3][49] = 220; layouts[3][50] = 220; layouts[3][51] = 186; layouts[3][53] = 192; layouts[3][56] = 191; layouts[3][100] = 255; layouts[4][45] = 189; layouts[4][46] = 187; layouts[4][47] = 219; layouts[4][48] = 221; layouts[4][49] = 222; layouts[4][50] = 222; layouts[4][51] = 186; layouts[4][52] = 192; layouts[4][53] = 223; layouts[4][56] = 191; layouts[5][45] = 219; layouts[5][46] = 221; layouts[5][47] = 186; layouts[5][48] = 187; layouts[6][45] = 219; layouts[6][46] = 221; layouts[6][47] = 186; layouts[6][48] = 187; layouts[6][100] = 255; layouts[8][4] = 81; layouts[8][16] = 188; layouts[8][20] = 65; layouts[8][26] = 90; layouts[8][29] = 87; layouts[8][45] = 219; layouts[8][46] = 187; layouts[8][49] = 220; layouts[8][50] = 220; layouts[8][51] = 77; layouts[8][52] = 192; layouts[8][53] = 222; layouts[8][54] = 190; layouts[8][55] = 191; layouts[8][56] = 223; layouts[9][4] = 81; layouts[9][16] = 188; layouts[9][20] = 65; layouts[9][26] = 90; layouts[9][29] = 87; layouts[9][45] = 219; layouts[9][46] = 189; layouts[9][49] = 220; layouts[9][50] = 220; layouts[9][51] = 77; layouts[9][52] = 192; layouts[9][53] = 222; layouts[9][54] = 190; layouts[9][55] = 191; layouts[9][56] = 187; layouts[10][45] = 189; layouts[10][46] = 187; layouts[10][47] = 219; layouts[10][48] = 221; layouts[10][49] = 220; layouts[10][50] = 220; layouts[10][51] = 186; layouts[10][52] = 192; layouts[10][53] = 222; layouts[10][56] = 191; layouts[11] = layouts[2]; layouts[12] = layouts[5]; layouts[13][45] = 219; layouts[13][46] = 191; layouts[13][49] = 220; layouts[13][50] = 220; layouts[13][51] = 187; layouts[13][52] = 192; layouts[13][53] = 222; layouts[15][46] = 191; layouts[15][47] = 219; layouts[15][48] = 221; layouts[15][49] = 220; layouts[15][50] = 220; layouts[15][51] = 186; layouts[15][53] = 192; layouts[16][45] = 189; layouts[16][46] = 187; layouts[16][47] = 219; layouts[16][48] = 221; layouts[16][49] = 220; layouts[16][50] = 220; layouts[16][51] = 186; layouts[16][53] = 192; layouts[16][56] = 191; layouts[17] = layouts[5]; layouts[18] = layouts[3]; layouts[20][45] = 223; layouts[20][46] = 189; layouts[20][47] = 219; layouts[20][48] = 221; layouts[20][49] = 188; layouts[20][50] = 188; layouts[20][51] = 186; layouts[20][52] = 190; layouts[20][53] = 192; layouts[20][54] = 191; layouts[20][55] = 220; layouts[20][56] = 190; layouts[21][45] = 189; layouts[21][46] = 222; layouts[21][47] = 192; layouts[21][48] = 219; layouts[21][49] = 221; layouts[21][50] = 221; layouts[21][51] = 187; layouts[21][52] = 186; layouts[21][53] = 243; layouts[21][56] = 191; layouts[21][100] = 255; layouts[21][135] = 226; layouts[21][136] = 242; layouts[21][137] = 220; layouts[21][138] = 28; layouts[21][139] = 247; layouts[22] = layouts[21]; layouts[23][45] = 189; layouts[23][46] = 187; layouts[23][47] = 219; layouts[23][48] = 221; layouts[23][49] = 220; layouts[23][50] = 220; layouts[23][51] = 186; layouts[23][53] = 192; layouts[23][56] = 191; layouts[23][136] = 21; layouts[23][138] = 25; layouts[24] = layouts[3]; layouts[25] = layouts[3]; layouts[26] = layouts[3]; layouts[27] = layouts[3]; layouts[28] = layouts[3]; layouts[29] = layouts[16]; layouts[30] = layouts[16]; layouts[31][28] = 90; layouts[31][29] = 89; layouts[31][46] = 191; layouts[31][47] = 219; layouts[31][48] = 221; layouts[31][49] = 220; layouts[31][50] = 220; layouts[31][51] = 186; layouts[31][53] = 192; layouts[32] = layouts[16]; layouts[33] = layouts[16]; layouts[34] = layouts[16]; layouts[35] = layouts[16]; layouts[36][28] = 90; layouts[36][29] = 89; layouts[36][39] = 192; layouts[36][45] = 191; layouts[36][46] = 187; layouts[36][47] = 219; layouts[36][48] = 221; layouts[36][49] = 220; layouts[36][50] = 220; layouts[36][51] = 186; layouts[36][53] = 48; layouts[37] = layouts[3]; layouts[38] = layouts[3]; return layouts; }(); constexpr int kErrInvalidKeyboardType = static_cast(0x80BC001Du); constexpr std::uint32_t kIgnoredStateBits = 0x4000000u; char16_t UsCharacter(std::uint16_t keycode) { static constexpr char16_t kPunctuation[] = u"-=[]\\\0;'`,./"; static constexpr char16_t kKeypad[] = u"/*-+\0" u"1234567890."; if (keycode >= 0x04 && keycode <= 0x1D) return static_cast(u'a' + (keycode - 0x04)); if (keycode >= 0x1E && keycode <= 0x26) return static_cast(u'1' + (keycode - 0x1E)); if (keycode == 0x27) return u'0'; if (keycode == 0x2C) return u' '; if (keycode >= 0x2D && keycode <= 0x38) return kPunctuation[keycode - 0x2D]; if (keycode == 0x64) return u'\\'; if (keycode >= 0x54 && keycode <= 0x63) return kKeypad[keycode - 0x54]; return 0; } } // namespace extern "C" { int APS5_VABI sceConvertKeycodeGetImeKeyboardType(int32_t userId, uint32_t* type) { if (type == nullptr) return kErrInvalidAddress; if (userId < 0) return kErrInvalidUserId; *type = 0; return 0; } int APS5_VABI sceConvertKeycodeGetVirtualKeycode(std::uint16_t keycode, std::uint32_t keyboardType, std::uint16_t* virtualKeycode) { if (virtualKeycode == nullptr) return kErrInvalidAddress; if (keyboardType == 0 || keyboardType > VirtualKeys.size()) return kErrInvalidKeyboardType; if (keyboardType >= 31) throw std::runtime_error("sceConvertKeycodeGetVirtualKeycode: guest sdk version is unavailable"); auto value = keycode < BaseVirtualKeys.size() ? VirtualKeys[keyboardType - 1][keycode] : 255; if ((keyboardType == 2 || keyboardType == 3 || keyboardType == 12) && (value == 89 || value == 90)) throw std::runtime_error("sceConvertKeycodeGetVirtualKeycode: guest sdk version is unavailable"); *virtualKeycode = static_cast(value); return 0; } int APS5_VABI sceConvertKeycodeGetCharacterFromKeyboardData(const KeyboardData* keyData, std::int32_t index, std::uint32_t state, std::uint32_t keyboardType, char16_t* character) { NotImplemented_nid_no_patch(__func__); return 0; } int APS5_VABI sceConvertKeycodeGetCharacter(std::uint16_t keycode, std::uint32_t state, std::uint32_t type, char16_t* character) { if (character == nullptr) return kErrInvalidAddress; if ((state & ~kIgnoredStateBits) != 0) throw std::runtime_error("sceConvertKeycodeGetCharacter: unsupported state " + std::to_string(state)); if (type != 0) throw std::runtime_error("sceConvertKeycodeGetCharacter: unsupported keyboard type " + std::to_string(type)); *character = UsCharacter(keycode); return 0; } }