diff options
| author | tmk <nobody@nowhere> | 2013-01-13 10:24:20 +0900 |
|---|---|---|
| committer | tmk <nobody@nowhere> | 2013-01-13 10:24:20 +0900 |
| commit | 32633a42c74c65462370ef4a39a44a5784a98a06 (patch) | |
| tree | 8bbc2fc62bcb06c9ea897507a4000b7336d1a6eb | |
| parent | 411de9cc22e927313a5a768f3bf41f2f99bca126 (diff) | |
| download | qmk_firmware-32633a42c74c65462370ef4a39a44a5784a98a06.tar.gz qmk_firmware-32633a42c74c65462370ef4a39a44a5784a98a06.zip | |
Fix tap key using delaying_layer and waiting_key.
| -rw-r--r-- | common/action.c | 167 | ||||
| -rw-r--r-- | common/host.c | 5 | ||||
| -rw-r--r-- | common/host.h | 3 | ||||
| -rw-r--r-- | common/keyboard.c | 2 | ||||
| -rw-r--r-- | keyboard/hhkb/keymap.c | 8 |
5 files changed, 152 insertions, 33 deletions
diff --git a/common/action.c b/common/action.c index 425a2b00f..1a86f16d3 100644 --- a/common/action.c +++ b/common/action.c | |||
| @@ -115,29 +115,25 @@ uint8_t default_layer = 0; | |||
| 115 | uint8_t current_layer = 0; | 115 | uint8_t current_layer = 0; |
| 116 | keyrecord_t delaying_layer = {}; | 116 | keyrecord_t delaying_layer = {}; |
| 117 | 117 | ||
| 118 | keyrecord_t waiting_key = {}; | ||
| 118 | 119 | ||
| 119 | void action_exec(keyevent_t event) | 120 | // TODO: ring buffer: waiting_keys[] |
| 121 | /* | ||
| 122 | #define WAITING_KEYS_BUFFER 3 | ||
| 123 | static keyrecord_t waiting_keys[WAITING_KEYS_BUFFER] = {}; | ||
| 124 | static uint8_t waiting_keys_head = 0; | ||
| 125 | static uint8_t waiting_keys_tail = 0; | ||
| 126 | static void waiting_key_queue(keyevent_t event) | ||
| 120 | { | 127 | { |
| 121 | /* count tap when key is up */ | 128 | } |
| 122 | if (KEYEQ(event.key, last_event.key) && timer_elapsed(last_event_time) < TAP_TIME) { | 129 | static void waiting_key_dequeue(keyevent_t event) |
| 123 | if (!event.pressed) tap_count++; | 130 | { |
| 124 | } else { | 131 | } |
| 125 | tap_count = 0; | 132 | */ |
| 126 | } | ||
| 127 | 133 | ||
| 128 | /* layer switch after LAYER_DELAY */ | 134 | static void process(keyevent_t event, action_t action) |
| 129 | if (delaying_layer.action.code && timer_elapsed(delaying_layer.event.time) > LAYER_DELAY) { | 135 | { |
| 130 | switch (delaying_layer.action.kind.id) { | 136 | //action_t action = keymap_get_action(current_layer, event.key.row, event.key.col); |
| 131 | case ACT_LAYER_PRESSED: | ||
| 132 | layer_switch(delaying_layer.action.layer.opt); | ||
| 133 | break; | ||
| 134 | case ACT_LAYER_BIT: | ||
| 135 | layer_switch(current_layer | delaying_layer.action.layer.opt); | ||
| 136 | break; | ||
| 137 | } | ||
| 138 | delaying_layer = (keyrecord_t){}; | ||
| 139 | } | ||
| 140 | action_t action = keymap_get_action(current_layer, event.key.row, event.key.col); | ||
| 141 | 137 | ||
| 142 | debug("action: "); debug_hex16(action.code); debug("\n"); | 138 | debug("action: "); debug_hex16(action.code); debug("\n"); |
| 143 | debug("kind.id: "); debug_hex(action.kind.id); debug("\n"); | 139 | debug("kind.id: "); debug_hex(action.kind.id); debug("\n"); |
| @@ -146,29 +142,54 @@ void action_exec(keyevent_t event) | |||
| 146 | debug("key.mods: "); debug_hex(action.key.mods); debug("\n"); | 142 | debug("key.mods: "); debug_hex(action.key.mods); debug("\n"); |
| 147 | 143 | ||
| 148 | switch (action.kind.id) { | 144 | switch (action.kind.id) { |
| 145 | /* Key and Mods */ | ||
| 149 | case ACT_LMODS: | 146 | case ACT_LMODS: |
| 150 | // normal key or key plus mods | 147 | // normal key or key plus mods |
| 151 | if (event.pressed) { | 148 | if (event.pressed) { |
| 152 | register_mods(action.key.mods); | 149 | uint8_t tmp_mods = host_get_mods(); |
| 150 | if (action.key.mods) { | ||
| 151 | host_add_mods(action.key.mods); | ||
| 152 | host_send_keyboard_report(); | ||
| 153 | } | ||
| 153 | register_code(action.key.code); | 154 | register_code(action.key.code); |
| 155 | if (action.key.mods && action.key.code) { | ||
| 156 | host_set_mods(tmp_mods); | ||
| 157 | host_send_keyboard_report(); | ||
| 158 | } | ||
| 154 | } else { | 159 | } else { |
| 160 | if (action.key.mods && !action.key.code) { | ||
| 161 | host_del_mods(action.key.mods); | ||
| 162 | host_send_keyboard_report(); | ||
| 163 | } | ||
| 155 | unregister_code(action.key.code); | 164 | unregister_code(action.key.code); |
| 156 | unregister_mods(action.key.mods); | ||
| 157 | } | 165 | } |
| 158 | break; | 166 | break; |
| 159 | case ACT_RMODS: | 167 | case ACT_RMODS: |
| 160 | if (event.pressed) { | 168 | if (event.pressed) { |
| 161 | register_mods(action.key.mods<<4); | 169 | uint8_t tmp_mods = host_get_mods(); |
| 170 | if (action.key.mods) { | ||
| 171 | host_add_mods(action.key.mods<<4); | ||
| 172 | host_send_keyboard_report(); | ||
| 173 | } | ||
| 162 | register_code(action.key.code); | 174 | register_code(action.key.code); |
| 175 | if (action.key.mods && action.key.code) { | ||
| 176 | host_set_mods(tmp_mods); | ||
| 177 | host_send_keyboard_report(); | ||
| 178 | } | ||
| 163 | } else { | 179 | } else { |
| 180 | if (action.key.mods && !action.key.code) { | ||
| 181 | host_del_mods(action.key.mods<<4); | ||
| 182 | host_send_keyboard_report(); | ||
| 183 | } | ||
| 164 | unregister_code(action.key.code); | 184 | unregister_code(action.key.code); |
| 165 | unregister_mods(action.key.mods<<4); | ||
| 166 | } | 185 | } |
| 167 | break; | 186 | break; |
| 168 | case ACT_LMOD_TAP: | 187 | case ACT_LMOD_TAP: |
| 169 | break; | 188 | break; |
| 170 | case ACT_RMOD_TAP: | 189 | case ACT_RMOD_TAP: |
| 171 | break; | 190 | break; |
| 191 | |||
| 192 | /* other HID usage */ | ||
| 172 | case ACT_USAGE: | 193 | case ACT_USAGE: |
| 173 | #ifdef EXTRAKEY_ENABLE | 194 | #ifdef EXTRAKEY_ENABLE |
| 174 | switch (action.usage.page) { | 195 | switch (action.usage.page) { |
| @@ -189,6 +210,8 @@ void action_exec(keyevent_t event) | |||
| 189 | } | 210 | } |
| 190 | #endif | 211 | #endif |
| 191 | break; | 212 | break; |
| 213 | |||
| 214 | /* Mouse key */ | ||
| 192 | case ACT_MOUSEKEY: | 215 | case ACT_MOUSEKEY: |
| 193 | #ifdef MOUSEKEY_ENABLE | 216 | #ifdef MOUSEKEY_ENABLE |
| 194 | if (event.pressed) { | 217 | if (event.pressed) { |
| @@ -200,6 +223,8 @@ void action_exec(keyevent_t event) | |||
| 200 | } | 223 | } |
| 201 | #endif | 224 | #endif |
| 202 | break; | 225 | break; |
| 226 | |||
| 227 | /* Layer key */ | ||
| 203 | case ACT_LAYER_PRESSED: | 228 | case ACT_LAYER_PRESSED: |
| 204 | // layer action when pressed | 229 | // layer action when pressed |
| 205 | switch (action.layer.code) { | 230 | switch (action.layer.code) { |
| @@ -228,19 +253,25 @@ void action_exec(keyevent_t event) | |||
| 228 | delaying_layer = (keyrecord_t){ | 253 | delaying_layer = (keyrecord_t){ |
| 229 | .event = event, | 254 | .event = event, |
| 230 | .action = action, | 255 | .action = action, |
| 231 | .mods = keyboard_report->mods | 256 | .mods = host_get_mods() |
| 232 | }; | 257 | }; |
| 233 | } | 258 | } |
| 234 | } else if (tap_count > 0) { | 259 | } else if (tap_count > 0) { |
| 235 | register_code(action.layer.code); | 260 | register_code(action.layer.code); |
| 236 | } | 261 | } |
| 237 | } else { | 262 | } else { |
| 238 | // type key after tap | 263 | // tap key |
| 239 | if (tap_count == 1) { | 264 | if (KEYEQ(event.key, delaying_layer.event.key) && |
| 240 | delaying_layer = (keyrecord_t){}; | 265 | timer_elapsed(delaying_layer.event.time) < TAP_TIME) { |
| 241 | register_code(action.layer.code); | 266 | uint8_t tmp_mods = host_get_mods(); |
| 267 | host_set_mods(delaying_layer.mods); | ||
| 268 | register_code(delaying_layer.action.layer.code); | ||
| 269 | host_set_mods(tmp_mods); | ||
| 270 | unregister_code(delaying_layer.action.layer.code); | ||
| 271 | } else { | ||
| 272 | unregister_code(action.layer.code); | ||
| 242 | } | 273 | } |
| 243 | unregister_code(action.layer.code); | 274 | delaying_layer = (keyrecord_t){}; |
| 244 | } | 275 | } |
| 245 | break; | 276 | break; |
| 246 | } | 277 | } |
| @@ -366,12 +397,87 @@ void action_exec(keyevent_t event) | |||
| 366 | break; | 397 | break; |
| 367 | } | 398 | } |
| 368 | break; | 399 | break; |
| 400 | |||
| 401 | /* Extentions */ | ||
| 369 | case ACT_MACRO: | 402 | case ACT_MACRO: |
| 370 | case ACT_COMMAND: | 403 | case ACT_COMMAND: |
| 371 | case ACT_FUNCTION: | 404 | case ACT_FUNCTION: |
| 372 | default: | 405 | default: |
| 373 | break; | 406 | break; |
| 374 | } | 407 | } |
| 408 | } | ||
| 409 | |||
| 410 | void action_exec(keyevent_t event) | ||
| 411 | { | ||
| 412 | /* count tap when key is up */ | ||
| 413 | if (KEYEQ(event.key, last_event.key) && timer_elapsed(last_event_time) < TAP_TIME) { | ||
| 414 | if (!event.pressed) tap_count++; | ||
| 415 | } else { | ||
| 416 | tap_count = 0; | ||
| 417 | } | ||
| 418 | |||
| 419 | /* When delaying layer switch */ | ||
| 420 | if (delaying_layer.action.code) { | ||
| 421 | /* Layer switch when delay time elapses or waiting key is released */ | ||
| 422 | if ((timer_elapsed(delaying_layer.event.time) > LAYER_DELAY) || | ||
| 423 | (!event.pressed && KEYEQ(event.key, waiting_key.event.key))) { | ||
| 424 | /* layer switch */ | ||
| 425 | switch (delaying_layer.action.kind.id) { | ||
| 426 | case ACT_LAYER_PRESSED: | ||
| 427 | layer_switch(delaying_layer.action.layer.opt); | ||
| 428 | break; | ||
| 429 | case ACT_LAYER_BIT: | ||
| 430 | layer_switch(current_layer | delaying_layer.action.layer.opt); | ||
| 431 | break; | ||
| 432 | } | ||
| 433 | delaying_layer = (keyrecord_t){}; | ||
| 434 | |||
| 435 | /* Process waiting keys in new layer */ | ||
| 436 | if (waiting_key.event.time) { | ||
| 437 | uint8_t tmp_mods = host_get_mods(); | ||
| 438 | host_set_mods(waiting_key.mods); | ||
| 439 | process(waiting_key.event, keymap_get_action(current_layer, | ||
| 440 | waiting_key.event.key.row, | ||
| 441 | waiting_key.event.key.col)); | ||
| 442 | host_set_mods(tmp_mods); | ||
| 443 | waiting_key = (keyrecord_t){}; | ||
| 444 | } | ||
| 445 | } | ||
| 446 | /* when delaying layer key is released within delay term */ | ||
| 447 | else if (!event.pressed && KEYEQ(event.key, delaying_layer.event.key)) { | ||
| 448 | /* tap key down */ | ||
| 449 | uint8_t tmp_mods = host_get_mods(); | ||
| 450 | host_set_mods(delaying_layer.mods); | ||
| 451 | register_code(delaying_layer.action.layer.code); | ||
| 452 | delaying_layer = (keyrecord_t){}; | ||
| 453 | |||
| 454 | /* process waiting keys */ | ||
| 455 | if (waiting_key.event.time) { | ||
| 456 | host_set_mods(waiting_key.mods); | ||
| 457 | process(waiting_key.event, waiting_key.action); | ||
| 458 | waiting_key = (keyrecord_t){}; | ||
| 459 | } | ||
| 460 | host_set_mods(tmp_mods); | ||
| 461 | } | ||
| 462 | } | ||
| 463 | |||
| 464 | action_t action = keymap_get_action(current_layer, event.key.row, event.key.col); | ||
| 465 | |||
| 466 | /* postpone key-down events while delaying layer */ | ||
| 467 | if (delaying_layer.action.code) { | ||
| 468 | if (event.pressed) { | ||
| 469 | // TODO: waiting_keys[] | ||
| 470 | waiting_key = (keyrecord_t){ | ||
| 471 | .event = event, | ||
| 472 | .action = action, | ||
| 473 | .mods = host_get_mods() | ||
| 474 | }; | ||
| 475 | } else { | ||
| 476 | process(event, action); | ||
| 477 | } | ||
| 478 | } else { | ||
| 479 | process(event, action); | ||
| 480 | } | ||
| 375 | 481 | ||
| 376 | /* last event */ | 482 | /* last event */ |
| 377 | last_event = event; | 483 | last_event = event; |
| @@ -451,5 +557,6 @@ static void layer_switch(uint8_t new_layer) | |||
| 451 | 557 | ||
| 452 | current_layer = new_layer; | 558 | current_layer = new_layer; |
| 453 | clear_keyboard_but_mods(); // To avoid stuck keys | 559 | clear_keyboard_but_mods(); // To avoid stuck keys |
| 560 | // TODO: update mods with full scan of matrix? if modifier changes between layers | ||
| 454 | } | 561 | } |
| 455 | } | 562 | } |
diff --git a/common/host.c b/common/host.c index 28c8a819f..6ed3d780f 100644 --- a/common/host.c +++ b/common/host.c | |||
| @@ -127,6 +127,11 @@ void host_clear_keys(void) | |||
| 127 | } | 127 | } |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | uint8_t host_get_mods(void) | ||
| 131 | { | ||
| 132 | return keyboard_report->mods; | ||
| 133 | } | ||
| 134 | |||
| 130 | void host_add_mods(uint8_t mods) | 135 | void host_add_mods(uint8_t mods) |
| 131 | { | 136 | { |
| 132 | keyboard_report->mods |= mods; | 137 | keyboard_report->mods |= mods; |
diff --git a/common/host.h b/common/host.h index 4f1f234a9..c59fbfee6 100644 --- a/common/host.h +++ b/common/host.h | |||
| @@ -51,10 +51,13 @@ void host_consumer_send(uint16_t data); | |||
| 51 | void host_add_key(uint8_t key); | 51 | void host_add_key(uint8_t key); |
| 52 | void host_del_key(uint8_t key); | 52 | void host_del_key(uint8_t key); |
| 53 | void host_clear_keys(void); | 53 | void host_clear_keys(void); |
| 54 | |||
| 55 | uint8_t host_get_mods(void); | ||
| 54 | void host_add_mods(uint8_t mods); | 56 | void host_add_mods(uint8_t mods); |
| 55 | void host_del_mods(uint8_t mods); | 57 | void host_del_mods(uint8_t mods); |
| 56 | void host_set_mods(uint8_t mods); | 58 | void host_set_mods(uint8_t mods); |
| 57 | void host_clear_mods(void); | 59 | void host_clear_mods(void); |
| 60 | |||
| 58 | uint8_t host_has_anykey(void); | 61 | uint8_t host_has_anykey(void); |
| 59 | uint8_t host_has_anymod(void); | 62 | uint8_t host_has_anymod(void); |
| 60 | uint8_t host_get_first_key(void); | 63 | uint8_t host_get_first_key(void); |
diff --git a/common/keyboard.c b/common/keyboard.c index 1e0b8c3ed..4e955e129 100644 --- a/common/keyboard.c +++ b/common/keyboard.c | |||
| @@ -68,7 +68,7 @@ void keyboard_task(void) | |||
| 68 | action_exec((keyevent_t){ | 68 | action_exec((keyevent_t){ |
| 69 | .key = (keypos_t){ .row = r, .col = c }, | 69 | .key = (keypos_t){ .row = r, .col = c }, |
| 70 | .pressed = (matrix_row & (1<<c)), | 70 | .pressed = (matrix_row & (1<<c)), |
| 71 | .time = timer_read() | 71 | .time = (timer_read() | 1) /* NOTE: 0 means no event */ |
| 72 | }); | 72 | }); |
| 73 | // record a processed key | 73 | // record a processed key |
| 74 | matrix_prev[r] ^= (1<<c); | 74 | matrix_prev[r] ^= (1<<c); |
diff --git a/keyboard/hhkb/keymap.c b/keyboard/hhkb/keymap.c index 3ea75f5bb..9fe1237aa 100644 --- a/keyboard/hhkb/keymap.c +++ b/keyboard/hhkb/keymap.c | |||
| @@ -149,8 +149,8 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 149 | */ | 149 | */ |
| 150 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | 150 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ |
| 151 | TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ | 151 | TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ |
| 152 | LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, ENT, \ | 152 | LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, QUOT,ENT, \ |
| 153 | LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ | 153 | LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,NO, \ |
| 154 | LGUI,LALT, BTN1, RALT,FN0), | 154 | LGUI,LALT, BTN1, RALT,FN0), |
| 155 | 155 | ||
| 156 | /* Layer 4: Matias half keyboard style (Space) | 156 | /* Layer 4: Matias half keyboard style (Space) |
| @@ -195,6 +195,8 @@ action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { | |||
| 195 | action_t action; | 195 | action_t action; |
| 196 | switch (key) { | 196 | switch (key) { |
| 197 | case KC_A ... KC_EXSEL: | 197 | case KC_A ... KC_EXSEL: |
| 198 | case KC_LCTRL ... KC_LGUI: | ||
| 199 | case KC_RCTRL ... KC_RGUI: | ||
| 198 | action.code = ACTION_KEY(key); | 200 | action.code = ACTION_KEY(key); |
| 199 | break; | 201 | break; |
| 200 | case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | 202 | case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: |
| @@ -206,12 +208,14 @@ action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { | |||
| 206 | case KC_MS_UP ... KC_MS_ACCEL2: | 208 | case KC_MS_UP ... KC_MS_ACCEL2: |
| 207 | action.code = ACTION_MOUSEKEY(key); | 209 | action.code = ACTION_MOUSEKEY(key); |
| 208 | break; | 210 | break; |
| 211 | /* | ||
| 209 | case KC_LCTRL ... KC_LGUI: | 212 | case KC_LCTRL ... KC_LGUI: |
| 210 | action.code = ACTION_LMODS(MOD_BIT(key)); | 213 | action.code = ACTION_LMODS(MOD_BIT(key)); |
| 211 | break; | 214 | break; |
| 212 | case KC_RCTRL ... KC_RGUI: | 215 | case KC_RCTRL ... KC_RGUI: |
| 213 | action.code = ACTION_RMODS(MOD_BIT(key)>>4); | 216 | action.code = ACTION_RMODS(MOD_BIT(key)>>4); |
| 214 | break; | 217 | break; |
| 218 | */ | ||
| 215 | case KC_FN0 ... KC_FN7: | 219 | case KC_FN0 ... KC_FN7: |
| 216 | action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]); | 220 | action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]); |
| 217 | break; | 221 | break; |
