fix(libSceKeyboard): report one key slot when no key is held
A keyboard record on the console never counts fewer than one key: with nothing held, and with no keyboard connected, the count is 1 and that slot holds code 0. SharpProspero's keyboard reader, PS5_Quake3e's notes on records read from a console and the PS5 input research notes all say so. AnyPS5 reported a count of 0. The count is now at least 1; the key slots themselves are unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
ffa2a6ecd3
commit
8ea8ea386a
|
|
@ -29,7 +29,7 @@ KeyboardData snapshot() {
|
|||
KeyboardData data{};
|
||||
data.timestamp = sceKernelGetProcessTime();
|
||||
data.connected = connected;
|
||||
data.length = keyCount;
|
||||
data.length = std::max(keyCount, 1);
|
||||
data.led = led;
|
||||
data.modifier_key = modifiers;
|
||||
std::copy_n(keys.begin(), keyCount, data.key_code);
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ int main() {
|
|||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 17) == KEYBOARD_ERROR_INVALID_ARG);
|
||||
Require(sceKeyboardReadState(KEYBOARD_HANDLE, nullptr) == KEYBOARD_ERROR_INVALID_ARG);
|
||||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 1) == 1);
|
||||
Require(data[0].connected && data[0].length == 0 && data[0].modifier_key == 0);
|
||||
Require(data[0].connected && data[0].length == 1 && data[0].key_code[0] == 0 && data[0].modifier_key == 0);
|
||||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 1) == 0);
|
||||
|
||||
KeyboardInput input;
|
||||
|
|
@ -66,7 +66,7 @@ int main() {
|
|||
input.HandleEvent(KeyEvent(SDL_KEYDOWN, SDL_SCANCODE_RETURN, KMOD_NUM | KMOD_LSHIFT), 7);
|
||||
input.HandleEvent(KeyEvent(SDL_KEYUP, SDL_SCANCODE_A, KMOD_NUM | KMOD_LSHIFT), 7);
|
||||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 16) == 4);
|
||||
Require(data[0].length == 0 && data[0].modifier_key == 2 && data[0].led == KEYBOARD_LED_NUM_LOCK);
|
||||
Require(data[0].length == 1 && data[0].key_code[0] == 0 && data[0].modifier_key == 2 && data[0].led == KEYBOARD_LED_NUM_LOCK);
|
||||
Require(data[1].length == 1 && data[1].key_code[0] == 0x04);
|
||||
Require(data[2].length == 2 && data[2].key_code[0] == 0x04 && data[2].key_code[1] == 0x28);
|
||||
Require(data[3].length == 1 && data[3].key_code[0] == 0x28 && data[3].modifier_key == 2);
|
||||
|
|
@ -84,7 +84,7 @@ int main() {
|
|||
window.window.event = SDL_WINDOWEVENT_FOCUS_LOST;
|
||||
input.HandleEvent(window, 7);
|
||||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 1) == 1);
|
||||
Require(data[0].connected && data[0].length == 0 && data[0].modifier_key == 0);
|
||||
Require(data[0].connected && data[0].length == 1 && data[0].key_code[0] == 0 && data[0].modifier_key == 0);
|
||||
input.HandleEvent(KeyEvent(SDL_KEYDOWN, SDL_SCANCODE_B), 7);
|
||||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 1) == 0);
|
||||
window.window.event = SDL_WINDOWEVENT_FOCUS_GAINED;
|
||||
|
|
@ -92,7 +92,7 @@ int main() {
|
|||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 1) == 0);
|
||||
window.window.event = SDL_WINDOWEVENT_CLOSE;
|
||||
input.HandleEvent(window, 7);
|
||||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 1) == 1 && !data[0].connected);
|
||||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 1) == 1 && !data[0].connected && data[0].length == 1 && data[0].key_code[0] == 0);
|
||||
window.window.event = SDL_WINDOWEVENT_FOCUS_GAINED;
|
||||
input.HandleEvent(window, 7);
|
||||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 1) == 1 && data[0].connected);
|
||||
|
|
@ -142,6 +142,6 @@ int main() {
|
|||
Require(sceKeyboardReadState(KEYBOARD_HANDLE, data) == KEYBOARD_ERROR_INVALID_HANDLE);
|
||||
Require(sceKeyboardClose(KEYBOARD_HANDLE) == KEYBOARD_ERROR_INVALID_HANDLE);
|
||||
Require(sceKeyboardOpen(1, 0, 0, nullptr) == KEYBOARD_HANDLE);
|
||||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 1) == 1 && data[0].length == 0);
|
||||
Require(sceKeyboardRead(KEYBOARD_HANDLE, data, 1) == 1 && data[0].length == 1 && data[0].key_code[0] == 0);
|
||||
Require(sceKeyboardClose(KEYBOARD_HANDLE) == KEYBOARD_OK);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue