splits process_action up to handle records separately (#329)
* implements leader key for planck experimental * allows override of leader timeout * adds ability to use the leader key in seq * fixes leader keycode * adds chording prototype * fixes keycode detection * moves music mode to quantum.c * disables chording by default * adds music sequencer functionality * implements audio/music functions in quantum.c * splits up process_action to allow independent processing of actions * merging?
This commit is contained in:
parent
15719f3574
commit
bf5c2ccee5
5 changed files with 58 additions and 40 deletions
|
@ -191,6 +191,9 @@ extern const uint16_t fn_actions[];
|
||||||
|
|
||||||
#define RESET 0x5000
|
#define RESET 0x5000
|
||||||
#define DEBUG 0x5001
|
#define DEBUG 0x5001
|
||||||
|
#define KC_LEAD 0x5014
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// MAGIC keycodes
|
// MAGIC keycodes
|
||||||
#define MAGIC_SWAP_CONTROL_CAPSLOCK 0x5002
|
#define MAGIC_SWAP_CONTROL_CAPSLOCK 0x5002
|
||||||
|
|
|
@ -70,7 +70,7 @@ static uint8_t music_sequence_position = 0;
|
||||||
static uint16_t music_sequence_timer = 0;
|
static uint16_t music_sequence_timer = 0;
|
||||||
static uint16_t music_sequence_interval = 100;
|
static uint16_t music_sequence_interval = 100;
|
||||||
|
|
||||||
bool process_action_quantum(keyrecord_t *record) {
|
bool process_record_quantum(keyrecord_t *record) {
|
||||||
|
|
||||||
/* This gets the keycode from the key pressed */
|
/* This gets the keycode from the key pressed */
|
||||||
keypos_t key = record->event.key;
|
keypos_t key = record->event.key;
|
||||||
|
@ -90,6 +90,14 @@ bool process_action_quantum(keyrecord_t *record) {
|
||||||
keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
|
keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// This is how you use actions here
|
||||||
|
// if (keycode == KC_LEAD) {
|
||||||
|
// action_t action;
|
||||||
|
// action.code = ACTION_DEFAULT_LAYER_SET(0);
|
||||||
|
// process_action(record, action);
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
#ifdef AUDIO_ENABLE
|
#ifdef AUDIO_ENABLE
|
||||||
if (keycode == AU_ON && record->event.pressed) {
|
if (keycode == AU_ON && record->event.pressed) {
|
||||||
audio_on();
|
audio_on();
|
||||||
|
@ -259,5 +267,6 @@ void matrix_scan_quantum() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
matrix_scan_kb();
|
matrix_scan_kb();
|
||||||
}
|
}
|
|
@ -46,7 +46,7 @@ void action_exec(keyevent_t event)
|
||||||
#ifndef NO_ACTION_TAPPING
|
#ifndef NO_ACTION_TAPPING
|
||||||
action_tapping_process(record);
|
action_tapping_process(record);
|
||||||
#else
|
#else
|
||||||
process_action(&record);
|
process_record(&record);
|
||||||
if (!IS_NOEVENT(record.event)) {
|
if (!IS_NOEVENT(record.event)) {
|
||||||
dprint("processed: "); debug_record(record); dprintln();
|
dprint("processed: "); debug_record(record); dprintln();
|
||||||
}
|
}
|
||||||
|
@ -56,25 +56,43 @@ void action_exec(keyevent_t event)
|
||||||
#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
|
#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
|
||||||
bool disable_action_cache = false;
|
bool disable_action_cache = false;
|
||||||
|
|
||||||
void process_action_nocache(keyrecord_t *record)
|
void process_record_nocache(keyrecord_t *record)
|
||||||
{
|
{
|
||||||
disable_action_cache = true;
|
disable_action_cache = true;
|
||||||
process_action(record);
|
process_record(record);
|
||||||
disable_action_cache = false;
|
disable_action_cache = false;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void process_action_nocache(keyrecord_t *record)
|
void process_record_nocache(keyrecord_t *record)
|
||||||
{
|
{
|
||||||
process_action(record);
|
process_record(record);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__ ((weak))
|
||||||
bool process_action_quantum(keyrecord_t *record) {
|
bool process_record_quantum(keyrecord_t *record) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_action(keyrecord_t *record)
|
void process_record(keyrecord_t *record)
|
||||||
|
{
|
||||||
|
if (IS_NOEVENT(record->event)) { return; }
|
||||||
|
|
||||||
|
if(!process_record_quantum(record))
|
||||||
|
return;
|
||||||
|
|
||||||
|
action_t action = store_or_get_action(record->event.pressed, record->event.key);
|
||||||
|
dprint("ACTION: "); debug_action(action);
|
||||||
|
#ifndef NO_ACTION_LAYER
|
||||||
|
dprint(" layer_state: "); layer_debug();
|
||||||
|
dprint(" default_layer_state: "); default_layer_debug();
|
||||||
|
#endif
|
||||||
|
dprintln();
|
||||||
|
|
||||||
|
process_action(record, action);
|
||||||
|
}
|
||||||
|
|
||||||
|
void process_action(keyrecord_t *record, action_t action)
|
||||||
{
|
{
|
||||||
bool do_release_oneshot = false;
|
bool do_release_oneshot = false;
|
||||||
keyevent_t event = record->event;
|
keyevent_t event = record->event;
|
||||||
|
@ -82,8 +100,6 @@ void process_action(keyrecord_t *record)
|
||||||
uint8_t tap_count = record->tap.count;
|
uint8_t tap_count = record->tap.count;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (IS_NOEVENT(event)) { return; }
|
|
||||||
|
|
||||||
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
||||||
if (has_oneshot_layer_timed_out()) {
|
if (has_oneshot_layer_timed_out()) {
|
||||||
dprintf("Oneshot layer: timeout\n");
|
dprintf("Oneshot layer: timeout\n");
|
||||||
|
@ -91,17 +107,6 @@ void process_action(keyrecord_t *record)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!process_action_quantum(record))
|
|
||||||
return;
|
|
||||||
|
|
||||||
action_t action = store_or_get_action(event.pressed, event.key);
|
|
||||||
dprint("ACTION: "); debug_action(action);
|
|
||||||
#ifndef NO_ACTION_LAYER
|
|
||||||
dprint(" layer_state: "); layer_debug();
|
|
||||||
dprint(" default_layer_state: "); default_layer_debug();
|
|
||||||
#endif
|
|
||||||
dprintln();
|
|
||||||
|
|
||||||
if (event.pressed) {
|
if (event.pressed) {
|
||||||
// clear the potential weak mods left by previously pressed keys
|
// clear the potential weak mods left by previously pressed keys
|
||||||
clear_weak_mods();
|
clear_weak_mods();
|
||||||
|
@ -451,7 +456,7 @@ void process_action(keyrecord_t *record)
|
||||||
if (do_release_oneshot && !(get_oneshot_layer_state() & ONESHOT_PRESSED ) ) {
|
if (do_release_oneshot && !(get_oneshot_layer_state() & ONESHOT_PRESSED ) ) {
|
||||||
record->event.pressed = false;
|
record->event.pressed = false;
|
||||||
layer_on(get_oneshot_layer());
|
layer_on(get_oneshot_layer());
|
||||||
process_action(record);
|
process_record(record);
|
||||||
layer_off(get_oneshot_layer());
|
layer_off(get_oneshot_layer());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -59,14 +59,15 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt);
|
||||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt);
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt);
|
||||||
|
|
||||||
/* keyboard-specific key event (pre)processing */
|
/* keyboard-specific key event (pre)processing */
|
||||||
bool process_action_quantum(keyrecord_t *record);
|
bool process_record_quantum(keyrecord_t *record);
|
||||||
|
|
||||||
/* Utilities for actions. */
|
/* Utilities for actions. */
|
||||||
#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
|
#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
|
||||||
extern bool disable_action_cache;
|
extern bool disable_action_cache;
|
||||||
#endif
|
#endif
|
||||||
void process_action_nocache(keyrecord_t *record);
|
void process_record_nocache(keyrecord_t *record);
|
||||||
void process_action(keyrecord_t *record);
|
void process_record(keyrecord_t *record);
|
||||||
|
void process_action(keyrecord_t *record, action_t action);
|
||||||
void register_code(uint8_t code);
|
void register_code(uint8_t code);
|
||||||
void unregister_code(uint8_t code);
|
void unregister_code(uint8_t code);
|
||||||
void register_mods(uint8_t mods);
|
void register_mods(uint8_t mods);
|
||||||
|
|
|
@ -89,7 +89,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
debug("Tapping: First tap(0->1).\n");
|
debug("Tapping: First tap(0->1).\n");
|
||||||
tapping_key.tap.count = 1;
|
tapping_key.tap.count = 1;
|
||||||
debug_tapping_key();
|
debug_tapping_key();
|
||||||
process_action(&tapping_key);
|
process_record(&tapping_key);
|
||||||
|
|
||||||
// copy tapping state
|
// copy tapping state
|
||||||
keyp->tap = tapping_key.tap;
|
keyp->tap = tapping_key.tap;
|
||||||
|
@ -103,7 +103,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
*/
|
*/
|
||||||
else if (IS_RELEASED(event) && waiting_buffer_typed(event)) {
|
else if (IS_RELEASED(event) && waiting_buffer_typed(event)) {
|
||||||
debug("Tapping: End. No tap. Interfered by typing key\n");
|
debug("Tapping: End. No tap. Interfered by typing key\n");
|
||||||
process_action(&tapping_key);
|
process_record(&tapping_key);
|
||||||
tapping_key = (keyrecord_t){};
|
tapping_key = (keyrecord_t){};
|
||||||
debug_tapping_key();
|
debug_tapping_key();
|
||||||
// enqueue
|
// enqueue
|
||||||
|
@ -131,7 +131,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
}
|
}
|
||||||
// Release of key should be process immediately.
|
// Release of key should be process immediately.
|
||||||
debug("Tapping: release event of a key pressed before tapping\n");
|
debug("Tapping: release event of a key pressed before tapping\n");
|
||||||
process_action(keyp);
|
process_record(keyp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -148,7 +148,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
if (IS_TAPPING_KEY(event.key) && !event.pressed) {
|
if (IS_TAPPING_KEY(event.key) && !event.pressed) {
|
||||||
debug("Tapping: Tap release("); debug_dec(tapping_key.tap.count); debug(")\n");
|
debug("Tapping: Tap release("); debug_dec(tapping_key.tap.count); debug(")\n");
|
||||||
keyp->tap = tapping_key.tap;
|
keyp->tap = tapping_key.tap;
|
||||||
process_action(keyp);
|
process_record(keyp);
|
||||||
tapping_key = *keyp;
|
tapping_key = *keyp;
|
||||||
debug_tapping_key();
|
debug_tapping_key();
|
||||||
return true;
|
return true;
|
||||||
|
@ -157,7 +157,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
if (tapping_key.tap.count > 1) {
|
if (tapping_key.tap.count > 1) {
|
||||||
debug("Tapping: Start new tap with releasing last tap(>1).\n");
|
debug("Tapping: Start new tap with releasing last tap(>1).\n");
|
||||||
// unregister key
|
// unregister key
|
||||||
process_action(&(keyrecord_t){
|
process_record(&(keyrecord_t){
|
||||||
.tap = tapping_key.tap,
|
.tap = tapping_key.tap,
|
||||||
.event.key = tapping_key.event.key,
|
.event.key = tapping_key.event.key,
|
||||||
.event.time = event.time,
|
.event.time = event.time,
|
||||||
|
@ -175,7 +175,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
if (!IS_NOEVENT(event)) {
|
if (!IS_NOEVENT(event)) {
|
||||||
debug("Tapping: key event while last tap(>0).\n");
|
debug("Tapping: key event while last tap(>0).\n");
|
||||||
}
|
}
|
||||||
process_action(keyp);
|
process_record(keyp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -185,7 +185,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
if (tapping_key.tap.count == 0) {
|
if (tapping_key.tap.count == 0) {
|
||||||
debug("Tapping: End. Timeout. Not tap(0): ");
|
debug("Tapping: End. Timeout. Not tap(0): ");
|
||||||
debug_event(event); debug("\n");
|
debug_event(event); debug("\n");
|
||||||
process_action(&tapping_key);
|
process_record(&tapping_key);
|
||||||
tapping_key = (keyrecord_t){};
|
tapping_key = (keyrecord_t){};
|
||||||
debug_tapping_key();
|
debug_tapping_key();
|
||||||
return false;
|
return false;
|
||||||
|
@ -193,7 +193,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
if (IS_TAPPING_KEY(event.key) && !event.pressed) {
|
if (IS_TAPPING_KEY(event.key) && !event.pressed) {
|
||||||
debug("Tapping: End. last timeout tap release(>0).");
|
debug("Tapping: End. last timeout tap release(>0).");
|
||||||
keyp->tap = tapping_key.tap;
|
keyp->tap = tapping_key.tap;
|
||||||
process_action(keyp);
|
process_record(keyp);
|
||||||
tapping_key = (keyrecord_t){};
|
tapping_key = (keyrecord_t){};
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -201,7 +201,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
if (tapping_key.tap.count > 1) {
|
if (tapping_key.tap.count > 1) {
|
||||||
debug("Tapping: Start new tap with releasing last timeout tap(>1).\n");
|
debug("Tapping: Start new tap with releasing last timeout tap(>1).\n");
|
||||||
// unregister key
|
// unregister key
|
||||||
process_action(&(keyrecord_t){
|
process_record(&(keyrecord_t){
|
||||||
.tap = tapping_key.tap,
|
.tap = tapping_key.tap,
|
||||||
.event.key = tapping_key.event.key,
|
.event.key = tapping_key.event.key,
|
||||||
.event.time = event.time,
|
.event.time = event.time,
|
||||||
|
@ -219,7 +219,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
if (!IS_NOEVENT(event)) {
|
if (!IS_NOEVENT(event)) {
|
||||||
debug("Tapping: key event while last timeout tap(>0).\n");
|
debug("Tapping: key event while last timeout tap(>0).\n");
|
||||||
}
|
}
|
||||||
process_action(keyp);
|
process_record(keyp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -233,7 +233,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
keyp->tap = tapping_key.tap;
|
keyp->tap = tapping_key.tap;
|
||||||
if (keyp->tap.count < 15) keyp->tap.count += 1;
|
if (keyp->tap.count < 15) keyp->tap.count += 1;
|
||||||
debug("Tapping: Tap press("); debug_dec(keyp->tap.count); debug(")\n");
|
debug("Tapping: Tap press("); debug_dec(keyp->tap.count); debug(")\n");
|
||||||
process_action(keyp);
|
process_record(keyp);
|
||||||
tapping_key = *keyp;
|
tapping_key = *keyp;
|
||||||
debug_tapping_key();
|
debug_tapping_key();
|
||||||
return true;
|
return true;
|
||||||
|
@ -253,12 +253,12 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
// should none in buffer
|
// should none in buffer
|
||||||
// FIX: interrupted when other key is pressed
|
// FIX: interrupted when other key is pressed
|
||||||
tapping_key.tap.interrupted = true;
|
tapping_key.tap.interrupted = true;
|
||||||
process_action(keyp);
|
process_record(keyp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!IS_NOEVENT(event)) debug("Tapping: other key just after tap.\n");
|
if (!IS_NOEVENT(event)) debug("Tapping: other key just after tap.\n");
|
||||||
process_action(keyp);
|
process_record(keyp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -280,7 +280,7 @@ bool process_tapping(keyrecord_t *keyp)
|
||||||
debug_tapping_key();
|
debug_tapping_key();
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
process_action(keyp);
|
process_record(keyp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -347,7 +347,7 @@ void waiting_buffer_scan_tap(void)
|
||||||
WITHIN_TAPPING_TERM(waiting_buffer[i].event)) {
|
WITHIN_TAPPING_TERM(waiting_buffer[i].event)) {
|
||||||
tapping_key.tap.count = 1;
|
tapping_key.tap.count = 1;
|
||||||
waiting_buffer[i].tap.count = 1;
|
waiting_buffer[i].tap.count = 1;
|
||||||
process_action(&tapping_key);
|
process_record(&tapping_key);
|
||||||
|
|
||||||
debug("waiting_buffer_scan_tap: found at ["); debug_dec(i); debug("]\n");
|
debug("waiting_buffer_scan_tap: found at ["); debug_dec(i); debug("]\n");
|
||||||
debug_waiting_buffer();
|
debug_waiting_buffer();
|
||||||
|
|
Loading…
Reference in a new issue