]> git.donarmstrong.com Git - tmk_firmware.git/commitdiff
Add legacy keymap support.
authortmk <nobody@nowhere>
Thu, 31 Jan 2013 08:50:53 +0000 (17:50 +0900)
committertmk <nobody@nowhere>
Thu, 31 Jan 2013 08:50:53 +0000 (17:50 +0900)
common/action.c
common/action.h
common/keycode.h
common/keymap.c [new file with mode: 0644]
common/keymap.h

index 4838ea06232f19169290929248ff44a1a5fba950..d1f493fe06aeed7b20f0d31db5a0a17f0510a419 100644 (file)
@@ -358,6 +358,10 @@ static void process_action(keyrecord_t *record)
                     if (event.pressed) {
                         layer_switch(action.layer.opt);
                     }
+//TODO: this is ok?
+                    else {
+                        layer_switch(default_layer);
+                    }
                     break;
                 case 0xF0:
                     // tap toggle
@@ -394,7 +398,10 @@ static void process_action(keyrecord_t *record)
                             debug("LAYER_PRESSED: Tap: unregister_code\n");
                             unregister_code(action.layer.code);
                         } else {
-                            debug("LAYER_PRESSED: No tap: NO ACTION\n");
+                            //debug("LAYER_PRESSED: No tap: NO ACTION\n");
+//TODO: this is ok?
+                            debug("LAYER_PRESSED: No tap: return to default layer\n");
+                            layer_switch(default_layer);
                         }
                     }
                     break;
index 8600e4061e3faed8ef0c824aa2caab76cbdbaa58..d6530df42ee48fabaf37e750643e67b699baf4d6 100644 (file)
@@ -18,6 +18,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define ACTION_H
 
 #include "keyboard.h"
+#include "keycode.h"
 
 
 /* Action struct.
@@ -107,28 +108,28 @@ Keyboard Keys
 ACT_LMODS(0000):
 0000|0000|000000|00    No action
 0000|0000| keycode     Key
-0010|mods|000000|00    Left mods Momentary
-0000|mods| keycode     Key+Left mods
+0000|mods|000000|00    Left mods
+0000|mods| keycode     Key & Left mods
 
 ACT_RMODS(0001):
 0001|0000|000000|00    No action
 0001|0000| keycode     Key(no used)
-0001|mods|000000|00    Right mods Momentary
-0001|mods| keycode     Key+Right mods
+0001|mods|000000|00    Right mods
+0001|mods| keycode     Key & Right mods
 
 ACT_LMODS_TAP(0010):
 0010|mods|000000|00    Left mods OneShot
 0010|mods|000000|01    (reserved)
 0010|mods|000000|10    (reserved)
 0010|mods|000000|11    (reserved)
-0010|mods| keycode     Left mods+tap Key
+0010|mods| keycode     Left mods + tap Key
 
 ACT_RMODS_TAP(0011):
 0011|mods|000000|00    Right mods OneShot
 0011|mods|000000|01    (reserved)
 0011|mods|000000|10    (reserved)
 0011|mods|000000|11    (reserved)
-0011|mods| keycode     Right mods+tap Key
+0011|mods| keycode     Right mods + tap Key
  
 
 Other HID Usage
@@ -143,12 +144,20 @@ ACT_USAGE(0100):
 
 Mouse Keys
 ----------
+TODO: can be combined with 'Other HID Usage'? to save action kind id.
 ACT_MOUSEKEY(0110):
 0101|XXXX| keycode     Mouse key
 
 
 Layer Actions
 -------------
+TODO: reconsider layer methods.
+1   momemtary + tap key                 up: L,     down: default
+1   bitwise   + tap key                 up: xor B, down: xor B
+3   momemtary go + tap key?             up: X,     down:
+3   toggle(mementary back) + tap key?   up:        down: Y
+3   no tap                              up: X,     down: Y
+
 ACT_LAYER_PRESSED(1000):    Set layer on key pressed
 ACT_LAYER_RELEASED(1001):   Set layer on key released
 ACT_LAYER_BIT(1010):        On/Off layer bit
@@ -222,57 +231,77 @@ enum acion_param {
 };
 
 
-/* action_t utility */
+/* action utility */
 #define ACTION_NO                       0
 #define ACTION(kind, param)             ((kind)<<12 | (param))
+#define MODS4(mods)                     (((mods)>>4 | (mods)) & 0x0F)
 
-/* Key & Mods */
+/* Key */
 #define ACTION_KEY(key)                 ACTION(ACT_LMODS,    key)
