diff options
Diffstat (limited to 'keyboard/hhkb/keymap.c')
| -rw-r--r-- | keyboard/hhkb/keymap.c | 304 |
1 files changed, 216 insertions, 88 deletions
diff --git a/keyboard/hhkb/keymap.c b/keyboard/hhkb/keymap.c index 5dc5582ec..65ef89ad7 100644 --- a/keyboard/hhkb/keymap.c +++ b/keyboard/hhkb/keymap.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | Copyright 2011 Jun Wako <wakojun@gmail.com> | 2 | Copyright 2011,2012,2013 Jun Wako <wakojun@gmail.com> |
| 3 | 3 | ||
| 4 | This program is free software: you can redistribute it and/or modify | 4 | This program is free software: you can redistribute it and/or modify |
| 5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
| @@ -21,16 +21,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 21 | #include <stdint.h> | 21 | #include <stdint.h> |
| 22 | #include <stdbool.h> | 22 | #include <stdbool.h> |
| 23 | #include <avr/pgmspace.h> | 23 | #include <avr/pgmspace.h> |
| 24 | #include "host.h" | ||
| 25 | #include "keycode.h" | 24 | #include "keycode.h" |
| 26 | #include "print.h" | 25 | #include "action.h" |
| 26 | #include "action_macro.h" | ||
| 27 | #include "host.h" | ||
| 27 | #include "debug.h" | 28 | #include "debug.h" |
| 28 | #include "util.h" | ||
| 29 | #include "keymap.h" | 29 | #include "keymap.h" |
| 30 | 30 | ||
| 31 | 31 | ||
| 32 | // Convert physical keyboard layout to matrix array. | ||
| 33 | // This is a macro to define keymap easily in keyboard layout form. | ||
| 34 | #define KEYMAP( \ | 32 | #define KEYMAP( \ |
| 35 | K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \ | 33 | K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \ |
| 36 | K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \ | 34 | K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \ |
| @@ -49,34 +47,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 49 | { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_NO } \ | 47 | { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_NO } \ |
| 50 | } | 48 | } |
| 51 | 49 | ||
| 52 | #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) | ||
| 53 | |||
| 54 | |||
| 55 | // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. | ||
| 56 | static const uint8_t PROGMEM fn_layer[] = { | ||
| 57 | 0, // Fn0 | ||
| 58 | 1, // Fn1 | ||
| 59 | 2, // Fn2 | ||
| 60 | 3, // Fn3 | ||
| 61 | 3, // Fn4 | ||
| 62 | 5, // Fn5 | ||
| 63 | 0, // Fn6 | ||
| 64 | 0 // Fn7 | ||
| 65 | }; | ||
| 66 | |||
| 67 | // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. | ||
| 68 | // See layer.c for details. | ||
| 69 | static const uint8_t PROGMEM fn_keycode[] = { | ||
| 70 | KC_NO, // Fn0 | ||
| 71 | KC_NO, // Fn1 | ||
| 72 | KC_SLSH, // Fn2 | ||
| 73 | KC_SCLN, // Fn3 | ||
| 74 | KC_NO, // Fn4 | ||
| 75 | KC_SPC, // Fn5 | ||
| 76 | KC_NO, // Fn6 | ||
| 77 | KC_NO // Fn7 | ||
| 78 | }; | ||
| 79 | 50 | ||
| 51 | // TODO: use [1] = KEYMAP(...) to prevent from changing index of element? | ||
| 80 | static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | 52 | static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
| 81 | /* Layer 0: Default Layer | 53 | /* Layer 0: Default Layer |
| 82 | * ,-----------------------------------------------------------. | 54 | * ,-----------------------------------------------------------. |
| @@ -84,18 +56,18 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 84 | * |-----------------------------------------------------------| | 56 | * |-----------------------------------------------------------| |
| 85 | * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| | 57 | * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| |
| 86 | * |-----------------------------------------------------------| | 58 | * |-----------------------------------------------------------| |
| 87 | * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return | | 59 | * |Fn6 | A| S| D| F| G| H| J| K| L|Fn3| '|Return | |
| 88 | * |-----------------------------------------------------------| | 60 | * |-----------------------------------------------------------| |
| 89 | * |Shift | Z| X| C| V| B| N| M| ,| .|Fn2|Shift |Fn1| | 61 | * |Fn8 | Z| X| C| V| B| N| M| ,| .|Fn2|Fn12 |Fn1| |
| 90 | * `-----------------------------------------------------------' | 62 | * `-----------------------------------------------------------' |
| 91 | * |Gui|Alt |Fn5 |Alt |Fn4| | 63 | * |Gui|Alt | Fn5 |Alt |Fn4| |
| 92 | * `-------------------------------------------' | 64 | * `-------------------------------------------' |
| 93 | */ | 65 | */ |
| 94 | KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ | 66 | KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ |
| 95 | TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ | 67 | TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ |
| 96 | LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,ENT, \ | 68 | FN6, A, S, D, F, G, H, J, K, L, FN3, QUOT,FN7, \ |
| 97 | LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN1, \ | 69 | FN8, Z, X, C, V, B, N, M, COMM,DOT, FN2, FN12,FN9, \ |
| 98 | LGUI,LALT, FN5, RALT,FN4), | 70 | LGUI,LALT, FN5, FN13,FN4), |
| 99 | 71 | ||
| 100 | /* Layer 1: HHKB mode (HHKB Fn) | 72 | /* Layer 1: HHKB mode (HHKB Fn) |
| 101 | * ,-----------------------------------------------------------. | 73 | * ,-----------------------------------------------------------. |
| @@ -105,16 +77,16 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 105 | * |-----------------------------------------------------------| | 77 | * |-----------------------------------------------------------| |
| 106 | * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | | 78 | * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | |
| 107 | * |-----------------------------------------------------------| | 79 | * |-----------------------------------------------------------| |
| 108 | * |Shift | | | | | | +| -|End|PgD|Dow|Shift |xxx| | 80 | * |Shift | | | | | | +| -|End|PgD|Dow|Shift |Fn0| |
| 109 | * `-----------------------------------------------------------' | 81 | * `-----------------------------------------------------------' |
| 110 | * |Gui |Alt |Space |Alt |xxx| | 82 | * |Gui|Alt | Space |Alt |Gui| |
| 111 | * `--------------------------------------------' | 83 | * `-------------------------------------------' |
| 112 | */ | 84 | */ |
| 113 | KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | 85 | KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ |
| 114 | CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, BSPC, \ | 86 | CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSPC, \ |
| 115 | LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ | 87 | LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ |
| 116 | LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \ | 88 | LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN0, \ |
| 117 | LGUI,LALT, SPC, RALT,FN7), | 89 | LGUI,LALT, SPC, RALT,RGUI), |
| 118 | 90 | ||
| 119 | /* Layer 2: Vi mode (Slash) | 91 | /* Layer 2: Vi mode (Slash) |
| 120 | * ,-----------------------------------------------------------. | 92 | * ,-----------------------------------------------------------. |
| @@ -124,49 +96,36 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 124 | * |-----------------------------------------------------------| | 96 | * |-----------------------------------------------------------| |
| 125 | * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | | 97 | * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | |
| 126 | * |-----------------------------------------------------------| | 98 | * |-----------------------------------------------------------| |
| 127 | * |Shift | | | | | |Hom|PgD|PgUlEnd|xxx|Shift | | | 99 | * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | | |
| 128 | * `-----------------------------------------------------------' | 100 | * `-----------------------------------------------------------' |
| 129 | * |Gui|Alt |Space |Alt |Gui| | 101 | * |Gui|Alt | Space |Alt |Gui| |
| 130 | * `-------------------------------------------' | 102 | * `-------------------------------------------' |
| 131 | */ | 103 | */ |
| 132 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | 104 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ |
| 133 | TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ | 105 | TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ |
| 134 | LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ | 106 | LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ |
| 135 | LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,NO, \ | 107 | LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN0, RSFT,NO, \ |
| 136 | LGUI,LALT, SPC, RALT,RGUI), | 108 | LGUI,LALT, SPC, RALT,RGUI), |
| 137 | 109 | ||
| 138 | /* Layer 3: Mouse mode (Semicolon) | 110 | /* Layer 3: Mouse mode (Semicolon) |
| 139 | * ,-----------------------------------------------------------. | 111 | * ,-----------------------------------------------------------. |
| 140 | * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| | 112 | * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| |
| 141 | * |-----------------------------------------------------------| | 113 | * |-----------------------------------------------------------| |
| 142 | * |Tab |MwL|MwU|McU|MwD|MwR|MwL|MwD|MwU|MwR| | | |Backs| | 114 | * |Tab | | | | | |MwL|MwD|MwU|MwR| | | |Backs| |
| 143 | * |-----------------------------------------------------------| | 115 | * |-----------------------------------------------------------| |
| 144 | * |Contro| |McL|McD|McR| |McL|McD|McU|McR|xxx| |Return | | 116 | * |Contro| | | | | |McL|McD|McU|McR|Fn0| |Return | |
| 145 | * |-----------------------------------------------------------| | 117 | * |-----------------------------------------------------------| |
| 146 | * |Shift |Mb4|Mb5|Mb1|Mb2|Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | | 118 | * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | |
| 147 | * `-----------------------------------------------------------' | 119 | * `-----------------------------------------------------------' |
| 148 | * |Gui |Alt |Mb1 |Alt |Gui| | 120 | * |Gui |Alt | Mb1 |Alt |Fn0| |
| 149 | * `--------------------------------------------' | 121 | * `--------------------------------------------' |
| 150 | * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel | 122 | * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel |
| 151 | */ | 123 | */ |
| 152 | #ifdef HOST_IWRAP | ||
| 153 | // iWRAP does not support mouse wheel, use these keycodes to remap as wheel | ||
| 154 | #define KC_KPPL KC_KP_PLUS | ||
| 155 | #define KC_KPMI KC_KP_MINUS | ||
| 156 | #define KC_KPAS KC_KP_ASTERISK | ||
| 157 | #define KC_KPSL KC_KP_SLASH | ||
| 158 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | ||
| 159 | TAB, KPAS,KPPL,MS_U,KPMI,KPSL,KPAS,KPPL,KPMI,KPSL,NO, NO, NO, BSPC, \ | ||
| 160 | LCTL,NO, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \ | ||
| 161 | LSFT,BTN4,BTN5,BTN1,BTN2,BTN3,BTN2,BTN1,NO, NO, NO, RSFT,NO, \ | ||
| 162 | LGUI,LALT, BTN1, RALT,FN4), | ||
| 163 | #else | ||
| 164 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | 124 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ |
| 165 | TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ | 125 | TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ |
| 166 | LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \ | 126 | LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, QUOT,ENT, \ |
| 167 | LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ | 127 | LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,NO, \ |
| 168 | LGUI,LALT, BTN1, RALT,FN4), | 128 | LGUI,LALT, BTN1, RALT,FN0), |
| 169 | #endif | ||
| 170 | 129 | ||
| 171 | /* Layer 4: Matias half keyboard style (Space) | 130 | /* Layer 4: Matias half keyboard style (Space) |
| 172 | * ,-----------------------------------------------------------. | 131 | * ,-----------------------------------------------------------. |
| @@ -178,43 +137,212 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 178 | * |-----------------------------------------------------------| | 137 | * |-----------------------------------------------------------| |
| 179 | * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | | | 138 | * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | | |
| 180 | * `-----------------------------------------------------------' | 139 | * `-----------------------------------------------------------' |
| 181 | * |Gui |Alt |xxxxxxxxxxxxxxxxxxxxxxx|Alt |Gui| | 140 | * |Gui |Alt | Fn0 |Alt |Gui| |
| 182 | * `--------------------------------------------' | 141 | * `--------------------------------------------' |
| 183 | */ | 142 | */ |
| 184 | KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \ | 143 | KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \ |
| 185 | BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \ | 144 | BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \ |
| 186 | LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \ | 145 | LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \ |
| 187 | LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \ | 146 | LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \ |
| 188 | LGUI,LALT, FN5, RALT,RGUI), | 147 | LGUI,LALT, FN0, RALT,RGUI), |
| 189 | 148 | ||
| 190 | /* Layer5: another Mouse mode (Space) */ | 149 | /* Layer5: another Mouse mode (Space) |
| 191 | #ifdef HOST_IWRAP | 150 | * ,-----------------------------------------------------------. |
| 192 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | 151 | * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| |
| 193 | TAB, KPAS,KPPL,MS_U,KPMI,KPSL,KPAS,KPPL,KPMI,KPSL,NO, NO, NO, BSPC, \ | 152 | * |-----------------------------------------------------------| |
| 194 | LCTL,NO, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \ | 153 | * |Tab | | | | | |MwL|MwD|MwU|MwR| | | |Backs| |
| 195 | LSFT,BTN4,BTN5,BTN1,BTN2,BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ | 154 | * |-----------------------------------------------------------| |
| 196 | LGUI,LALT, FN5, RALT,RGUI), | 155 | * |Contro| | | | | |McL|McD|McU|McR|Fn0| |Return | |
| 197 | #else | 156 | * |-----------------------------------------------------------| |
| 157 | * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | | ||
| 158 | * `-----------------------------------------------------------' | ||
| 159 | * |Gui |Alt | Fn0 |Alt |Fn0| | ||
| 160 | * `--------------------------------------------' | ||
| 161 | * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel | ||
| 162 | */ | ||
| 198 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | 163 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ |
| 199 | TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ | 164 | TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ |
| 200 | LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \ | 165 | LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,NO, NO, ENT, \ |
| 201 | LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ | 166 | LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ |
| 202 | LGUI,LALT, FN5, RALT,RGUI), | 167 | LGUI,LALT, FN0, RALT,RGUI), |
| 203 | #endif | 168 | }; |
| 169 | |||
| 170 | |||
| 171 | |||
| 172 | /* id for user defined functions */ | ||
| 173 | enum function_id { | ||
| 174 | LSHIFT_LPAREN, | ||
| 175 | RSHIFT_RPAREN, | ||
| 176 | MACRO = 0xff | ||
| 177 | }; | ||
| 178 | |||
| 179 | |||
| 180 | /* | ||
| 181 | * Fn action definition | ||
| 182 | */ | ||
| 183 | // TODO: use [1] = KEYMAP(...) to prevent from changing index of element? | ||
| 184 | static const uint16_t PROGMEM fn_actions[] = { | ||
| 185 | ACTION_LAYER_DEFAULT, // FN0 | ||
| 186 | ACTION_LAYER_SET(1), // FN1 | ||
| 187 | ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // FN2 Layer with Slash | ||
| 188 | ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // FN3 Layer with Semicolon | ||
| 189 | |||
| 190 | ACTION_LAYER_SET(3), // FN4 | ||
| 191 | // ACTION_LAYER_SET_TOGGLE(3), // FN4 | ||
| 192 | // ACTION_FUNCTION(MACRO, 0), // FN4 | ||
| 193 | ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // FN5 | ||
| 194 | // ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // FN6 Control with tap Backspace | ||
| 195 | ACTION_LMOD_TAP_KEY(KC_LCTL, KC_ESC), // FN6 Control with tap Backspace | ||
| 196 | ACTION_RMOD_TAP_KEY(KC_RCTL, KC_ENT), // FN7 Control with tap Enter | ||
| 197 | ACTION_LMOD_ONESHOT(KC_LSFT), // FN8 Oneshot Shift | ||
| 198 | ACTION_LAYER_SET_TAP_TOGGLE(1), // FN9 | ||
| 199 | ACTION_LAYER_BIT_TAP_KEY(1, KC_GRV), // FN10 Layer with Grave | ||
| 200 | //ACTION_LAYER_BIT(1), // FN10 | ||
| 201 | //ACTION_LAYER_BIT_TAP_TOGGLE(1), // FN10 | ||
| 202 | ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // FN11 Function: LShift with tap '(' | ||
| 203 | ACTION_FUNCTION_TAP(RSHIFT_RPAREN), // FN12 Function: RShift with tap ')' | ||
| 204 | ACTION_FUNCTION(MACRO, 1), // FN13 Macro: | ||
| 204 | }; | 205 | }; |
| 205 | 206 | ||
| 206 | 207 | ||
| 207 | uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) | 208 | /* |
| 209 | * Macro definition | ||
| 210 | */ | ||
| 211 | #define MACRO(...) ({ static prog_macro_t _m[] PROGMEM = { __VA_ARGS__ }; _m; }) | ||
| 212 | #define MACRO_NONE 0 | ||
| 213 | static const prog_macro_t *get_macro(uint8_t id, bool pressed) | ||
| 208 | { | 214 | { |
| 209 | return KEYCODE(layer, row, col); | 215 | switch (id) { |
| 216 | case 0: | ||
| 217 | return (pressed ? | ||
| 218 | MACRO( MD(LSHIFT), D(D), END ) : | ||
| 219 | MACRO( U(D), MU(LSHIFT), END ) ); | ||
| 220 | case 1: | ||
| 221 | return (pressed ? | ||
| 222 | MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END ) : | ||
| 223 | MACRO_NONE ); | ||
| 224 | } | ||
| 225 | return 0; | ||
| 210 | } | 226 | } |
| 211 | 227 | ||
| 212 | uint8_t keymap_fn_layer(uint8_t index) | 228 | |
| 229 | |||
| 230 | /* | ||
| 231 | * user defined action function | ||
| 232 | */ | ||
| 233 | void keymap_call_function(keyrecord_t *record, uint8_t id, uint8_t opt) | ||
| 213 | { | 234 | { |
| 214 | return pgm_read_byte(&fn_layer[index]); | 235 | keyevent_t event = record->event; |
| 236 | uint8_t tap_count = record->tap_count; | ||
| 237 | |||
| 238 | debug("action_call_function: "); | ||
| 239 | if (event.pressed) debug("pressed"); else debug("released"); | ||
| 240 | debug(" id: "); debug_hex(id); | ||
| 241 | debug(" tap_count: "); debug_dec(tap_count); | ||
| 242 | debug("\n"); | ||
| 243 | |||
| 244 | switch (id) { | ||
| 245 | case LSHIFT_LPAREN: | ||
| 246 | // LShft + tap '(' | ||
| 247 | if (event.pressed) { | ||
| 248 | if (tap_count == 0) { | ||
| 249 | add_mods(MOD_BIT(KC_LSHIFT)); | ||
| 250 | } else { | ||
| 251 | if (waiting_buffer_has_anykey_pressed()) { | ||
| 252 | // ad hoc: set 0 to cancel tap | ||
| 253 | record->tap_count = 0; | ||
| 254 | add_mods(MOD_BIT(KC_LSHIFT)); | ||
| 255 | } else { | ||
| 256 | // NOTE to avoid conflicting command key bind(LShift+RShift) | ||
| 257 | //register_code(KC_LSHIFT); | ||
| 258 | //register_code(KC_9); | ||
| 259 | host_add_mods(MOD_BIT(KC_LSHIFT)); | ||
| 260 | host_add_key(KC_9); | ||
| 261 | host_send_keyboard_report(); | ||
| 262 | } | ||
| 263 | } | ||
| 264 | } else { | ||
| 265 | if (tap_count == 0) { | ||
| 266 | del_mods(MOD_BIT(KC_LSHIFT)); | ||
| 267 | } else { | ||
| 268 | //unregister_code(KC_9); | ||
| 269 | //unregister_code(KC_LSHIFT); | ||
| 270 | host_del_mods(MOD_BIT(KC_LSHIFT)); | ||
| 271 | host_del_key(KC_9); | ||
| 272 | host_send_keyboard_report(); | ||
| 273 | } | ||
| 274 | } | ||
| 275 | break; | ||
| 276 | case RSHIFT_RPAREN: | ||
| 277 | // RShift + tap ')' | ||
| 278 | if (event.pressed) { | ||
| 279 | if (tap_count == 0) { | ||
| 280 | add_mods(MOD_BIT(KC_RSHIFT)); | ||
| 281 | } else { | ||
| 282 | if (waiting_buffer_has_anykey_pressed()) { | ||
| 283 | // ad hoc: set 0 to cancel tap | ||
| 284 | record->tap_count = 0; | ||
| 285 | add_mods(MOD_BIT(KC_RSHIFT)); | ||
| 286 | } else { | ||
| 287 | //register_code(KC_RSHIFT); | ||
| 288 | //register_code(KC_0); | ||
| 289 | host_add_mods(MOD_BIT(KC_RSHIFT)); | ||
| 290 | host_add_key(KC_0); | ||
| 291 | host_send_keyboard_report(); | ||
| 292 | } | ||
| 293 | } | ||
| 294 | } else { | ||
| 295 | if (tap_count == 0) { | ||
| 296 | del_mods(MOD_BIT(KC_RSHIFT)); | ||
| 297 | } else { | ||
| 298 | //unregister_code(KC_0); | ||
| 299 | //unregister_code(KC_RSHIFT); | ||
| 300 | host_del_mods(MOD_BIT(KC_RSHIFT)); | ||
| 301 | host_del_key(KC_0); | ||
| 302 | host_send_keyboard_report(); | ||
| 303 | } | ||
| 304 | } | ||
| 305 | break; | ||
| 306 | case MACRO: | ||
| 307 | action_macro_play(get_macro(opt, event.pressed)); | ||
| 308 | break; | ||
| 309 | } | ||
| 215 | } | 310 | } |
| 216 | 311 | ||
| 217 | uint8_t keymap_fn_keycode(uint8_t index) | 312 | /* convert keycode to action */ |
| 218 | { | 313 | action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { |
| 219 | return pgm_read_byte(&fn_keycode[index]); | 314 | uint8_t key = (pgm_read_byte(&keymaps[(layer)][(row)][(col)])); |
| 315 | action_t action; | ||
| 316 | switch (key) { | ||
| 317 | case KC_A ... KC_EXSEL: | ||
| 318 | action.code = ACTION_KEY(key); | ||
| 319 | break; | ||
| 320 | case KC_LCTRL ... KC_LGUI: | ||
| 321 | action.code = ACTION_LMOD(key); | ||
| 322 | break; | ||
| 323 | case KC_RCTRL ... KC_RGUI: | ||
| 324 | action.code = ACTION_RMOD(key); | ||
| 325 | break; | ||
| 326 | case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | ||
| 327 | action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key)); | ||
| 328 | break; | ||
| 329 | case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: | ||
| 330 | action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key)); | ||
| 331 | break; | ||
| 332 | case KC_MS_UP ... KC_MS_ACCEL2: | ||
| 333 | action.code = ACTION_MOUSEKEY(key); | ||
| 334 | break; | ||
| 335 | case KC_FN0 ... KC_FN31: | ||
| 336 | if (FN_INDEX(key) < sizeof(fn_actions) / sizeof(fn_actions[0])) { | ||
| 337 | action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]); | ||
| 338 | } else { | ||
| 339 | action.code = ACTION_NO; | ||
| 340 | } | ||
| 341 | break; | ||
| 342 | case KC_NO ... KC_UNDEFINED: | ||
| 343 | default: | ||
| 344 | action.code = ACTION_NO; | ||
| 345 | break; | ||
| 346 | } | ||
| 347 | return action; | ||
| 220 | } | 348 | } |
