Handling Keyboard Input

Disable Key Repeat

How do I disable key repeat functionality in SDL?

Abstract art representing computer programming

Disabling key repeat functionality in SDL can be important in applications where you want precise control over key events, such as in games or certain types of interactive software.

By default, SDL may generate repeated keydown events when a key is held down, which might not be desirable in all cases.

Using SDL_EnableKeyRepeat()

SDL1.2 provided a function called SDL_EnableKeyRepeat(), but this function is not available in SDL2. Instead, in SDL2, you manage key repeat behavior directly within your event handling logic.

Managing Key Repeat in SDL2

In SDL2, the repeat field in the SDL_KeyboardEvent structure indicates whether a key event is an initial key press or a repeat event. To disable key repeat functionality, you need to check this field and handle the events accordingly.

Here's an example of how to disable key repeat by checking the repeat field:

#include <SDL.h>
#include <iostream>

void HandleKeyboard(SDL_KeyboardEvent& E) {
  if (E.repeat == 0) {  // Only handle initial key press
    if (E.state == SDL_PRESSED) {
      std::cout << "Key Pressed: "
                << SDL_GetKeyName(E.keysym.sym)
                << '\n';
    } else if (E.state == SDL_RELEASED) {
      std::cout << "Key Released: "
                << SDL_GetKeyName(E.keysym.sym)
                << '\n';
    }
  }
}

int main(int argc, char** argv) {
  SDL_Init(SDL_INIT_VIDEO);
  SDL_Window* window = SDL_CreateWindow(
    "Disable Key Repeat", 100, 100, 800, 600, 0);

  SDL_Event Event;
  while (true) {
    while (SDL_PollEvent(&Event)) {
      if (Event.type == SDL_KEYDOWN ||
          Event.type == SDL_KEYUP) {
        HandleKeyboard(Event.key);
      }
    }
  }

  SDL_DestroyWindow(window);
  SDL_Quit();
  return 0;
}
Key Pressed: A
Key Released: A

Explanation

  • E.repeat == 0: This condition ensures that only the initial key press event is handled. Repeat events are ignored.
  • SDL_PollEvent(): Continuously polls for events, including keyboard events.
  • HandleKeyboard(): Handles the keyboard events, but only processes the initial key press.

Alternative Approach: Tracking Key State

Another approach to manage key repeats is to track the state of keys manually. This can be useful if you need more control over key behavior:

#include <SDL.h>
#include <iostream>
#include <unordered_map>

std::unordered_map<SDL_Keycode, bool> keyStates;

void HandleKeyboard(SDL_KeyboardEvent& E) {
  if (E.state == SDL_PRESSED
    && !keyStates[E.keysym.sym]) {
    std::cout << "Key Pressed: "
              << SDL_GetKeyName(E.keysym.sym)
              << '\n';
    keyStates[E.keysym.sym] = true;
  } else if (E.state == SDL_RELEASED) {
    std::cout << "Key Released: "
              << SDL_GetKeyName(E.keysym.sym)
              << '\n';
    keyStates[E.keysym.sym] = false;
  }
}

int main(int argc, char** argv) {
  SDL_Init(SDL_INIT_VIDEO);
  SDL_Window* window = SDL_CreateWindow(
    "Disable Key Repeat", 100, 100, 800, 600, 0);

  SDL_Event Event;
  while (true) {
    while (SDL_PollEvent(&Event)) {
      if (Event.type == SDL_KEYDOWN ||
          Event.type == SDL_KEYUP) {
        HandleKeyboard(Event.key);
      }
    }
  }

  SDL_DestroyWindow(window);
  SDL_Quit();
  return 0;
}
Key Pressed: A
Key Released: A

Summary

In SDL2, disabling key repeat functionality involves checking the repeat field in SDL_KeyboardEvent or manually tracking key states.

This ensures that your application responds only to initial key presses and ignores repeated events, giving you finer control over keyboard input.

This Question is from the Lesson:

Handling Keyboard Input

Learn how to detect and respond to keyboard input events in your SDL-based applications. This lesson covers key events, key codes, and modifier keys.

Answers to questions are automatically generated and may not have been reviewed.

This Question is from the Lesson:

Handling Keyboard Input

Learn how to detect and respond to keyboard input events in your SDL-based applications. This lesson covers key events, key codes, and modifier keys.

sdl2-promo.jpg
Part of the course:

Game Dev with SDL2

Learn C++ and SDL development by creating hands on, practical projects inspired by classic retro games

Free, unlimited access

This course includes:

  • 51 Lessons
  • 100+ Code Samples
  • 91% Positive Reviews
  • Regularly Updated
  • Help and FAQ
Free, Unlimited Access

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Screenshot from Warhammer: Total War
Screenshot from Tomb Raider
Screenshot from Jedi: Fallen Order
Contact|Privacy Policy|Terms of Use
Copyright © 2024 - All Rights Reserved