/* return true when key event is processed or consumed. */ bool process_tapping(keyrecord_t *keyp) { keyevent_t event = keyp->event; // if tapping if (IS_TAPPING_PRESSED()) { if (WITHIN_TAPPING_TERM(event)) { if (tapping_key.tap.count == 0) { if (IS_TAPPING_KEY(event.key) && !event.pressed) { // first tap! debug("Tapping: First tap(0->1).\n"); tapping_key.tap.count = 1; debug_tapping_key(); process_action(&tapping_key); // copy tapping state keyp->tap = tapping_key.tap; // enqueue return false; } #if TAPPING_TERM >= 500 /* Process a key typed within TAPPING_TERM * This can register the key before settlement of tapping, * useful for long TAPPING_TERM but may prevent fast typing. */ else if (IS_RELEASED(event) && waiting_buffer_typed(event)) { debug("Tapping: End. No tap. Interfered by typing key\n"); process_action(&tapping_key); tapping_key = (keyrecord_t){}; debug_tapping_key(); // enqueue return false; } #endif /* Process release event of a key pressed before tapping starts * Without this unexpected repeating will occur with having fast repeating setting * https://github.com/tmk/tmk_keyboard/issues/60 */ else if (IS_RELEASED(event) && !waiting_buffer_typed(event)) { // Modifier should be retained till end of this tapping. action_t action = layer_switch_get_action(event.key); switch (action.kind.id) { case ACT_LMODS: case ACT_RMODS: if (action.key.mods && !action.key.code) return false; if (IS_MOD(action.key.code)) return false; break; case ACT_LMODS_TAP: case ACT_RMODS_TAP: if (action.key.mods && keyp->tap.count == 0) return false; if (IS_MOD(action.key.code)) return false; break; } // Release of key should be process immediately. debug("Tapping: release event of a key pressed before tapping\n"); process_action(keyp); return true; } else { // set interrupted flag when other key preesed during tapping if (event.pressed) { tapping_key.tap.interrupted = true; } // enqueue return false; } } // tap_count > 0 else { if (IS_TAPPING_KEY(event.key) && !event.pressed) { debug("Tapping: Tap release("); debug_dec(tapping_key.tap.count); debug(")\n"); keyp->tap = tapping_key.tap; process_action(keyp); tapping_key = *keyp; debug_tapping_key(); return true; } else if (is_tap_key(event.key) && event.pressed) { if (tapping_key.tap.count > 1) { debug("Tapping: Start new tap with releasing last tap(>1).\n"); // unregister key process_action(&(keyrecord_t){ .tap = tapping_key.tap, .event.key = tapping_key.event.key, .event.time = event.time, .event.pressed = false }); } else { debug("Tapping: Start while last tap(1).\n"); } tapping_key = *keyp; waiting_buffer_scan_tap(); debug_tapping_key(); return true; } else { if (!IS_NOEVENT(event)) {
/* return true when key event is processed or consumed. */ bool process_tapping(keyrecord_t *keyp) { keyevent_t event = keyp->event; // if tapping if (IS_TAPPING_PRESSED()) { if (WITHIN_TAPPING_TERM(event)) { if (tapping_key.tap.count == 0) { if (IS_TAPPING_KEY(event.key) && !event.pressed) { // first tap! debug("Tapping: First tap(0->1).\n"); tapping_key.tap.count = 1; tapping_key.tap.interrupted = (waiting_buffer_has_anykey_pressed() ? true : false); debug_tapping_key(); process_action(&tapping_key); // enqueue keyp->tap = tapping_key.tap; return false; } #if TAPPING_TERM >= 500 /* This can prevent from typing some tap keys in a row at a time. */ else if (!event.pressed && waiting_buffer_typed(event)) { // other key typed. not tap. debug("Tapping: End. No tap. Interfered by typing key\n"); process_action(&tapping_key); tapping_key = (keyrecord_t){}; debug_tapping_key(); // enqueue return false; } #endif else { // other key events shall be enq'd till tapping state settles. return false; } } // tap_count > 0 else { if (IS_TAPPING_KEY(event.key) && !event.pressed) { debug("Tapping: Tap release("); debug_dec(tapping_key.tap.count); debug(")\n"); keyp->tap = tapping_key.tap; process_action(keyp); tapping_key = *keyp; debug_tapping_key(); return true; } else if (is_tap_key(keyp->event.key) && event.pressed) { if (tapping_key.tap.count > 1) { debug("Tapping: Start new tap with releasing last tap(>1).\n"); // unregister key process_action(&(keyrecord_t){ .tap = tapping_key.tap, .event.key = tapping_key.event.key, .event.time = event.time, .event.pressed = false }); } else { debug("Tapping: Start while last tap(1).\n"); } tapping_key = *keyp; waiting_buffer_scan_tap(); debug_tapping_key(); return true; } else { if (!IS_NOEVENT(keyp->event)) {