+/* Mods & key */
 #define ACTION_LMODS(mods)              ACTION(ACT_LMODS,    (mods)<<8 | 0x00)
 #define ACTION_LMODS_KEY(mods, key)     ACTION(ACT_LMODS,    (mods)<<8 | (key))
 #define ACTION_RMODS(mods)              ACTION(ACT_RMODS,    (mods)<<8 | 0x00)
 #define ACTION_RMODS_KEY(mods, key)     ACTION(ACT_RMODS,    (mods)<<8 | (key))
+/* Mod & key */
+#define ACTION_LMOD(mod)                ACTION(ACT_LMODS,    MODS4(MOD_BIT(mod))<<8 | 0x00)
+#define ACTION_LMOD_KEY(mod, key)       ACTION(ACT_LMODS,    MODS4(MOD_BIT(mod))<<8 | (key))
+#define ACTION_RMOD(mod)                ACTION(ACT_RMODS,    MODS4(MOD_BIT(mod))<<8 | 0x00)
+#define ACTION_RMOD_KEY(mod, key)       ACTION(ACT_RMODS,    MODS4(MOD_BIT(mod))<<8 | (key))
 
 /* Mods + Tap key */
-#define MODS4(mods)                     (((mods)>>4 | (mods)) & 0x0F)
-#define ACTION_LMODS_TAP(mods, key)     ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | (key))
+#define ACTION_LMODS_TAP_KEY(mods, key) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | (key))
 #define ACTION_LMODS_ONESHOT(mods)      ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | ONE_SHOT)
-#define ACTION_RMODS_TAP(mods, key)     ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | (key))
+#define ACTION_RMODS_TAP_KEY(mods, key) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | (key))
 #define ACTION_RMODS_ONESHOT(mods)      ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | ONE_SHOT)
+/* Mod + Tap key */
+#define ACTION_LMOD_TAP_KEY(mod, key)   ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key))
+#define ACTION_LMOD_ONESHOT(mod)        ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | ONE_SHOT)
+#define ACTION_RMOD_TAP_KEY(mod, key)   ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key))
+#define ACTION_RMOD_ONESHOT(mod)        ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | ONE_SHOT)
 
+// TODO: contemplate about layer action
 /* Switch current layer */
-#define ACTION_LAYER_SET_ON_PRESSED(layer)   ACTION(ACT_LAYER_PRESSED,  (layer)<<8 | 0x00)
-#define ACTION_LAYER_SET_ON_RELEASED(layer)  ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0x00)
-#define ACTION_LAYER_BIT(bits)               ACTION(ACT_LAYER_BIT,      (bits)<<8 | 0x00)
-#define ACTION_LAYER_TO_DEFAULT_ON_PRESSED   ACTION(ACT_LAYER_EXT,      0x0<<8     | 0x00)
-#define ACTION_LAYER_TO_DEFAULT_ON_RELEASED  ACTION(ACT_LAYER_EXT,      0x1<<8     | 0x00)
+#define ACTION_LAYER_SET(layer)                        ACTION(ACT_LAYER_PRESSED,  (layer)<<8 | 0x00)
+#define ACTION_LAYER_SET_ON_PRESSED(layer)             ACTION(ACT_LAYER_PRESSED,  (layer)<<8 | 0x00)
+#define ACTION_LAYER_SET_ON_RELEASED(layer)            ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0x00)
+#define ACTION_LAYER_BIT(bits)                         ACTION(ACT_LAYER_BIT,      (bits)<<8 | 0x00)
+#define ACTION_LAYER_SET_DEFAULT                       ACTION(ACT_LAYER_EXT,      0x0<<8     | 0x00)
+#define ACTION_LAYER_RETURN_DEFAULT                    ACTION(ACT_LAYER_EXT,      0x1<<8     | 0x00)
+#define ACTION_LAYER_SET_DEFAULT_ON_PRESSED            ACTION(ACT_LAYER_EXT,      0x0<<8     | 0x00)
+#define ACTION_LAYER_SET_DEFAULT_ON_RELEASED           ACTION(ACT_LAYER_EXT,      0x1<<8     | 0x00)
 /* Switch default layer */
