From c98e89f2d522573eb868c78d689dbec6b9846c0a Mon Sep 17 00:00:00 2001
From: tmk <hasu@tmk-kbd.com>
Date: Wed, 4 Jan 2017 12:51:13 +0900
Subject: [PATCH] core: Modifiers can be used as tap key Fix #422

---
 tmk_core/common.mk        |  1 +
 tmk_core/common/action.c  |  4 +++-
 tmk_core/common/keycode.h | 24 ++++++++++++------------
 3 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index 69be0e1..14951ec 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -21,6 +21,7 @@ SRC +=	$(COMMON_DIR)/host.c \
 ifeq (yes,$(strip $(UNIMAP_ENABLE)))
     SRC += $(COMMON_DIR)/unimap.c
     OPT_DEFS += -DUNIMAP_ENABLE
+    OPT_DEFS += -DACTIONMAP_ENABLE
 else
     ifeq (yes,$(strip $(ACTIONMAP_ENABLE)))
 	SRC += $(COMMON_DIR)/actionmap.c
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c
index 3a3c401..83b044f 100644
--- a/tmk_core/common/action.c
+++ b/tmk_core/common/action.c
@@ -535,7 +535,9 @@ bool is_tap_key(keypos_t key)
         case ACT_LAYER_TAP:
         case ACT_LAYER_TAP_EXT:
             switch (action.layer_tap.code) {
-                case 0x00 ... 0xdf:
+                case KC_A ... KC_EXSEL:
+                case KC_KP_00 ... KC_KP_HEXADECIMAL:
+                case KC_LCTRL ... KC_RGUI:
                 case OP_TAP_TOGGLE:
                     return true;
             }
diff --git a/tmk_core/common/keycode.h b/tmk_core/common/keycode.h
index 51c9195..3ac1b55 100644
--- a/tmk_core/common/keycode.h
+++ b/tmk_core/common/keycode.h
@@ -24,8 +24,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 #define IS_ERROR(code)           (KC_ROLL_OVER <= (code) && (code) <= KC_UNDEFINED)
-#define IS_ANY(code)             (KC_A         <= (code) && (code) <= 0xFF)
+
+#ifndef ACTIONMAP_ENABLE
 #define IS_KEY(code)             (KC_A         <= (code) && (code) <= KC_EXSEL)
+#else
+#define IS_KEY(code)             ((KC_A         <= (code) && (code) <= KC_EXSEL) || \
+                                  (KC_KP_00     <= (code) && (code) <= KC_KP_HEXADECIMAL))
+#endif
+
 #define IS_MOD(code)             (KC_LCTRL     <= (code) && (code) <= KC_RGUI)
 
 
@@ -179,7 +185,7 @@ enum hid_keyboard_keypad_usage {
     KC_ROLL_OVER,
     KC_POST_FAIL,
     KC_UNDEFINED,
-    KC_A,
+    KC_A,               /* 0x04 */
     KC_B,
     KC_C,
     KC_D,
@@ -341,10 +347,7 @@ enum hid_keyboard_keypad_usage {
     KC_CRSEL,
     KC_EXSEL,           /* 0xA4 */
 
-    /* NOTE: 0xA5-DF are used for internal special purpose */
-
-#if 0
-    /* NOTE: Following codes(0xB0-DD) are not used. Leave them for reference. */
+    /* NOTE: Following code range(0xB0-DD) are shared with special codes of 8-bit keymap */
     KC_KP_00            = 0xB0,
     KC_KP_000,
     KC_THOUSANDS_SEPARATOR,
@@ -391,7 +394,6 @@ enum hid_keyboard_keypad_usage {
     KC_KP_OCTAL,
     KC_KP_DECIMAL,
     KC_KP_HEXADECIMAL,  /* 0xDD */
-#endif
 
     /* Modifiers */
     KC_LCTRL            = 0xE0,
@@ -401,13 +403,11 @@ enum hid_keyboard_keypad_usage {
     KC_RCTRL,
     KC_RSHIFT,
     KC_RALT,
-    KC_RGUI,
-
-    /* NOTE: 0xE8-FF are used for internal special purpose */
+    KC_RGUI,            /* 0xE7 */
 };
 
-/* Special keycodes */
-/* NOTE: 0xA5-DF and 0xE8-FF are used for internal special purpose */
+/* Special keycodes for 8-bit keymap
+   NOTE: 0xA5-DF and 0xE8-FF are used for internal special purpose */
 enum internal_special_keycodes {
     /* System Control */
     KC_SYSTEM_POWER     = 0xA5,