mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-11-04 13:07:32 +00:00
Merge pull request #12824 from BunnyFl/fix/convertkeycode-keyboard-data-state
fix(libSceConvertKeycode): check key data and fold its modifiers into the state
This commit is contained in:
3 files changed
+60
-17
No files matched your search
@@ -260,16 +260,26 @@ int main() {
|
||||
char16_t kbdChar = u'?';
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(nullptr, 0, 0, 4, &kbdChar) == static_cast<int>(0x80BC0031u));
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, 0, 4, nullptr) == static_cast<int>(0x80BC0031u));
|
||||
constexpr int invalidParameter = static_cast<int>(0x80BC0030u);
|
||||
for (std::int32_t badIndex : {-1, 1, 16}) {
|
||||
kbdChar = u'?';
|
||||
bool rejected = false;
|
||||
try {
|
||||
sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, badIndex, 0, 4, &kbdChar);
|
||||
} catch (const std::runtime_error&) {
|
||||
rejected = true;
|
||||
}
|
||||
Require(rejected && kbdChar == u'?');
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, badIndex, 0, 4, &kbdChar) == invalidParameter && kbdChar == u'?');
|
||||
}
|
||||
for (std::uint32_t badState : {0x1u, 0x200u, 0x20000u}) {
|
||||
kbdChar = u'?';
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, badState, 4, &kbdChar) == invalidParameter && kbdChar == u'?');
|
||||
}
|
||||
for (std::int32_t badLength : {0, 17, -1}) {
|
||||
KeyboardData badData = keyData;
|
||||
badData.length = badLength;
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&badData, 0, 0, 4, &kbdChar) == invalidParameter);
|
||||
}
|
||||
KeyboardData badLed = keyData;
|
||||
badLed.led = 8;
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&badLed, 0, 0, 4, &kbdChar) == invalidParameter);
|
||||
KeyboardData badModifier = keyData;
|
||||
badModifier.modifier_key = 0x100;
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&badModifier, 0, 0, 40, &kbdChar) == invalidParameter);
|
||||
for (std::uint32_t layout : {31u, 39u}) {
|
||||
kbdChar = u'?';
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, 0, layout, &kbdChar) == 0 && kbdChar == u'a');
|
||||
@@ -277,6 +287,42 @@ int main() {
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, 0, 0, &kbdChar) == static_cast<int>(0x80BC001Du));
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, 0, 40, &kbdChar) == static_cast<int>(0x80BC001Du));
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, 0, 4, &kbdChar) == 0 && kbdChar == u'a');
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, 0x200, 4, &kbdChar) == 0 && kbdChar == u'A');
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, 0x80, 4, &kbdChar) == 0 && kbdChar == u'a');
|
||||
KeyboardData shifted = keyData;
|
||||
shifted.modifier_key = 0x02;
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&shifted, 0, 0, 4, &kbdChar) == 0 && kbdChar == u'A');
|
||||
KeyboardData capsLock = keyData;
|
||||
capsLock.led = 2;
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&capsLock, 0, 0, 4, &kbdChar) == 0 && kbdChar == u'A');
|
||||
KeyboardData numLock = keyData;
|
||||
numLock.led = 1;
|
||||
numLock.key_code[0] = 89;
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&numLock, 0, 0, 4, &kbdChar) == 0 && kbdChar == u'1');
|
||||
KeyboardData full = keyData;
|
||||
full.length = 16;
|
||||
full.key_code[15] = 5;
|
||||
full.led = 7;
|
||||
full.modifier_key = 0xFF;
|
||||
char16_t expected = u'?';
|
||||
Require(sceConvertKeycodeGetCharacter(5, 0x7FF00, 4, &expected) == 0);
|
||||
kbdChar = u'?';
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&full, 15, 0, 4, &kbdChar) == 0 && kbdChar == expected);
|
||||
for (std::uint32_t goodState : {0x4000000u, 0x8000000u, 0x10000000u, 0x1C000080u}) {
|
||||
for (std::uint32_t layout : {4u, 24u, 30u}) {
|
||||
Require(sceConvertKeycodeGetCharacter(4, goodState, layout, &expected) == 0);
|
||||
kbdChar = u'?';
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, goodState, layout, &kbdChar) == 0 && kbdChar == expected);
|
||||
}
|
||||
}
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, 0x4000000, 24, &kbdChar) == 0 && kbdChar == 0x3141);
|
||||
for (std::uint32_t badState : {0x40u, 0x100u, 0x20000000u, 0x80000000u}) {
|
||||
kbdChar = u'?';
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, badState, 4, &kbdChar) == invalidParameter && kbdChar == u'?');
|
||||
}
|
||||
const std::uint32_t oldSdkVersion = 0x03000000u;
|
||||
std::memcpy(process.data() + 16, &oldSdkVersion, sizeof(oldSdkVersion));
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&keyData, 0, 0, 38, &kbdChar) == static_cast<int>(0x80BC001Du));
|
||||
Require(sceConvertKeycodeGetCharacterFromKeyboardData(&badLed, 0, 0, 38, &kbdChar) == invalidParameter);
|
||||
std::memcpy(process.data() + 16, &sdkVersion, sizeof(sdkVersion));
|
||||
return 0;
|
||||
}
|
||||
Reference in new issue
Block a user