1

Im writing a program using SDL (libsdl2-dev (version: 2.0.14+dfsg2-3+deb11u1)). I have a keyboard event handler that has been working well for me when I ran into an issue using certain keystroke combinations. After simplifying the code to print just the states of the "end", "home", "page up", "page down", "insert" and "delete" key states from SDL_GetKeyboardState, the issue was still present.

For example, if I press the "end" key button, I can see my print out change from 0 to "pressed". The bug was discovered when using the SDL_SCANCODE_KP_PLUS + SDL_SCANCODE_KP_9. So i tried holding those two keys down, then pressing the "end" key. My screen never printed that I pressed the "end" key. They are seemingly random combinations to me also.

Here are a few that do not work.

SDL_SCANCODE_KP_PLUS + SDL_SCANCODE_KP_9: SDL_SCANCODE_HOME SDL_SCANCODE_END SDL_SCANCODE_PAGEDOWN SDL_SCANCODE_PAGEUP SDL_SCANCODE_KP_PLUS + SDL_SCANCODE_KP_8: SDL_SCANCODE_HOME SDL_SCANCODE_END SDL_SCANCODE_INSERT SDL_SCANCODE_KP_PLUS + SDL_SCANCODE_KP_7: SDL_SCANCODE_HOME SDL_SCANCODE_END SDL_SCANCODE_INSERT SDL_SCANCODE_DELETE 

The other keypad numbers have no issue with like what i am seeing with keypad 7, 8, and 9. Here is my code I used to observe the issue:

#include <SDL2/SDL.h> #include <iostream> #include <map> int main(int argc, char* argv[]) { SDL_Init(SDL_INIT_VIDEO); SDL_Window* window = SDL_CreateWindow( "Keyboard State Monitor", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0 ); SDL_Event event; bool running = true; while (running) { while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { running = false; } } // Get the current state of all keys const Uint8* currentKeyState = SDL_GetKeyboardState(NULL); // Keys to monitor std::map<SDL_Scancode, const char*> keysToMonitor = { {SDL_SCANCODE_END, "End"}, {SDL_SCANCODE_HOME, "Home"}, {SDL_SCANCODE_PAGEUP, "Page Up"}, {SDL_SCANCODE_PAGEDOWN, "Page Down"}, {SDL_SCANCODE_DELETE, "Delete"}, {SDL_SCANCODE_INSERT, "Insert"} }; // Print the state of monitored keys std::cout << "\nKey State:" << std::endl; for (const auto& entry : keysToMonitor) { SDL_Scancode scancode = entry.first; const char* keyName = entry.second; if (currentKeyState[scancode]) { std::cout << keyName << ": YES" << std::endl; } else { std::cout << keyName << ": 0" << std::endl; } } SDL_Delay(100); // To prevent the loop from running too fast } SDL_DestroyWindow(window); SDL_Quit(); return 0; } 

Here is my compile command:

g++ -o pressed_check IsPressedCheck.cc -lSDL2 

I only see it when combining keypad 7, 8, or 9 with the "plus sign" keypad button. I have yet to find any other key combo's that are not working. This issue occurred on my raspberry pi running Bullseye. But it was reproduced in my WSL environment on my windows 10 laptop, which is set up to mirror my PI setup.

p.s. this occurs with num lock On && Off.

2
  • 2
    Some keyboards have limited functionality to handle more than a few keys pressed at the same time — depending on what the keys are, they can (otherwise) cause ghosting, which the keyboard firmware catches and doesn't allow the key codes to be sent to the computer. Gamer keyboards have N-key rollover, allowing for more concurrent keypresses than older designed keyboards (which were designed for regular typing). Commented Aug 19, 2023 at 14:41
  • I just tried your code and I cannot reproduce your issue. To me, that's a keyboard problem like Eljay said (key jamming). Try with a different keyboard. Commented Aug 19, 2023 at 17:02

0

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.