- // In tapping term
- if (tapping_event.time && timer_elapsed(tapping_event.time) < TAP_TIME) {
- if (tapping_event.pressed) {
- if (!event.pressed && KEYEQ(tapping_event.key, event.key)) {
- debug("Tapping: Release tap key.\n");
- if (tap_count == 0) {
- debug("Tapping: First tap.\n");
- // count up on release
- tap_count++;
-
- process(tapping_event);
- waiting_events_process_in_current_layer();
- }
- tapping_event = event;
- process(event);
- } else if (!event.pressed && waiting_events_has(event.key)) {
- debug("Tapping: End(No tap by typing waiting key).\n");
-
- process(tapping_event);
- waiting_events_process_in_current_layer();
- process(event);
-
- tap_count = 0;
- tapping_event = (keyevent_t){};
- } else {
- if (!IS_NOEVENT(event)) debug("Tapping: other key while tapping.\n");
- if (tap_count == 0) {
- // store event
- waiting_events_enqueue(event);
- return;
- }
- process(event);
- }
- } else {
- // Waiting for sequential tap
- if (tap_count && event.pressed && KEYEQ(tapping_event.key, event.key)) {
- tap_count++;
- tapping_event = event;
- debug("Tapping: Sequential tap("); debug_hex(tap_count); debug(")\n");
- process(event);
- } else if (event.pressed && is_tap_key(event)) {
- // Sequential tap can be interfered with other tap key.
- debug("Tapping: Start with interfering other tap.\n");
- tapping_event = event;
- tap_count = 0;
- waiting_events_clear();
- } else {
- if (!IS_NOEVENT(event)) debug("Tapping: other key just after tap.\n");
- process(event);
- }
- }
- }
- // Not in tapping term
- else {
- if (tapping_event.time) {
- if (tapping_event.pressed) {
- if (tap_count == 0) {
- // Not tap, holding down normal key.
- debug("Tapping: End. Not tap(time out).\n");
- process(tapping_event);
- waiting_events_process_in_current_layer();
-
- tap_count = 0;
- tapping_event = (keyevent_t){};
- process(event);
- } else {
- // Holding down last tap key. waiting for releasing last tap key.
- if (!event.pressed && KEYEQ(tapping_event.key, event.key)) {
- debug("Tapping: End. Release holding last tap(time out).\n");
- process(event);
- // clear after release last tap key
- tap_count = 0;
- tapping_event = (keyevent_t){};
- waiting_events_clear();
- } else if (event.pressed && is_tap_key(event)) {
- debug("Tapping: Start with forcing to release last tap(time out).\n");
- process((keyevent_t){
- .key = tapping_event.key,
- .time = event.time,
- .pressed = false });
-
- tap_count = 0;
- tapping_event = event;
- waiting_events_clear();
- } else {
- if (!IS_NOEVENT(event)) debug("Tapping: other key while waiting for release of last tap(time out).\n");
- process(event);
- }
- }
- } else {
- // time out for sequential tap after complete last tap
- debug("Tapping: End(Time out after releasing last tap).\n");
- tap_count = 0;
- tapping_event = (keyevent_t){};
- waiting_events_clear();
-
- process(event);
- }
- } else {
- // Normal state without tapping
- if (event.pressed && is_tap_key(event)) {
- debug("Tapping: Start(Press tap key).\n");
- tapping_event = event;
- tap_count = 0;
- waiting_events_clear();
- } else {
- //debug("Normal event(No tapping)\n");
- process(event);
- }
- }