From 64f9779fe54facecdef9d1a6a7c1d893f79ca20e Mon Sep 17 00:00:00 2001
From: lambdalisue <lambdalisue@hashnote.net>
Date: Tue, 14 Feb 2017 14:12:54 +0900
Subject: [PATCH] Add TAPPING_FORCE_HOLD to regulate behaviour

See #889 for the detail.
---
 doc/keymap.md                    | 3 +++
 tmk_core/common/action_tapping.c | 9 +++++----
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/doc/keymap.md b/doc/keymap.md
index 6f2a663fc81..2b0d2cd9592 100644
--- a/doc/keymap.md
+++ b/doc/keymap.md
@@ -549,6 +549,9 @@ Layer switching with tap key:
 
 [dual_role]: http://en.wikipedia.org/wiki/Modifier_key#Dual-role_keys
 
+When user hold a key after tap, it repeat the tapped key rather to hold a modifier key.
+If you prefer to hold a modifier instead, define `TAPPING_FORCE_HOLD` in `config.h`.
+See https://github.com/qmk/qmk_firmware/issues/889 for the detail.
 
 ### 4.2 Tap Toggle
 This is a feature to assign both toggle layer and momentary switch layer action to just same one physical key. It works as momentary layer switch when holding a key but toggle switch with several taps.
diff --git a/tmk_core/common/action_tapping.c b/tmk_core/common/action_tapping.c
index e16e11be7fc..66044d8bced 100644
--- a/tmk_core/common/action_tapping.c
+++ b/tmk_core/common/action_tapping.c
@@ -228,6 +228,7 @@ bool process_tapping(keyrecord_t *keyp)
         if (WITHIN_TAPPING_TERM(event)) {
             if (event.pressed) {
                 if (IS_TAPPING_KEY(event.key)) {
+#ifndef TAPPING_FORCE_HOLD
                     if (!tapping_key.tap.interrupted && tapping_key.tap.count > 0) {
                         // sequential tap.
                         keyp->tap = tapping_key.tap;
@@ -237,11 +238,11 @@ bool process_tapping(keyrecord_t *keyp)
                         tapping_key = *keyp;
                         debug_tapping_key();
                         return true;
-                    } else {
-                        // FIX: start new tap again
-                        tapping_key = *keyp;
-                        return true;
                     }
+#endif
+                    // FIX: start new tap again
+                    tapping_key = *keyp;
+                    return true;
                 } else if (is_tap_key(event.key)) {
                     // Sequential tap can be interfered with other tap key.
                     debug("Tapping: Start with interfering other tap.\n");