diff options
author | Drashna Jaelre <drashna@live.com> | 2021-07-03 00:19:52 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-03 00:19:52 -0700 |
commit | 8da8aabbe5796232c0f17f849badd455d42b0277 (patch) | |
tree | 7cec61a96672644bba25c97fc8a1a9dd8b75d58d | |
parent | 03807c2c6e470a3046c1ff40ac7ab74f76b94f74 (diff) | |
download | qmk_firmware-8da8aabbe5796232c0f17f849badd455d42b0277.tar.gz qmk_firmware-8da8aabbe5796232c0f17f849badd455d42b0277.zip |
Improve layer mask handling (#13065)
-rw-r--r-- | quantum/command.c | 2 | ||||
-rw-r--r-- | quantum/quantum.c | 8 | ||||
-rw-r--r-- | tmk_core/common/action_layer.c | 12 | ||||
-rw-r--r-- | tmk_core/common/action_layer.h | 29 |
4 files changed, 38 insertions, 13 deletions
diff --git a/quantum/command.c b/quantum/command.c index 34c4b36b1..3a7dc0f8c 100644 --- a/quantum/command.c +++ b/quantum/command.c | |||
@@ -781,6 +781,6 @@ uint8_t numkey2num(uint8_t code) { | |||
781 | 781 | ||
782 | static void switch_default_layer(uint8_t layer) { | 782 | static void switch_default_layer(uint8_t layer) { |
783 | xprintf("L%d\n", layer); | 783 | xprintf("L%d\n", layer); |
784 | default_layer_set(1UL << layer); | 784 | default_layer_set((layer_state_t)1 << layer); |
785 | clear_keyboard(); | 785 | clear_keyboard(); |
786 | } | 786 | } |
diff --git a/quantum/quantum.c b/quantum/quantum.c index 8ccdb774b..b4cfa28d7 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c | |||
@@ -340,13 +340,13 @@ void set_single_persistent_default_layer(uint8_t default_layer) { | |||
340 | #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS) | 340 | #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS) |
341 | PLAY_SONG(default_layer_songs[default_layer]); | 341 | PLAY_SONG(default_layer_songs[default_layer]); |
342 | #endif | 342 | #endif |
343 | eeconfig_update_default_layer(1U << default_layer); | 343 | eeconfig_update_default_layer((layer_state_t)1 << default_layer); |
344 | default_layer_set(1U << default_layer); | 344 | default_layer_set((layer_state_t)1 << default_layer); |
345 | } | 345 | } |
346 | 346 | ||
347 | layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) { | 347 | layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) { |
348 | layer_state_t mask12 = (1UL << layer1) | (1UL << layer2); | 348 | layer_state_t mask12 = ((layer_state_t)1 << layer1) | ((layer_state_t)1 << layer2); |
349 | layer_state_t mask3 = 1UL << layer3; | 349 | layer_state_t mask3 = (layer_state_t)1 << layer3; |
350 | return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3); | 350 | return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3); |
351 | } | 351 | } |
352 | 352 | ||
diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index af2d7d964..ed1a4bd20 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c | |||
@@ -131,32 +131,32 @@ bool layer_state_cmp(layer_state_t cmp_layer_state, uint8_t layer) { | |||
131 | if (!cmp_layer_state) { | 131 | if (!cmp_layer_state) { |
132 | return layer == 0; | 132 | return layer == 0; |
133 | } | 133 | } |
134 | return (cmp_layer_state & (1UL << layer)) != 0; | 134 | return (cmp_layer_state & ((layer_state_t)1 << layer)) != 0; |
135 | } | 135 | } |
136 | 136 | ||
137 | /** \brief Layer move | 137 | /** \brief Layer move |
138 | * | 138 | * |
139 | * Turns on the given layer and turn off all other layers | 139 | * Turns on the given layer and turn off all other layers |
140 | */ | 140 | */ |
141 | void layer_move(uint8_t layer) { layer_state_set(1UL << layer); } | 141 | void layer_move(uint8_t layer) { layer_state_set((layer_state_t)1 << layer); } |
142 | 142 | ||
143 | /** \brief Layer on | 143 | /** \brief Layer on |
144 | * | 144 | * |
145 | * Turns on given layer | 145 | * Turns on given layer |
146 | */ | 146 | */ |
147 | void layer_on(uint8_t layer) { layer_state_set(layer_state | (1UL << layer)); } | 147 | void layer_on(uint8_t layer) { layer_state_set(layer_state | ((layer_state_t)1 << layer)); } |
148 | 148 | ||
149 | /** \brief Layer off | 149 | /** \brief Layer off |
150 | * | 150 | * |
151 | * Turns off given layer | 151 | * Turns off given layer |
152 | */ | 152 | */ |
153 | void layer_off(uint8_t layer) { layer_state_set(layer_state & ~(1UL << layer)); } | 153 | void layer_off(uint8_t layer) { layer_state_set(layer_state & ~((layer_state_t)1 << layer)); } |
154 | 154 | ||
155 | /** \brief Layer invert | 155 | /** \brief Layer invert |
156 | * | 156 | * |
157 | * Toggle the given layer (set it if it's unset, or unset it if it's set) | 157 | * Toggle the given layer (set it if it's unset, or unset it if it's set) |
158 | */ | 158 | */ |
159 | void layer_invert(uint8_t layer) { layer_state_set(layer_state ^ (1UL << layer)); } | 159 | void layer_invert(uint8_t layer) { layer_state_set(layer_state ^ ((layer_state_t)1 << layer)); } |
160 | 160 | ||
161 | /** \brief Layer or | 161 | /** \brief Layer or |
162 | * | 162 | * |
@@ -258,7 +258,7 @@ uint8_t layer_switch_get_layer(keypos_t key) { | |||
258 | layer_state_t layers = layer_state | default_layer_state; | 258 | layer_state_t layers = layer_state | default_layer_state; |
259 | /* check top layer first */ | 259 | /* check top layer first */ |
260 | for (int8_t i = MAX_LAYER - 1; i >= 0; i--) { | 260 | for (int8_t i = MAX_LAYER - 1; i >= 0; i--) { |
261 | if (layers & (1UL << i)) { | 261 | if (layers & ((layer_state_t)1 << i)) { |
262 | action = action_for_key(i, key); | 262 | action = action_for_key(i, key); |
263 | if (action.code != ACTION_TRANSPARENT) { | 263 | if (action.code != ACTION_TRANSPARENT) { |
264 | return i; | 264 | return i; |
diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index d72cd3e3a..b87d096ee 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h | |||
@@ -21,6 +21,29 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
21 | #include "keyboard.h" | 21 | #include "keyboard.h" |
22 | #include "action.h" | 22 | #include "action.h" |
23 | 23 | ||
24 | #ifdef DYNAMIC_KEYMAP_ENABLE | ||
25 | # ifndef DYNAMIC_KEYMAP_LAYER_COUNT | ||
26 | # define DYNAMIC_KEYMAP_LAYER_COUNT 4 | ||
27 | # endif | ||
28 | # if DYNAMIC_KEYMAP_LAYER_COUNT <= 8 | ||
29 | # ifndef LAYER_STATE_8BIT | ||
30 | # define LAYER_STATE_8BIT | ||
31 | # endif | ||
32 | # elif DYNAMIC_KEYMAP_LAYER_COUNT <= 16 | ||
33 | # ifndef LAYER_STATE_16BIT | ||
34 | # define LAYER_STATE_16BIT | ||
35 | # endif | ||
36 | # else | ||
37 | # ifndef LAYER_STATE_32BIT | ||
38 | # define LAYER_STATE_32BIT | ||
39 | # endif | ||
40 | # endif | ||
41 | #endif | ||
42 | |||
43 | #if !defined(LAYER_STATE_8BIT) && !defined(LAYER_STATE_16BIT) && !defined(LAYER_STATE_32BIT) | ||
44 | # define LAYER_STATE_32BIT | ||
45 | #endif | ||
46 | |||
24 | #if defined(LAYER_STATE_8BIT) | 47 | #if defined(LAYER_STATE_8BIT) |
25 | typedef uint8_t layer_state_t; | 48 | typedef uint8_t layer_state_t; |
26 | # define MAX_LAYER_BITS 3 | 49 | # define MAX_LAYER_BITS 3 |
@@ -35,13 +58,15 @@ typedef uint16_t layer_state_t; | |||
35 | # define MAX_LAYER 16 | 58 | # define MAX_LAYER 16 |
36 | # endif | 59 | # endif |
37 | # define get_highest_layer(state) biton16(state) | 60 | # define get_highest_layer(state) biton16(state) |
38 | #else | 61 | #elif defined(LAYER_STATE_32BIT) |
39 | typedef uint32_t layer_state_t; | 62 | typedef uint32_t layer_state_t; |
40 | # define MAX_LAYER_BITS 5 | 63 | # define MAX_LAYER_BITS 5 |
41 | # ifndef MAX_LAYER | 64 | # ifndef MAX_LAYER |
42 | # define MAX_LAYER 32 | 65 | # define MAX_LAYER 32 |
43 | # endif | 66 | # endif |
44 | # define get_highest_layer(state) biton32(state) | 67 | # define get_highest_layer(state) biton32(state) |
68 | #else | ||
69 | # error Layer Mask size not specified. HOW?! | ||
45 | #endif | 70 | #endif |
46 | 71 | ||
47 | /* | 72 | /* |
@@ -92,7 +117,7 @@ layer_state_t layer_state_set_kb(layer_state_t state); | |||
92 | 117 | ||
93 | # define layer_state_set(layer) | 118 | # define layer_state_set(layer) |
94 | # define layer_state_is(layer) (layer == 0) | 119 | # define layer_state_is(layer) (layer == 0) |
95 | # define layer_state_cmp(state, layer) (state == 0 ? layer == 0 : (state & 1UL << layer) != 0) | 120 | # define layer_state_cmp(state, layer) (state == 0 ? layer == 0 : (state & (layer_state_t)1 << layer) != 0) |
96 | 121 | ||
97 | # define layer_debug() | 122 | # define layer_debug() |
98 | # define layer_clear() | 123 | # define layer_clear() |