-#define ACTION_LAYER_DEFAULT_SET_ON_PRESSED(layer)   ACTION(ACT_LAYER_PRESSED,  (layer)<<8 | 0xFF)
-#define ACTION_LAYER_DEFAULT_SET_ON_RELEASED(layer)  ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0xFF)
-#define ACTION_LAYER_DEFAULT_BIT(bits)               ACTION(ACT_LAYER_BIT, (bits)<<8 | 0xFF)
-#define ACTION_LAYER_DEFAULT_SET_CURRENT_ON_PRESSED  ACTION(ACT_LAYER_EXT, 0x0<<8    | 0xFF)
-#define ACTION_LAYER_DEFAULT_SET_CURRENT_ON_RELEASED ACTION(ACT_LAYER_EXT, 0x1<<8    | 0xFF)
+#define ACTION_LAYER_DEFAULT_SET(layer)                ACTION(ACT_LAYER_PRESSED,  (layer)<<8 | 0xFF)
+#define ACTION_LAYER_DEFAULT_SET_ON_PRESSED(layer)     ACTION(ACT_LAYER_PRESSED,  (layer)<<8 | 0xFF)
+#define ACTION_LAYER_DEFAULT_SET_ON_RELEASED(layer)    ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0xFF)
+#define ACTION_LAYER_DEFAULT_BIT(bits)                 ACTION(ACT_LAYER_BIT, (bits)<<8 | 0xFF)
+#define ACTION_LAYER_DEFAULT_SET_CURRENT_ON_PRESSED    ACTION(ACT_LAYER_EXT, 0x0<<8    | 0xFF)
+#define ACTION_LAYER_DEFAULT_SET_CURRENT_ON_RELEASED   ACTION(ACT_LAYER_EXT, 0x1<<8    | 0xFF)
 /* Layer switch with tap key */
-#define ACTION_LAYER_SET_TAP_KEY(layer, key)  ACTION(ACT_LAYER_PRESSED, (layer)<<8 | (key))
-#define ACTION_LAYER_BIT_TAP_KEY(bits, key)   ACTION(ACT_LAYER_BIT,     (bits)<<8 | (key))
-#define ACTION_LAYER_DEFAULT_SET_TAP_KEY(key) ACTION(ACT_LAYER_EXT,     0x0<<8     | (key))
-/* with tap toggle */
-#define ACTION_LAYER_SET_ON_PRESSED_TAP_TOGGLE(layer)   ACTION(ACT_LAYER_PRESSED,  (layer)<<8 | 0xF0)
-#define ACTION_LAYER_SET_ON_RELEASED_TAP_TOGGLE(layer)  ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0xF0)
-#define ACTION_LAYER_BIT_TAP_TOGGLE(layer)  ACTION(ACT_LAYER_BIT,     (layer)<<8 | 0xF0)
-#define ACTION_LAYER_DEFAULT_TAP_TOGGLE     ACTION(ACT_LAYER_EXT,     0x0<<8     | 0xF0)
+#define ACTION_LAYER_SET_TAP_KEY(layer, key)           ACTION(ACT_LAYER_PRESSED, (layer)<<8 | (key))
+#define ACTION_LAYER_BIT_TAP_KEY(bits, key)            ACTION(ACT_LAYER_BIT,     (bits)<<8 | (key))
+#define ACTION_LAYER_DEFAULT_SET_TAP_KEY(key)          ACTION(ACT_LAYER_EXT,     0x0<<8     | (key))
+/* Layer switch with tap toggle */
+#define ACTION_LAYER_SET_ON_PRESSED_TAP_TOGGLE(layer)  ACTION(ACT_LAYER_PRESSED,  (layer)<<8 | 0xF0)
+#define ACTION_LAYER_SET_ON_RELEASED_TAP_TOGGLE(layer) ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0xF0)
+#define ACTION_LAYER_BIT_TAP_TOGGLE(layer)             ACTION(ACT_LAYER_BIT,     (layer)<<8 | 0xF0)
+#define ACTION_LAYER_DEFAULT_TAP_TOGGLE                ACTION(ACT_LAYER_EXT,     0x0<<8     | 0xF0)
 
 /* HID Usage */
 #define ACTION_USAGE_PAGE_SYSTEM        0
 #define ACTION_USAGE_PAGE_CONSUMER      1
 #define ACTION_USAGE_SYSTEM(id)         ACTION(ACT_USAGE,    ACTION_USAGE_PAGE_SYSTEM<<10 | (id))
 #define ACTION_USAGE_CONSUMER(id)       ACTION(ACT_USAGE,    ACTION_USAGE_PAGE_CONSUMER<<10 | (id))
+
 /* Mousekey */
 #define ACTION_MOUSEKEY(key)            ACTION(ACT_MOUSEKEY, key)
+
 /* Macro */
 #define ACTION_MACRO(opt, id)           ACTION(ACT_FUNCTION, (opt)<<8 | (addr))
+
 /* Command */
 #define ACTION_COMMAND(opt, id)         ACTION(ACT_COMMAND,  (opt)<<8 | (addr))
