aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfauxpark <fauxpark@gmail.com>2019-08-09 06:58:05 +1000
committerDrashna Jaelre <drashna@live.com>2019-08-08 13:58:05 -0700
commit2f6c068e0dd7abc3cec1bb72df0b1e96032246f8 (patch)
treeaa2adad462669cc0f048bf81cec331e28287df7b
parent2a534e87acfa8391d88dac6df02ae1a14da6c18e (diff)
downloadqmk_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.c25
-rw-r--r--tmk_core/common/action_code.h16
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)