|
@@ -1,7 +1,9 @@
|
|
|
#include <stdint.h>
|
|
|
#include <stdbool.h>
|
|
|
#include "action.h"
|
|
|
+#include "action_layer.h"
|
|
|
#include "action_tapping.h"
|
|
|
+#include "keycode.h"
|
|
|
#include "timer.h"
|
|
|
|
|
|
#ifdef DEBUG_ACTION
|
|
@@ -95,22 +97,40 @@ bool process_tapping(keyrecord_t *keyp)
|
|
|
return false;
|
|
|
}
|
|
|
#if TAPPING_TERM >= 500
|
|
|
- /* This can settle mod/fn state fast but may prevent from typing fast. */
|
|
|
- else if (!event.pressed && waiting_buffer_typed(event)) {
|
|
|
- // other key typed. not tap.
|
|
|
+ /* 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
|
|
|
- /* release a key pressed before tapping */
|
|
|
- else if (!event.pressed && !waiting_buffer_typed(event)) {
|
|
|
- /* Unexpected repeating occurs unless this event is processed immedately. */
|
|
|
- debug("Tapping: release a key pressed before tapping\n");
|
|
|
+ /* 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;
|
|
|
}
|