A way to restart the event handler with a different code

There are scenarios where one would want to inject a keycode into the
event handler chain, restart the processing from scratch, but with a
keycode different than what the lookup would normally yield. For
example, with one-shot modifiers, a feature one may wish is to be able
to turn the one-shotness off, and have them act as normal modifiers.
This is easily done, if we can remove the one-shot markup, and let the
event handler process the resulting code as-is.

This makes that possible: in a custom event handler, just call
handle_key_event() with the first argument set to the desired code, and
the rest left unchanged. This makes it possible to inject events: not
just register keycodes with the HID, but inject synthetic events,
something much more powerful.

Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
pull/35/head
Gergely Nagy 8 years ago
parent 50e2a83050
commit 477dcb5aed

@ -107,12 +107,12 @@ void Model01::act_on_matrix_scan() {
uint8_t keynum = (row*8)+(col); uint8_t keynum = (row*8)+(col);
handle_key_event(row, 7-col, handle_key_event(Key_NoKey, row, 7-col,
bitRead(leftHandState.all, keynum), bitRead(leftHandState.all, keynum),
bitRead(previousLeftHandState.all, keynum) bitRead(previousLeftHandState.all, keynum)
); );
handle_key_event(row, (15- col), handle_key_event(Key_NoKey, row, (15- col),
bitRead(rightHandState.all, keynum), bitRead(rightHandState.all, keynum),
bitRead(previousRightHandState.all, keynum) bitRead(previousRightHandState.all, keynum)
); );

@ -61,7 +61,7 @@ void TestMode_::TestMatrix () {
void TestMode_::setup() { void TestMode_::setup() {
eventHandlers[0] = handle_key_event_test; eventHandlers[0] = handle_key_event_test;
} }
bool handle_key_event_test(byte row, byte col, uint8_t currentState, uint8_t previousState) { bool handle_key_event_test(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState) {
Serial.write(row); Serial.write(row);
} }

@ -15,4 +15,4 @@ class TestMode_ {
extern TestMode_ TestMode; extern TestMode_ TestMode;
bool handle_key_event_test(byte row, byte col, uint8_t currentState, uint8_t previousState); bool handle_key_event_test(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState);

@ -1,10 +1,11 @@
#pragma once #pragma once
#include <Arduino.h> #include <Arduino.h>
#include "key_defs.h"
#define HOOK_MAX 64 #define HOOK_MAX 64
typedef bool (*custom_handler_t)(byte row, byte col, uint8_t currentState, uint8_t previousState); typedef bool (*custom_handler_t)(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState);
extern custom_handler_t eventHandlers[HOOK_MAX]; extern custom_handler_t eventHandlers[HOOK_MAX];
void event_handler_hook_add (custom_handler_t hook); void event_handler_hook_add (custom_handler_t hook);

@ -49,19 +49,21 @@ Key lookup_key(byte keymap, byte row, byte col) {
return mappedKey; return mappedKey;
} }
void handle_key_event(byte row, byte col, uint8_t currentState, uint8_t previousState) { void handle_key_event(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState) {
for (byte i = 0; eventHandlers[i] != NULL && i < HOOK_MAX; i++) { for (byte i = 0; eventHandlers[i] != NULL && i < HOOK_MAX; i++) {
custom_handler_t handler = eventHandlers[i]; custom_handler_t handler = eventHandlers[i];
if ((*handler)(row, col, currentState, previousState)) if ((*handler)(mappedKey, row, col, currentState, previousState))
return; return;
} }
} }
bool handle_key_event_default(byte row, byte col, uint8_t currentState, uint8_t previousState) { bool handle_key_event_default(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState) {
//for every newly pressed button, figure out what logical key it is and send a key down event //for every newly pressed button, figure out what logical key it is and send a key down event
// for every newly released button, figure out what logical key it is and send a key up event // for every newly released button, figure out what logical key it is and send a key up event
Key mappedKey = lookup_key(temporary_keymap, row, col); if (mappedKey.raw == Key_NoKey.raw) {
mappedKey = lookup_key(temporary_keymap, row, col);
}
Key baseKey = lookup_key(primary_keymap, row, col); Key baseKey = lookup_key(primary_keymap, row, col);
if ((baseKey.flags & SWITCH_TO_KEYMAP if ((baseKey.flags & SWITCH_TO_KEYMAP

@ -16,10 +16,10 @@ extern const Key keymaps[][ROWS][COLS];
// sending events to the computer // sending events to the computer
void handle_synthetic_key_event( Key mappedKey, uint8_t currentState, uint8_t previousState); void handle_synthetic_key_event( Key mappedKey, uint8_t currentState, uint8_t previousState);
void handle_key_event(byte row, byte col, uint8_t currentState, uint8_t previousState); void handle_key_event(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState);
void press_key(Key mappedKey); void press_key(Key mappedKey);
void handle_keymap_key_event(Key keymapEntry, uint8_t currentState, uint8_t previousState); void handle_keymap_key_event(Key keymapEntry, uint8_t currentState, uint8_t previousState);
void handle_mouse_key_event(Key mappedKey, uint8_t currentState, uint8_t previousState); void handle_mouse_key_event(Key mappedKey, uint8_t currentState, uint8_t previousState);
bool handle_key_event_default(byte row, byte col, uint8_t currentState, uint8_t previousState); bool handle_key_event_default(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState);
Key lookup_key(byte keymap, byte row, byte col); Key lookup_key(byte keymap, byte row, byte col);

Loading…
Cancel
Save