Fix swap-hands tapping.

This is an inelegant hack for #2522 but makes things work. Basically we give `action.c` a chance to handle the hold event early so that we can swap the keyboard for later keys. Later, to allow the hold to happen again quickly we nuke the key record so that tapping is reset. I tried to find a cleaner way, honestly.
moxygen
Joe Wasson 7 years ago committed by Jack Humbert
parent 23ac2a02ef
commit 5d771039ad

@ -93,6 +93,7 @@ void action_exec(keyevent_t event)
#ifdef SWAP_HANDS_ENABLE #ifdef SWAP_HANDS_ENABLE
bool swap_hands = false; bool swap_hands = false;
bool swap_held = false;
void process_hand_swap(keyevent_t *event) { void process_hand_swap(keyevent_t *event) {
static swap_state_row_t swap_state[MATRIX_ROWS]; static swap_state_row_t swap_state[MATRIX_ROWS];
@ -132,6 +133,27 @@ bool process_record_quantum(keyrecord_t *record) {
return true; return true;
} }
#ifndef NO_ACTION_TAPPING
// Allows for handling tap-hold actions immediately instead of waiting for TAPPING_TERM or another keypress.
void process_record_tap_hint(keyrecord_t *record)
{
action_t action = layer_switch_get_action(record->event.key);
switch (action.kind.id) {
#ifdef SWAP_HANDS_ENABLE
case ACT_SWAP_HANDS:
switch (action.swap.code) {
case OP_SH_TAP_TOGGLE:
default:
swap_hands = !swap_hands;
swap_held = true;
}
break;
#endif
}
}
#endif
void process_record(keyrecord_t *record) void process_record(keyrecord_t *record)
{ {
if (IS_NOEVENT(record->event)) { return; } if (IS_NOEVENT(record->event)) { return; }
@ -551,23 +573,37 @@ void process_action(keyrecord_t *record, action_t action)
#ifndef NO_ACTION_TAPPING #ifndef NO_ACTION_TAPPING
case OP_SH_TAP_TOGGLE: case OP_SH_TAP_TOGGLE:
/* tap toggle */ /* tap toggle */
if (tap_count > 0) {
if (!event.pressed) { if (event.pressed) {
if (swap_held) {
swap_held = false;
} else {
swap_hands = !swap_hands; swap_hands = !swap_hands;
} }
} else { } else {
swap_hands = event.pressed; if (tap_count < TAPPING_TOGGLE) {
swap_hands = !swap_hands;
}
} }
break; break;
default: default:
/* tap key */
if (tap_count > 0) { if (tap_count > 0) {
if (swap_held) {
swap_hands = !swap_hands; // undo hold set up in _tap_hint
swap_held = false;
}
if (event.pressed) { if (event.pressed) {
register_code(action.swap.code); register_code(action.swap.code);
} else { } else {
unregister_code(action.swap.code); unregister_code(action.swap.code);
*record = (keyrecord_t){}; // hack: reset tap mode
} }
} else { } else {
swap_hands = event.pressed; if (swap_held && !event.pressed) {
swap_hands = !swap_hands; // undo hold set up in _tap_hint
swap_held = false;
}
} }
#endif #endif
} }

@ -96,6 +96,10 @@ void clear_keyboard_but_mods(void);
void layer_switch(uint8_t new_layer); void layer_switch(uint8_t new_layer);
bool is_tap_key(keypos_t key); bool is_tap_key(keypos_t key);
#ifndef NO_ACTION_TAPPING
void process_record_tap_hint(keyrecord_t *record);
#endif
/* debug */ /* debug */
void debug_event(keyevent_t event); void debug_event(keyevent_t event);
void debug_record(keyrecord_t record); void debug_record(keyrecord_t record);

@ -186,7 +186,7 @@ typedef union {
} func; } func;
struct action_swap { struct action_swap {
uint8_t code :8; uint8_t code :8;
uint8_t opt :4; uint8_t opt :4;
uint8_t kind :4; uint8_t kind :4;
} swap; } swap;
} action_t; } action_t;
@ -243,7 +243,7 @@ enum usage_pages {
/* /*
* Layer Actions * Layer Actions
*/ */
enum layer_param_on { enum layer_param_on {
@ -257,7 +257,7 @@ enum layer_param_bit_op {
OP_BIT_XOR = 2, OP_BIT_XOR = 2,
OP_BIT_SET = 3, OP_BIT_SET = 3,
}; };
enum layer_pram_tap_op { enum layer_param_tap_op {
OP_TAP_TOGGLE = 0xF0, OP_TAP_TOGGLE = 0xF0,
OP_ON_OFF, OP_ON_OFF,
OP_OFF_ON, OP_OFF_ON,
@ -329,7 +329,7 @@ enum function_opts {
#define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | (id)) #define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | (id))
#define ACTION_FUNCTION_OPT(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | (id)) #define ACTION_FUNCTION_OPT(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | (id))
/* OneHand Support */ /* OneHand Support */
enum swap_hands_pram_tap_op { enum swap_hands_param_tap_op {
OP_SH_TOGGLE = 0xF0, OP_SH_TOGGLE = 0xF0,
OP_SH_TAP_TOGGLE, OP_SH_TAP_TOGGLE,
OP_SH_ON_OFF, OP_SH_ON_OFF,

@ -263,7 +263,7 @@ bool process_tapping(keyrecord_t *keyp)
return true; return true;
} }
} else { } else {
// FIX: process_aciton here? // FIX: process_action here?
// timeout. no sequential tap. // timeout. no sequential tap.
debug("Tapping: End(Timeout after releasing last tap): "); debug("Tapping: End(Timeout after releasing last tap): ");
debug_event(event); debug("\n"); debug_event(event); debug("\n");
@ -277,6 +277,7 @@ bool process_tapping(keyrecord_t *keyp)
if (event.pressed && is_tap_key(event.key)) { if (event.pressed && is_tap_key(event.key)) {
debug("Tapping: Start(Press tap key).\n"); debug("Tapping: Start(Press tap key).\n");
tapping_key = *keyp; tapping_key = *keyp;
process_record_tap_hint(&tapping_key);
waiting_buffer_scan_tap(); waiting_buffer_scan_tap();
debug_tapping_key(); debug_tapping_key();
return true; return true;

Loading…
Cancel
Save