|
|
|
#pragma once
|
|
|
|
#include <Arduino.h>
|
|
|
|
#if defined(USBCON) && !defined(CORE_TEENSY)
|
|
|
|
#include "KeyboardioHID.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include KALEIDOSCOPE_HARDWARE_H
|
|
|
|
#include "key_defs.h"
|
|
|
|
#include "keyswitch_state.h"
|
|
|
|
|
|
|
|
extern const Key keymaps[][ROWS][COLS];
|
|
|
|
|
|
|
|
|
|
|
|
// Code can use this macro on injected key events to signal that
|
|
|
|
// the event isn't tied to a specific physical keyswitch
|
|
|
|
#define UNKNOWN_KEYSWITCH_LOCATION 255,255
|
|
|
|
|
|
|
|
// sending events to the computer
|
|
|
|
/* The event handling starts with the Scanner calling handle_keyswitch_event() for
|
|
|
|
* every key in the matrix, and it is the task of this method to figure out what
|
|
|
|
* to do, it is the main entry point.
|
|
|
|
*
|
|
|
|
* This function will iterate through an array of handler functions, and stop as
|
|
|
|
* soon as one of them signals that the event has been handled. To make it
|
|
|
|
* possible to inject synthetic events, one can call handle_keyswitch_event from
|
|
|
|
* within a custom handler (making the event handling recursive), with a
|
|
|
|
* different keycode.
|
|
|
|
*
|
|
|
|
* This is useful for example for one-shot modifiers, where we would like to
|
|
|
|
* temporarily disable the one-shot functionality, and have them work as a
|
|
|
|
* normal modifier instead. In this case, the keymap would contain a key with
|
|
|
|
* OSM flags set, and the event handler would remove the OSM flags, and let the
|
|
|
|
* system handle the key as it would have, without the OSM flags. So we simply
|
|
|
|
* clear the flags, and call handle_keyswitch_event again, with the modifier keycode
|
|
|
|
* as the first argument. This way, we could insert an event, and have the whole
|
|
|
|
* chain re-process it, instead of registering the keycode ourselves with HID
|
|
|
|
* ourselves. Injecting allows any and all custom handlers to have a chance,
|
|
|
|
* too.
|
|
|
|
*
|
|
|
|
* For this reason, the handle_keyswitch_event receives four arguments: the mapped key
|
|
|
|
* (or Key_NoKey if we do not want to override what is in the keymap), the row
|
|
|
|
* and column of the key, so we can look up the code for it, and the current and
|
|
|
|
* previous state of the key, so we can determine what the event is. The
|
|
|
|
* currentState may be flagged INJECTED, which signals that the event was
|
|
|
|
* injected, and is not a direct result of a keypress, coming from the scanner.
|
|
|
|
*/
|
|
|
|
void handle_keyswitch_event(Key mappedKey, byte row, byte col, uint8_t keyState);
|
|
|
|
|
|
|
|
// Internal use
|
|
|
|
void press_key(Key mappedKey);
|
|
|
|
void release_key(Key mappedKey);
|