diff options
| -rw-r--r-- | tmk_core/common/action.c | 44 | ||||
| -rw-r--r-- | tmk_core/common/action.h | 4 | ||||
| -rw-r--r-- | tmk_core/common/action_code.h | 8 | ||||
| -rw-r--r-- | tmk_core/common/action_tapping.c | 3 |
4 files changed, 50 insertions, 9 deletions
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 947e5118f..33d920554 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c | |||
| @@ -93,6 +93,7 @@ void action_exec(keyevent_t event) | |||
| 93 | 93 | ||
| 94 | #ifdef SWAP_HANDS_ENABLE | 94 | #ifdef SWAP_HANDS_ENABLE |
| 95 | bool swap_hands = false; | 95 | bool swap_hands = false; |
| 96 | bool swap_held = false; | ||
| 96 | 97 | ||
| 97 | void process_hand_swap(keyevent_t *event) { | 98 | void process_hand_swap(keyevent_t *event) { |
| 98 | static swap_state_row_t swap_state[MATRIX_ROWS]; | 99 | static swap_state_row_t swap_state[MATRIX_ROWS]; |
| @@ -132,6 +133,27 @@ bool process_record_quantum(keyrecord_t *record) { | |||
| 132 | return true; | 133 | return true; |
| 133 | } | 134 | } |
| 134 | 135 | ||
| 136 | #ifndef NO_ACTION_TAPPING | ||
| 137 | // Allows for handling tap-hold actions immediately instead of waiting for TAPPING_TERM or another keypress. | ||
| 138 | void process_record_tap_hint(keyrecord_t *record) | ||
| 139 | { | ||
| 140 | action_t action = layer_switch_get_action(record->event.key); | ||
| 141 | |||
| 142 | switch (action.kind.id) { | ||
| 143 | #ifdef SWAP_HANDS_ENABLE | ||
| 144 | case ACT_SWAP_HANDS: | ||
| 145 | switch (action.swap.code) { | ||
| 146 | case OP_SH_TAP_TOGGLE: | ||
| 147 | default: | ||
| 148 | swap_hands = !swap_hands; | ||
| 149 | swap_held = true; | ||
| 150 | } | ||
| 151 | break; | ||
| 152 | #endif | ||
| 153 | } | ||
| 154 | } | ||
| 155 | #endif | ||
| 156 | |||
| 135 | void process_record(keyrecord_t *record) | 157 | void process_record(keyrecord_t *record) |
| 136 | { | 158 | { |
| 137 | if (IS_NOEVENT(record->event)) { return; } | 159 | if (IS_NOEVENT(record->event)) { return; } |
| @@ -551,23 +573,37 @@ void process_action(keyrecord_t *record, action_t action) | |||
| 551 | #ifndef NO_ACTION_TAPPING | 573 | #ifndef NO_ACTION_TAPPING |
| 552 | case OP_SH_TAP_TOGGLE: | 574 | case OP_SH_TAP_TOGGLE: |
| 553 | /* tap toggle */ | 575 | /* tap toggle */ |
| 554 | if (tap_count > 0) { | 576 | |
| 555 | if (!event.pressed) { | 577 | if (event.pressed) { |
| 578 | if (swap_held) { | ||
| 579 | swap_held = false; | ||
| 580 | } else { | ||
| 556 | swap_hands = !swap_hands; | 581 | swap_hands = !swap_hands; |
| 557 | } | 582 | } |
| 558 | } else { | 583 | } else { |
| 559 | swap_hands = event.pressed; | 584 | if (tap_count < TAPPING_TOGGLE) { |
| 585 | swap_hands = !swap_hands; | ||
| 586 | } | ||
| 560 | } | 587 | } |
| 561 | break; | 588 | break; |
| 562 | default: | 589 | default: |
| 590 | /* tap key */ | ||
| 563 | if (tap_count > 0) { | 591 | if (tap_count > 0) { |
| 592 | if (swap_held) { | ||
| 593 | swap_hands = !swap_hands; // undo hold set up in _tap_hint | ||
| 594 | swap_held = false; | ||
| 595 | } | ||
| 564 | if (event.pressed) { | 596 | if (event.pressed) { |
| 565 | register_code(action.swap.code); | 597 | register_code(action.swap.code); |
| 566 | } else { | 598 | } else { |
| 567 | unregister_code(action.swap.code); | 599 | unregister_code(action.swap.code); |
| 600 | *record = (keyrecord_t){}; // hack: reset tap mode | ||
| 568 | } | 601 | } |
| 569 | } else { | 602 | } else { |
| 570 | swap_hands = event.pressed; | 603 | if (swap_held && !event.pressed) { |
| 604 | swap_hands = !swap_hands; // undo hold set up in _tap_hint | ||
| 605 | swap_held = false; | ||
| 606 | } | ||
| 571 | } | 607 | } |
| 572 | #endif | 608 | #endif |
| 573 | } | 609 | } |
diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h index 87027dede..acc55c7d3 100644 --- a/tmk_core/common/action.h +++ b/tmk_core/common/action.h | |||
| @@ -96,6 +96,10 @@ void clear_keyboard_but_mods(void); | |||
| 96 | void layer_switch(uint8_t new_layer); | 96 | void layer_switch(uint8_t new_layer); |
| 97 | bool is_tap_key(keypos_t key); | 97 | bool is_tap_key(keypos_t key); |
| 98 | 98 | ||
| 99 | #ifndef NO_ACTION_TAPPING | ||
| 100 | void process_record_tap_hint(keyrecord_t *record); | ||
| 101 | #endif | ||
| 102 | |||
| 99 | /* debug */ | 103 | /* debug */ |
| 100 | void debug_event(keyevent_t event); | 104 | void debug_event(keyevent_t event); |
| 101 | void debug_record(keyrecord_t record); | 105 | void debug_record(keyrecord_t record); |
diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h index 05bc84573..fe2735b97 100644 --- a/tmk_core/common/action_code.h +++ b/tmk_core/common/action_code.h | |||
| @@ -186,7 +186,7 @@ typedef union { | |||
| 186 | } func; | 186 | } func; |
| 187 | struct action_swap { | 187 | struct action_swap { |
| 188 | uint8_t code :8; | 188 | uint8_t code :8; |
| 189 | uint8_t opt :4; | 189 | uint8_t opt :4; |
| 190 | uint8_t kind :4; | 190 | uint8_t kind :4; |
| 191 | } swap; | 191 | } swap; |
| 192 | } action_t; | 192 | } action_t; |
| @@ -243,7 +243,7 @@ enum usage_pages { | |||
| 243 | 243 | ||
| 244 | 244 | ||
| 245 | 245 | ||
| 246 | /* | 246 | /* |
| 247 | * Layer Actions | 247 | * Layer Actions |
| 248 | */ | 248 | */ |
| 249 | enum layer_param_on { | 249 | enum layer_param_on { |
| @@ -257,7 +257,7 @@ enum layer_param_bit_op { | |||
| 257 | OP_BIT_XOR = 2, | 257 | OP_BIT_XOR = 2, |
| 258 | OP_BIT_SET = 3, | 258 | OP_BIT_SET = 3, |
| 259 | }; | 259 | }; |
| 260 | enum layer_pram_tap_op { | 260 | enum layer_param_tap_op { |
| 261 | OP_TAP_TOGGLE = 0xF0, | 261 | OP_TAP_TOGGLE = 0xF0, |
| 262 | OP_ON_OFF, | 262 | OP_ON_OFF, |
| 263 | OP_OFF_ON, | 263 | OP_OFF_ON, |
| @@ -329,7 +329,7 @@ enum function_opts { | |||
| 329 | #define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | (id)) | 329 | #define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | (id)) |
| 330 | #define ACTION_FUNCTION_OPT(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | (id)) | 330 | #define ACTION_FUNCTION_OPT(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | (id)) |
| 331 | /* OneHand Support */ | 331 | /* OneHand Support */ |
| 332 | enum swap_hands_pram_tap_op { | 332 | enum swap_hands_param_tap_op { |
| 333 | OP_SH_TOGGLE = 0xF0, | 333 | OP_SH_TOGGLE = 0xF0, |
| 334 | OP_SH_TAP_TOGGLE, | 334 | OP_SH_TAP_TOGGLE, |
| 335 | OP_SH_ON_OFF, | 335 | OP_SH_ON_OFF, |
diff --git a/tmk_core/common/action_tapping.c b/tmk_core/common/action_tapping.c index 531a3ca34..6280c6c36 100644 --- a/tmk_core/common/action_tapping.c +++ b/tmk_core/common/action_tapping.c | |||
| @@ -263,7 +263,7 @@ bool process_tapping(keyrecord_t *keyp) | |||
| 263 | return true; | 263 | return true; |
| 264 | } | 264 | } |
| 265 | } else { | 265 | } else { |
| 266 | // FIX: process_aciton here? | 266 | // FIX: process_action here? |
| 267 | // timeout. no sequential tap. | 267 | // timeout. no sequential tap. |
| 268 | debug("Tapping: End(Timeout after releasing last tap): "); | 268 | debug("Tapping: End(Timeout after releasing last tap): "); |
| 269 | debug_event(event); debug("\n"); | 269 | debug_event(event); debug("\n"); |
| @@ -277,6 +277,7 @@ bool process_tapping(keyrecord_t *keyp) | |||
| 277 | if (event.pressed && is_tap_key(event.key)) { | 277 | if (event.pressed && is_tap_key(event.key)) { |
| 278 | debug("Tapping: Start(Press tap key).\n"); | 278 | debug("Tapping: Start(Press tap key).\n"); |
| 279 | tapping_key = *keyp; | 279 | tapping_key = *keyp; |
| 280 | process_record_tap_hint(&tapping_key); | ||
| 280 | waiting_buffer_scan_tap(); | 281 | waiting_buffer_scan_tap(); |
| 281 | debug_tapping_key(); | 282 | debug_tapping_key(); |
| 282 | return true; | 283 | return true; |
