diff options
| author | tmk <nobody@nowhere> | 2013-02-01 14:48:11 +0900 |
|---|---|---|
| committer | tmk <nobody@nowhere> | 2013-02-01 14:48:11 +0900 |
| commit | 1d7962ba8a20323dc13cc913381608e117afaeb4 (patch) | |
| tree | 7f345a164f79364a3d7178be8b828d648b3e6c8a /keyboard/hhkb | |
| parent | d95463f2e0369dc0e28497bb923b3012fb09e900 (diff) | |
| download | qmk_firmware-1d7962ba8a20323dc13cc913381608e117afaeb4.tar.gz qmk_firmware-1d7962ba8a20323dc13cc913381608e117afaeb4.zip | |
Add user defined function to action.
Diffstat (limited to 'keyboard/hhkb')
| -rw-r--r-- | keyboard/hhkb/keymap.c | 163 |
1 files changed, 113 insertions, 50 deletions
diff --git a/keyboard/hhkb/keymap.c b/keyboard/hhkb/keymap.c index c7e4cfc38..e11b4563a 100644 --- a/keyboard/hhkb/keymap.c +++ b/keyboard/hhkb/keymap.c | |||
| @@ -51,23 +51,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | 53 | ||
| 54 | static const uint16_t PROGMEM fn_actions[] = { | ||
| 55 | ACTION_LAYER_TO_DEFAULT_ON_RELEASED, // Fn0 | ||
| 56 | ACTION_LAYER_SET_ON_PRESSED(1), // Fn1 | ||
| 57 | ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // Fn2 | ||
| 58 | ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // Fn3 | ||
| 59 | //ACTION_LAYER_SET_ON_PRESSED(3), // Fn4 | ||
| 60 | ACTION_FUNCTION(0x01, 0xA), // Fn4 | ||
| 61 | ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // Fn5 | ||
| 62 | ACTION_LMODS_TAP(MOD_BIT(KC_LCTL), KC_BSPC), // Fn6 | ||
| 63 | ACTION_RMODS_TAP(MOD_BIT(KC_RCTL), KC_ENT), // Fn7 | ||
| 64 | |||
| 65 | ACTION_LMODS_TAP(MOD_BIT(KC_LSFT), ONE_SHOT), // Fn8 | ||
| 66 | ACTION_LAYER_SET_ON_RELEASED_TAP_TOGGLE(1), // Fn9 | ||
| 67 | ACTION_LAYER_BIT_TAP_TOGGLE(1), // Fn10 | ||
| 68 | }; | ||
| 69 | |||
| 70 | |||
| 71 | static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | 54 | static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
| 72 | /* Layer 0: Default Layer | 55 | /* Layer 0: Default Layer |
| 73 | * ,-----------------------------------------------------------. | 56 | * ,-----------------------------------------------------------. |
| @@ -85,7 +68,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 85 | KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ | 68 | KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ |
| 86 | TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ | 69 | TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ |
| 87 | FN6, A, S, D, F, G, H, J, K, L, FN3, QUOT,FN7, \ | 70 | FN6, A, S, D, F, G, H, J, K, L, FN3, QUOT,FN7, \ |
| 88 | FN8, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN10, \ | 71 | FN8, Z, X, C, V, B, N, M, COMM,DOT, FN2, FN12,FN10, \ |
| 89 | LGUI,LALT, FN5, RALT,FN4), | 72 | LGUI,LALT, FN5, RALT,FN4), |
| 90 | 73 | ||
| 91 | /* Layer 1: HHKB mode (HHKB Fn) | 74 | /* Layer 1: HHKB mode (HHKB Fn) |
| @@ -173,24 +156,127 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 173 | LGUI,LALT, FN0, RALT,RGUI), | 156 | LGUI,LALT, FN0, RALT,RGUI), |
| 174 | }; | 157 | }; |
| 175 | 158 | ||
| 176 | #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) | ||
| 177 | 159 | ||
| 178 | 160 | ||
| 179 | /* legacy interface */ | 161 | /* id for user defined functions */ |
| 180 | uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) { return 0; } | 162 | enum function_id { |
| 181 | uint8_t keymap_fn_layer(uint8_t fn_bits) { return 0; } | 163 | LSHIFT_LPAREN, |
| 182 | uint8_t keymap_fn_keycode(uint8_t fn_bits) { return 0; } | 164 | RSHIFT_RPAREN, |
| 165 | }; | ||
| 166 | |||
| 167 | /* | ||
| 168 | * Fn action definition | ||
| 169 | */ | ||
| 170 | static const uint16_t PROGMEM fn_actions[] = { | ||
| 171 | ACTION_LAYER_RETURN_DEFAULT, // FN0 | ||
| 172 | ACTION_LAYER_SET(1), // FN1 | ||
| 173 | ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // FN2 | ||
| 174 | ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // FN3 | ||
| 175 | ACTION_LAYER_SET(3), // FN4 | ||
| 176 | ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // FN5 | ||
| 177 | ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // FN6 | ||
| 178 | ACTION_RMOD_TAP_KEY(KC_RCTL, KC_ENT), // FN7 | ||
| 179 | ACTION_LMOD_ONESHOT(KC_LSFT), // FN8 Oneshot Shift | ||
| 180 | ACTION_LAYER_SET_ON_RELEASED_TAP_TOGGLE(1), // FN9 | ||
| 181 | ACTION_LAYER_BIT_TAP_KEY(1, KC_GRV), // FN10 | ||
| 182 | //ACTION_LAYER_BIT(1), // FN10 | ||
| 183 | //ACTION_LAYER_BIT_TAP_TOGGLE(1), // FN10 | ||
| 184 | ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // FN11 | ||
| 185 | ACTION_FUNCTION_TAP(RSHIFT_RPAREN), // FN12 | ||
| 186 | }; | ||
| 187 | |||
| 188 | /* | ||
| 189 | * user defined action function | ||
| 190 | */ | ||
| 191 | void keymap_call_function(keyrecord_t *record, uint8_t id) | ||
| 192 | { | ||
| 193 | keyevent_t event = record->event; | ||
| 194 | uint8_t tap_count = record->tap_count; | ||
| 195 | |||
| 196 | debug("action_call_function: "); | ||
| 197 | if (event.pressed) debug("pressed"); else debug("released"); | ||
| 198 | debug(" id: "); debug_hex(id); | ||
| 199 | debug(" tap_count: "); debug_dec(tap_count); | ||
| 200 | debug("\n"); | ||
| 183 | 201 | ||
| 202 | switch (id) { | ||
| 203 | case LSHIFT_LPAREN: | ||
| 204 | // LShft + tap '(' | ||
| 205 | if (event.pressed) { | ||
| 206 | if (tap_count == 0) { | ||
| 207 | add_mods(MOD_BIT(KC_LSHIFT)); | ||
| 208 | } else { | ||
| 209 | if (waiting_buffer_has_anykey_pressed()) { | ||
| 210 | // ad hoc: set 0 to cancel tap | ||
| 211 | record->tap_count = 0; | ||
| 212 | add_mods(MOD_BIT(KC_LSHIFT)); | ||
| 213 | } else { | ||
| 214 | // NOTE to avoid conflicting command key bind(LShift+RShift) | ||
| 215 | //register_code(KC_LSHIFT); | ||
| 216 | //register_code(KC_9); | ||
| 217 | host_add_mods(MOD_BIT(KC_LSHIFT)); | ||
| 218 | host_add_key(KC_9); | ||
| 219 | host_send_keyboard_report(); | ||
| 220 | } | ||
| 221 | } | ||
| 222 | } else { | ||
| 223 | if (tap_count == 0) { | ||
| 224 | del_mods(MOD_BIT(KC_LSHIFT)); | ||
| 225 | } else { | ||
| 226 | //unregister_code(KC_9); | ||
| 227 | //unregister_code(KC_LSHIFT); | ||
| 228 | host_del_mods(MOD_BIT(KC_LSHIFT)); | ||
| 229 | host_del_key(KC_9); | ||
| 230 | host_send_keyboard_report(); | ||
| 231 | } | ||
| 232 | } | ||
| 233 | break; | ||
| 234 | case RSHIFT_RPAREN: | ||
| 235 | // RShift + tap ')' | ||
| 236 | if (event.pressed) { | ||
| 237 | if (tap_count == 0) { | ||
| 238 | add_mods(MOD_BIT(KC_RSHIFT)); | ||
| 239 | } else { | ||
| 240 | if (waiting_buffer_has_anykey_pressed()) { | ||
| 241 | // ad hoc: set 0 to cancel tap | ||
| 242 | record->tap_count = 0; | ||
| 243 | add_mods(MOD_BIT(KC_RSHIFT)); | ||
| 244 | } else { | ||
| 245 | //register_code(KC_RSHIFT); | ||
| 246 | //register_code(KC_0); | ||
| 247 | host_add_mods(MOD_BIT(KC_RSHIFT)); | ||
| 248 | host_add_key(KC_0); | ||
| 249 | host_send_keyboard_report(); | ||
| 250 | } | ||
| 251 | } | ||
| 252 | } else { | ||
| 253 | if (tap_count == 0) { | ||
| 254 | del_mods(MOD_BIT(KC_RSHIFT)); | ||
| 255 | } else { | ||
| 256 | //unregister_code(KC_0); | ||
| 257 | //unregister_code(KC_RSHIFT); | ||
| 258 | host_del_mods(MOD_BIT(KC_RSHIFT)); | ||
| 259 | host_del_key(KC_0); | ||
| 260 | host_send_keyboard_report(); | ||
| 261 | } | ||
| 262 | } | ||
| 263 | break; | ||
| 264 | } | ||
| 265 | } | ||
| 184 | 266 | ||
| 267 | /* convert keycode to action */ | ||
| 185 | action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { | 268 | action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { |
| 186 | /* convert from legacy keycode to action */ | 269 | uint8_t key = (pgm_read_byte(&keymaps[(layer)][(row)][(col)])); |
| 187 | uint8_t key = KEYCODE(layer, row, col); | ||
| 188 | action_t action; | 270 | action_t action; |
| 189 | switch (key) { | 271 | switch (key) { |
| 190 | case KC_A ... KC_EXSEL: | 272 | case KC_A ... KC_EXSEL: |
| 273 | action.code = ACTION_KEY(key); | ||
| 274 | break; | ||
| 191 | case KC_LCTRL ... KC_LGUI: | 275 | case KC_LCTRL ... KC_LGUI: |
| 276 | action.code = ACTION_LMOD(key); | ||
| 277 | break; | ||
| 192 | case KC_RCTRL ... KC_RGUI: | 278 | case KC_RCTRL ... KC_RGUI: |
| 193 | action.code = ACTION_KEY(key); | 279 | action.code = ACTION_RMOD(key); |
| 194 | break; | 280 | break; |
| 195 | case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | 281 | case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: |
| 196 | action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key)); | 282 | action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key)); |
| @@ -201,15 +287,7 @@ action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { | |||
| 201 | case KC_MS_UP ... KC_MS_ACCEL2: | 287 | case KC_MS_UP ... KC_MS_ACCEL2: |
| 202 | action.code = ACTION_MOUSEKEY(key); | 288 | action.code = ACTION_MOUSEKEY(key); |
| 203 | break; | 289 | break; |
| 204 | /* TODO | 290 | case KC_FN0 ... KC_FN31: |
| 205 | case KC_LCTRL ... KC_LGUI: | ||
| 206 | action.code = ACTION_LMODS(MOD_BIT(key)); | ||
| 207 | break; | ||
| 208 | case KC_RCTRL ... KC_RGUI: | ||
| 209 | action.code = ACTION_RMODS(MOD_BIT(key)>>4); | ||
| 210 | break; | ||
| 211 | */ | ||
| 212 | case KC_FN0 ... FN_MAX: | ||
| 213 | if (FN_INDEX(key) < sizeof(fn_actions) / sizeof(fn_actions[0])) { | 291 | if (FN_INDEX(key) < sizeof(fn_actions) / sizeof(fn_actions[0])) { |
| 214 | action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]); | 292 | action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]); |
| 215 | } else { | 293 | } else { |
| @@ -223,18 +301,3 @@ action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { | |||
| 223 | } | 301 | } |
| 224 | return action; | 302 | return action; |
| 225 | } | 303 | } |
| 226 | |||
| 227 | // TODO: how to define action function | ||
| 228 | void action_call_function(keyevent_t event, uint8_t id) | ||
| 229 | { | ||
| 230 | // '(' Shift+9 | ||
| 231 | if (event.pressed) { | ||
| 232 | register_code(KC_LSHIFT); | ||
| 233 | register_code(KC_9); | ||
| 234 | debug("action_call_function: pressed: id: "); debug_hex(id); debug("\n"); | ||
| 235 | } else { | ||
| 236 | unregister_code(KC_9); | ||
| 237 | unregister_code(KC_LSHIFT); | ||
| 238 | debug("action_call_function: released: id: "); debug_hex(id); debug("\n"); | ||
| 239 | } | ||
| 240 | } | ||
