diff options
author | fauxpark <fauxpark@gmail.com> | 2019-08-09 06:58:05 +1000 |
---|---|---|
committer | Drashna Jaelre <drashna@live.com> | 2019-08-08 13:58:05 -0700 |
commit | 2f6c068e0dd7abc3cec1bb72df0b1e96032246f8 (patch) | |
tree | aa2adad462669cc0f048bf81cec331e28287df7b | |
parent | 2a534e87acfa8391d88dac6df02ae1a14da6c18e (diff) | |
download | qmk_firmware-2f6c068e0dd7abc3cec1bb72df0b1e96032246f8.tar.gz qmk_firmware-2f6c068e0dd7abc3cec1bb72df0b1e96032246f8.zip |
Extend allowed range of tappable keycodes to include modifiers (#5809)
* Extend allowed range of tappable keycodes to include modifiers
* Get rid of the magic numbers altogether
* Remove some more magic numbers
* Extract LM() functionality from ACT_LAYER_TAP
* Use ACTION() macro everywhere
-rw-r--r-- | tmk_core/common/action.c | 25 | ||||
-rw-r--r-- | tmk_core/common/action_code.h | 16 |
2 files changed, 25 insertions, 16 deletions
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 5172e8650..f47fd20fc 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c | |||
@@ -437,20 +437,19 @@ void process_action(keyrecord_t *record, action_t action) | |||
437 | } | 437 | } |
438 | } | 438 | } |
439 | break; | 439 | break; |
440 | case ACT_LAYER_MODS: | ||
441 | if (event.pressed) { | ||
442 | layer_on(action.layer_mods.layer); | ||
443 | register_mods(action.layer_mods.mods); | ||
444 | } else { | ||
445 | unregister_mods(action.layer_mods.mods); | ||
446 | layer_off(action.layer_mods.layer); | ||
447 | } | ||
448 | break; | ||
440 | #ifndef NO_ACTION_TAPPING | 449 | #ifndef NO_ACTION_TAPPING |
441 | case ACT_LAYER_TAP: | 450 | case ACT_LAYER_TAP: |
442 | case ACT_LAYER_TAP_EXT: | 451 | case ACT_LAYER_TAP_EXT: |
443 | switch (action.layer_tap.code) { | 452 | switch (action.layer_tap.code) { |
444 | case 0xe0 ... 0xef: | ||
445 | /* layer On/Off with modifiers(left only) */ | ||
446 | if (event.pressed) { | ||
447 | layer_on(action.layer_tap.val); | ||
448 | register_mods(action.layer_tap.code & 0x0f); | ||
449 | } else { | ||
450 | layer_off(action.layer_tap.val); | ||
451 | unregister_mods(action.layer_tap.code & 0x0f); | ||
452 | } | ||
453 | break; | ||
454 | case OP_TAP_TOGGLE: | 453 | case OP_TAP_TOGGLE: |
455 | /* tap toggle */ | 454 | /* tap toggle */ |
456 | if (event.pressed) { | 455 | if (event.pressed) { |
@@ -652,6 +651,7 @@ void process_action(keyrecord_t *record, action_t action) | |||
652 | // if this event is a layer action, update the leds | 651 | // if this event is a layer action, update the leds |
653 | switch (action.kind.id) { | 652 | switch (action.kind.id) { |
654 | case ACT_LAYER: | 653 | case ACT_LAYER: |
654 | case ACT_LAYER_MODS: | ||
655 | #ifndef NO_ACTION_TAPPING | 655 | #ifndef NO_ACTION_TAPPING |
656 | case ACT_LAYER_TAP: | 656 | case ACT_LAYER_TAP: |
657 | case ACT_LAYER_TAP_EXT: | 657 | case ACT_LAYER_TAP_EXT: |
@@ -957,7 +957,7 @@ bool is_tap_action(action_t action) | |||
957 | case ACT_LAYER_TAP: | 957 | case ACT_LAYER_TAP: |
958 | case ACT_LAYER_TAP_EXT: | 958 | case ACT_LAYER_TAP_EXT: |
959 | switch (action.layer_tap.code) { | 959 | switch (action.layer_tap.code) { |
960 | case 0x00 ... 0xdf: | 960 | case KC_NO ... KC_RGUI: |
961 | case OP_TAP_TOGGLE: | 961 | case OP_TAP_TOGGLE: |
962 | case OP_ONESHOT: | 962 | case OP_ONESHOT: |
963 | return true; | 963 | return true; |
@@ -965,7 +965,7 @@ bool is_tap_action(action_t action) | |||
965 | return false; | 965 | return false; |
966 | case ACT_SWAP_HANDS: | 966 | case ACT_SWAP_HANDS: |
967 | switch (action.swap.code) { | 967 | switch (action.swap.code) { |
968 | case 0x00 ... 0xdf: | 968 | case KC_NO ... KC_RGUI: |
969 | case OP_SH_TAP_TOGGLE: | 969 | case OP_SH_TAP_TOGGLE: |
970 | return true; | 970 | return true; |
971 | } | 971 | } |
@@ -1014,6 +1014,7 @@ void debug_action(action_t action) | |||
1014 | case ACT_USAGE: dprint("ACT_USAGE"); break; | 1014 | case ACT_USAGE: dprint("ACT_USAGE"); break; |
1015 | case ACT_MOUSEKEY: dprint("ACT_MOUSEKEY"); break; | 1015 | case ACT_MOUSEKEY: dprint("ACT_MOUSEKEY"); break; |
1016 | case ACT_LAYER: dprint("ACT_LAYER"); break; | 1016 | case ACT_LAYER: dprint("ACT_LAYER"); break; |
1017 | case ACT_LAYER_MODS: dprint("ACT_LAYER_MODS"); break; | ||
1017 | case ACT_LAYER_TAP: dprint("ACT_LAYER_TAP"); break; | 1018 | case ACT_LAYER_TAP: dprint("ACT_LAYER_TAP"); break; |
1018 | case ACT_LAYER_TAP_EXT: dprint("ACT_LAYER_TAP_EXT"); break; | 1019 | case ACT_LAYER_TAP_EXT: dprint("ACT_LAYER_TAP_EXT"); break; |
1019 | case ACT_MACRO: dprint("ACT_MACRO"); break; | 1020 | case ACT_MACRO: dprint("ACT_MACRO"); break; |
diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h index d836b7a8a..5b5d0e566 100644 --- a/tmk_core/common/action_code.h +++ b/tmk_core/common/action_code.h | |||
@@ -66,7 +66,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
66 | * EBBBB: bits and extra bit | 66 | * EBBBB: bits and extra bit |
67 | * ee: on event(01:press, 10:release, 11:both) | 67 | * ee: on event(01:press, 10:release, 11:both) |
68 | * | 68 | * |
69 | * 1001|xxxx|xxxx xxxx (reserved) | 69 | * ACT_LAYER_MODS(1001): |
70 | * 1001|LLLL| mods Layer with modifiers held | ||
70 | * | 71 | * |
71 | * ACT_LAYER_TAP(101x): | 72 | * ACT_LAYER_TAP(101x): |
72 | * 101E|LLLL| keycode On/Off with tap key (0x00-DF)[TAP] | 73 | * 101E|LLLL| keycode On/Off with tap key (0x00-DF)[TAP] |
@@ -110,6 +111,7 @@ enum action_kind_id { | |||
110 | ACT_SWAP_HANDS = 0b0110, | 111 | ACT_SWAP_HANDS = 0b0110, |
111 | /* Layer Actions */ | 112 | /* Layer Actions */ |
112 | ACT_LAYER = 0b1000, | 113 | ACT_LAYER = 0b1000, |
114 | ACT_LAYER_MODS = 0b1001, | ||
113 | ACT_LAYER_TAP = 0b1010, /* Layer 0-15 */ | 115 | ACT_LAYER_TAP = 0b1010, /* Layer 0-15 */ |
114 | ACT_LAYER_TAP_EXT = 0b1011, /* Layer 16-31 */ | 116 | ACT_LAYER_TAP_EXT = 0b1011, /* Layer 16-31 */ |
115 | /* Extensions */ | 117 | /* Extensions */ |
@@ -153,6 +155,12 @@ typedef union { | |||
153 | uint8_t op :2; | 155 | uint8_t op :2; |
154 | uint8_t kind :4; | 156 | uint8_t kind :4; |
155 | } layer_bitop; | 157 | } layer_bitop; |
158 | struct action_layer_mods | ||
159 | { | ||
160 | uint8_t mods :8; | ||
161 | uint8_t layer :4; | ||
162 | uint8_t kind :4; | ||
163 | } layer_mods; | ||
156 | struct action_layer_tap { | 164 | struct action_layer_tap { |
157 | uint8_t code :8; | 165 | uint8_t code :8; |
158 | uint8_t val :5; | 166 | uint8_t val :5; |
@@ -261,8 +269,8 @@ enum layer_param_tap_op { | |||
261 | OP_SET_CLEAR, | 269 | OP_SET_CLEAR, |
262 | OP_ONESHOT, | 270 | OP_ONESHOT, |
263 | }; | 271 | }; |
264 | #define ACTION_LAYER_BITOP(op, part, bits, on) (ACT_LAYER<<12 | (op)<<10 | (on)<<8 | (part)<<5 | ((bits)&0x1f)) | 272 | #define ACTION_LAYER_BITOP(op, part, bits, on) ACTION(ACT_LAYER, (op)<<10 | (on)<<8 | (part)<<5 | ((bits)&0x1f)) |
265 | #define ACTION_LAYER_TAP(layer, key) (ACT_LAYER_TAP<<12 | (layer)<<8 | (key)) | 273 | #define ACTION_LAYER_TAP(layer, key) ACTION(ACT_LAYER_TAP, (layer)<<8 | (key)) |
266 | /* Default Layer */ | 274 | /* Default Layer */ |
267 | #define ACTION_DEFAULT_LAYER_SET(layer) ACTION_DEFAULT_LAYER_BIT_SET((layer)/4, 1<<((layer)%4)) | 275 | #define ACTION_DEFAULT_LAYER_SET(layer) ACTION_DEFAULT_LAYER_BIT_SET((layer)/4, 1<<((layer)%4)) |
268 | /* Layer Operation */ | 276 | /* Layer Operation */ |
@@ -277,7 +285,7 @@ enum layer_param_tap_op { | |||
277 | #define ACTION_LAYER_OFF_ON(layer) ACTION_LAYER_TAP((layer), OP_OFF_ON) | 285 | #define ACTION_LAYER_OFF_ON(layer) ACTION_LAYER_TAP((layer), OP_OFF_ON) |
278 | #define ACTION_LAYER_SET_CLEAR(layer) ACTION_LAYER_TAP((layer), OP_SET_CLEAR) | 286 | #define ACTION_LAYER_SET_CLEAR(layer) ACTION_LAYER_TAP((layer), OP_SET_CLEAR) |
279 | #define ACTION_LAYER_ONESHOT(layer) ACTION_LAYER_TAP((layer), OP_ONESHOT) | 287 | #define ACTION_LAYER_ONESHOT(layer) ACTION_LAYER_TAP((layer), OP_ONESHOT) |
280 | #define ACTION_LAYER_MODS(layer, mods) ACTION_LAYER_TAP((layer), 0xe0 | ((mods)&0x0f)) | 288 | #define ACTION_LAYER_MODS(layer, mods) ACTION(ACT_LAYER_MODS, (layer) << 8 | (mods)) |
281 | /* With Tapping */ | 289 | /* With Tapping */ |
282 | #define ACTION_LAYER_TAP_KEY(layer, key) ACTION_LAYER_TAP((layer), (key)) | 290 | #define ACTION_LAYER_TAP_KEY(layer, key) ACTION_LAYER_TAP((layer), (key)) |
283 | #define ACTION_LAYER_TAP_TOGGLE(layer) ACTION_LAYER_TAP((layer), OP_TAP_TOGGLE) | 291 | #define ACTION_LAYER_TAP_TOGGLE(layer) ACTION_LAYER_TAP((layer), OP_TAP_TOGGLE) |