-
Notifications
You must be signed in to change notification settings - Fork 434
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Finish third iteration of suppression code
The first version that could suppress events was introduced by @xoviat via #38. It was a separate module, using nested dictionaries to simulate a state machine that had to be updated on every hotkey registered. It also handled the entire hotkey process, including multi-steps and timeouts. It was very complex, and had some bugs that we weren't sure were fixable with that architecture. The second version was developed in the `suppress` branch for over an year. It used an explicit state machine for each key, divided by several attributes (is it a modifier, was it processed by a key, etc). It processed only single-step hotkeys. Multi-step hotkeys were simulated by adding and removing hotkeys as necessary, and keeping track separately of which events were suppressed from previous steps. This version worked better, with fewer bugs and somewhat simpler, but the execution was still hard to understand and some bugs were creeping in. This commit introduces the third attempt at making a resiliant and simple to understand key event suppression system. It borrows the concept of multi-step hotkeys as being sequences of single-step hotkeys, but revamps everything else. The meat of the code is a set of global variables and a decision tree. The decision tree is executed for each incoming event, and uses the global state to decide if a given event should be: 1) Suppressed. It's part of a blocking hotkey and at least one callback returned False. The event is blocked with no hope of recovery. For key down events, the corresponding key up event will also be suppressed. 2) Delayed. This event is part of a *subset* of one or more blocking hotkeys. We block it now, but may decide to resend it later. 3) Allowed. The event is passed along normally. If there were any pending events, they are resent before allowing this one. The global variables keep track of which keys the OS reports as currently pressed (i.e. physically pressed keys), which keys were allowed to be passed (i.e. logically pressed keys, from the point of view of other applications), which key presses have been tentatively suppressed, and which key presses were definitely suppressed by hotkeys. It's still complex, but much easier to understand than the two previous versions, doesn't have the same bugs (I hope it has no bugs at all), and is much easier to debug and amend. Third time is the charm, wish me luck.
- Loading branch information
Showing
2 changed files
with
155 additions
and
107 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.