aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2021-07-03 00:19:52 -0700
committerGitHub <noreply@github.com>2021-07-03 00:19:52 -0700
commit8da8aabbe5796232c0f17f849badd455d42b0277 (patch)
tree7cec61a96672644bba25c97fc8a1a9dd8b75d58d
parent03807c2c6e470a3046c1ff40ac7ab74f76b94f74 (diff)
downloadqmk_firmware-8da8aabbe5796232c0f17f849badd455d42b0277.tar.gz
qmk_firmware-8da8aabbe5796232c0f17f849badd455d42b0277.zip
Improve layer mask handling (#13065)
-rw-r--r--quantum/command.c2
-rw-r--r--quantum/quantum.c8
-rw-r--r--tmk_core/common/action_layer.c12
-rw-r--r--tmk_core/common/action_layer.h29
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
782static void switch_default_layer(uint8_t layer) { 782static 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
347layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) { 347layer_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 */
141void layer_move(uint8_t layer) { layer_state_set(1UL << layer); } 141void 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 */
147void layer_on(uint8_t layer) { layer_state_set(layer_state | (1UL << layer)); } 147void 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 */
153void layer_off(uint8_t layer) { layer_state_set(layer_state & ~(1UL << layer)); } 153void 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 */
159void layer_invert(uint8_t layer) { layer_state_set(layer_state ^ (1UL << layer)); } 159void 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)
25typedef uint8_t layer_state_t; 48typedef 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)
39typedef uint32_t layer_state_t; 62typedef 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()