This article is dedicated to discussing why it is so hard to detect the ‘key up’ or ‘key release’ event in a Linux terminal environment without relying on X server. Several techniques and code examples will be shown that are capable of detecting the keyup event on Linux (with and without an X server), but all techniques presented here have significant limitations due to historical reasons that will be discussed. These limitations will be discussed in terms of implementation details of the Linux console, terminal emulators, X server, and SSH based environments.
From the blog post:
A reader of this article is most likely interested in this topic for the same reason that I was before I dove into this topic: They are interested in performing some real-time based task that is controlled using keyboard presses. In my case, the goal was to remotely navigate a robot over an SSH connection using the ‘w’, ‘a’, ‘s’, ‘d’ keys. Real-time tasks like this require extremely high responsiveness to key events for palatable performance. Methods such as polling ‘getch’ are inadequate for applications that require high responsiveness since they must contend with features like keyboard debouncing, key auto-repeating, and missed keyup events that happen when multiple keys are pressed together. Furthermore, naive implementations of this problem often employ polling which burns up 100% CPU, or ‘delay’ functions which increase response time (or a combination of both). An implementation that avoids both of these pitfalls will be shown using I/O multiplexing.