+
 /* Function */
 #define ACTION_FUNCTION(id, opt)        ACTION(ACT_FUNCTION, (opt)<<8 | id)
 
index cdd1e97587a81f1eaa1f1695cc0d2f794f2eb13b..341f2316168d9f28749a81fdd3cd7c31e68cb186 100644 (file)
@@ -28,14 +28,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define IS_KEY(code)             (KC_A         <= (code) && (code) <= KC_EXSEL)
 #define IS_MOD(code)             (KC_LCTRL     <= (code) && (code) <= KC_RGUI)
 
-#define IS_FN(code)              (KC_FN0       <= (code) && (code) <= KC_FN7)
+#define IS_FN(code)              (KC_FN0       <= (code) && (code) <= KC_FN31)
 #define IS_MOUSEKEY(code)        (KC_MS_UP     <= (code) && (code) <= KC_MS_ACCEL2)
 #define IS_MOUSEKEY_MOVE(code)   (KC_MS_UP     <= (code) && (code) <= KC_MS_RIGHT)
 #define IS_MOUSEKEY_BUTTON(code) (KC_MS_BTN1   <= (code) && (code) <= KC_MS_BTN5)
 #define IS_MOUSEKEY_WHEEL(code)  (KC_MS_WH_UP  <= (code) && (code) <= KC_MS_WH_RIGHT)
 #define IS_MOUSEKEY_ACCEL(code)  (KC_MS_ACCEL0 <= (code) && (code) <= KC_MS_ACCEL2)
 
-#define IS_SPECIAL(code)         ((0xB0 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF))
+#define IS_SPECIAL(code)         ((0xA5 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF))
 #define IS_CONSUMER(code)        (KC_MUTE      <= (code) && (code) <= KC_WFAV)
 #define IS_SYSTEM(code)          (KC_POWER     <= (code) && (code) <= KC_WAKE)
 
diff --git a/common/keymap.c b/common/keymap.c
new file mode 100644 (file)
index 0000000..4151213
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+Copyright 2013 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+#include "keymap.h"
+#include "report.h"
+#include "keycode.h"
+
+
+/* layer */
+uint8_t default_layer = 0;
+uint8_t current_layer = 0;
+
+
+#ifndef NO_LEGACY_KEYMAP_SUPPORT
+/* legacy support with weak reference */
+__attribute__ ((weak))
+action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col)
+{
+    /* convert from legacy keycode to action */
+    uint8_t key = keymap_get_keycode(layer, row, col);
+    action_t action;
+    switch (key) {
+        case KC_A ... KC_EXSEL:
+            action.code = ACTION_KEY(key);
+            break;
+        case KC_LCTRL ... KC_LGUI:
+            action.code = ACTION_LMOD(key);
+            break;
+        case KC_RCTRL ... KC_RGUI:
+            action.code = ACTION_RMOD(key);
+            break;
+        case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE:
+            action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key));
+            break;
+        case KC_AUDIO_MUTE ... KC_WWW_FAVORITES:
+            action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key));
+            break;
+        case KC_MS_UP ... KC_MS_ACCEL2:
+            action.code = ACTION_MOUSEKEY(key);
+            break;
+        case KC_FN0 ... KC_FN31:
+            {
+                uint8_t layer = keymap_fn_layer(FN_INDEX(key));
+                uint8_t code = keymap_fn_keycode(FN_INDEX(key));
+                action.code = ACTION_LAYER_SET_TAP_KEY(layer, code);
+            }
+            break;
+        case KC_NO ... KC_UNDEFINED:
+        default:
+            action.code = ACTION_NO;
+            break;
+    }
+    return action;
+}
+#endif
+
+__attribute__ ((weak))
+void action_call_function(keyevent_t event, uint8_t id)
+{
+}
index f54fea90d231e5607f9cd19029b169ef8728c809..7487615518668d5573a44efa5103975238349072 100644 (file)
@@ -28,18 +28,22 @@ extern uint8_t current_layer;
 /* layer to return or start with */
 extern uint8_t default_layer;
 
+
 /* 
- * legacy keymap interface: keycode
+ * new keymap interface: action
  */
+action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col);
+
+
+#ifndef NO_LEGACY_KEYMAP_SUPPORT
+/* keycode of key */
 uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col);
+
 /* layer to move during press Fn key */
 uint8_t keymap_fn_layer(uint8_t fn_bits);
+
 /* keycode to send when release Fn key without using */
 uint8_t keymap_fn_keycode(uint8_t fn_bits);
-
-/* 
- * new keymap interface: action
- */
-action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col);
+#endif
 
 #endif