aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/common/action_layer.c
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/common/action_layer.c')
-rw-r--r--tmk_core/common/action_layer.c234
1 files changed, 93 insertions, 141 deletions
diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c
index dfcbc110a..07d78c56d 100644
--- a/tmk_core/common/action_layer.c
+++ b/tmk_core/common/action_layer.c
@@ -5,12 +5,11 @@
5#include "action_layer.h" 5#include "action_layer.h"
6 6
7#ifdef DEBUG_ACTION 7#ifdef DEBUG_ACTION
8#include "debug.h" 8# include "debug.h"
9#else 9#else
10#include "nodebug.h" 10# include "nodebug.h"
11#endif 11#endif
12 12
13
14/** \brief Default Layer State 13/** \brief Default Layer State
15 */ 14 */
16layer_state_t default_layer_state = 0; 15layer_state_t default_layer_state = 0;
@@ -19,34 +18,30 @@ layer_state_t default_layer_state = 0;
19 * 18 *
20 * Run user code on default layer state change 19 * Run user code on default layer state change
21 */ 20 */
22__attribute__((weak)) 21__attribute__((weak)) layer_state_t default_layer_state_set_user(layer_state_t state) { return state; }
23layer_state_t default_layer_state_set_user(layer_state_t state) {
24 return state;
25}
26 22
27/** \brief Default Layer State Set At Keyboard Level 23/** \brief Default Layer State Set At Keyboard Level
28 * 24 *
29 * Run keyboard code on default layer state change 25 * Run keyboard code on default layer state change
30 */ 26 */
31__attribute__((weak)) 27__attribute__((weak)) layer_state_t default_layer_state_set_kb(layer_state_t state) { return default_layer_state_set_user(state); }
32layer_state_t default_layer_state_set_kb(layer_state_t state) {
33 return default_layer_state_set_user(state);
34}
35 28
36/** \brief Default Layer State Set 29/** \brief Default Layer State Set
37 * 30 *
38 * Static function to set the default layer state, prints debug info and clears keys 31 * Static function to set the default layer state, prints debug info and clears keys
39 */ 32 */
40static void default_layer_state_set(layer_state_t state) { 33static void default_layer_state_set(layer_state_t state) {
41 state = default_layer_state_set_kb(state); 34 state = default_layer_state_set_kb(state);
42 debug("default_layer_state: "); 35 debug("default_layer_state: ");
43 default_layer_debug(); debug(" to "); 36 default_layer_debug();
44 default_layer_state = state; 37 debug(" to ");
45 default_layer_debug(); debug("\n"); 38 default_layer_state = state;
39 default_layer_debug();
40 debug("\n");
46#ifdef STRICT_LAYER_RELEASE 41#ifdef STRICT_LAYER_RELEASE
47 clear_keyboard_but_mods(); // To avoid stuck keys 42 clear_keyboard_but_mods(); // To avoid stuck keys
48#else 43#else
49 clear_keyboard_but_mods_and_keys(); // Don't reset held keys 44 clear_keyboard_but_mods_and_keys(); // Don't reset held keys
50#endif 45#endif
51} 46}
52 47
@@ -54,43 +49,32 @@ static void default_layer_state_set(layer_state_t state) {
54 * 49 *
55 * Print out the hex value of the 32-bit default layer state, as well as the value of the highest bit. 50 * Print out the hex value of the 32-bit default layer state, as well as the value of the highest bit.
56 */ 51 */
57void default_layer_debug(void) { 52void default_layer_debug(void) { dprintf("%08lX(%u)", default_layer_state, biton32(default_layer_state)); }
58 dprintf("%08lX(%u)", default_layer_state, biton32(default_layer_state));
59}
60 53
61/** \brief Default Layer Set 54/** \brief Default Layer Set
62 * 55 *
63 * Sets the default layer state. 56 * Sets the default layer state.
64 */ 57 */
65void default_layer_set(layer_state_t state) { 58void default_layer_set(layer_state_t state) { default_layer_state_set(state); }
66 default_layer_state_set(state);
67}
68 59
69#ifndef NO_ACTION_LAYER 60#ifndef NO_ACTION_LAYER
70/** \brief Default Layer Or 61/** \brief Default Layer Or
71 * 62 *
72 * Turns on the default layer based on matching bits between specifed layer and existing layer state 63 * Turns on the default layer based on matching bits between specifed layer and existing layer state
73 */ 64 */
74void default_layer_or(layer_state_t state) { 65void default_layer_or(layer_state_t state) { default_layer_state_set(default_layer_state | state); }
75 default_layer_state_set(default_layer_state | state);
76}
77/** \brief Default Layer And 66/** \brief Default Layer And
78 * 67 *
79 * Turns on default layer based on matching enabled bits between specifed layer and existing layer state 68 * Turns on default layer based on matching enabled bits between specifed layer and existing layer state
80 */ 69 */
81void default_layer_and(layer_state_t state) { 70void default_layer_and(layer_state_t state) { default_layer_state_set(default_layer_state & state); }
82 default_layer_state_set(default_layer_state & state);
83}
84/** \brief Default Layer Xor 71/** \brief Default Layer Xor
85 * 72 *
86 * Turns on default layer based on non-matching bits between specifed layer and existing layer state 73 * Turns on default layer based on non-matching bits between specifed layer and existing layer state
87 */ 74 */
88void default_layer_xor(layer_state_t state) { 75void default_layer_xor(layer_state_t state) { default_layer_state_set(default_layer_state ^ state); }
89 default_layer_state_set(default_layer_state ^ state);
90}
91#endif 76#endif
92 77
93
94#ifndef NO_ACTION_LAYER 78#ifndef NO_ACTION_LAYER
95/** \brief Keymap Layer State 79/** \brief Keymap Layer State
96 */ 80 */
@@ -100,123 +84,101 @@ layer_state_t layer_state = 0;
100 * 84 *
101 * Runs user code on layer state change 85 * Runs user code on layer state change
102 */ 86 */
103__attribute__((weak)) 87__attribute__((weak)) layer_state_t layer_state_set_user(layer_state_t state) { return state; }
104layer_state_t layer_state_set_user(layer_state_t state) {
105 return state;
106}
107 88
108/** \brief Layer state set keyboard 89/** \brief Layer state set keyboard
109 * 90 *
110 * Runs keyboard code on layer state change 91 * Runs keyboard code on layer state change
111 */ 92 */
112__attribute__((weak)) 93__attribute__((weak)) layer_state_t layer_state_set_kb(layer_state_t state) { return layer_state_set_user(state); }
113layer_state_t layer_state_set_kb(layer_state_t state) {
114 return layer_state_set_user(state);
115}
116 94
117/** \brief Layer state set 95/** \brief Layer state set
118 * 96 *
119 * Sets the layer to match the specifed state (a bitmask) 97 * Sets the layer to match the specifed state (a bitmask)
120 */ 98 */
121void layer_state_set(layer_state_t state) { 99void layer_state_set(layer_state_t state) {
122 state = layer_state_set_kb(state); 100 state = layer_state_set_kb(state);
123 dprint("layer_state: "); 101 dprint("layer_state: ");
124 layer_debug(); dprint(" to "); 102 layer_debug();
125 layer_state = state; 103 dprint(" to ");
126 layer_debug(); dprintln(); 104 layer_state = state;
127#ifdef STRICT_LAYER_RELEASE 105 layer_debug();
128 clear_keyboard_but_mods(); // To avoid stuck keys 106 dprintln();
129#else 107# ifdef STRICT_LAYER_RELEASE
130 clear_keyboard_but_mods_and_keys(); // Don't reset held keys 108 clear_keyboard_but_mods(); // To avoid stuck keys
131#endif 109# else
110 clear_keyboard_but_mods_and_keys(); // Don't reset held keys
111# endif
132} 112}
133 113
134/** \brief Layer clear 114/** \brief Layer clear
135 * 115 *
136 * Turn off all layers 116 * Turn off all layers
137 */ 117 */
138void layer_clear(void) { 118void layer_clear(void) { layer_state_set(0); }
139 layer_state_set(0);
140}
141 119
142/** \brief Layer state is 120/** \brief Layer state is
143 * 121 *
144 * Return whether the given state is on (it might still be shadowed by a higher state, though) 122 * Return whether the given state is on (it might still be shadowed by a higher state, though)
145 */ 123 */
146bool layer_state_is(uint8_t layer) { 124bool layer_state_is(uint8_t layer) { return layer_state_cmp(layer_state, layer); }
147 return layer_state_cmp(layer_state, layer);
148}
149 125
150/** \brief Layer state compare 126/** \brief Layer state compare
151 * 127 *
152 * Used for comparing layers {mostly used for unit testing} 128 * Used for comparing layers {mostly used for unit testing}
153 */ 129 */
154bool layer_state_cmp(layer_state_t cmp_layer_state, uint8_t layer) { 130bool layer_state_cmp(layer_state_t cmp_layer_state, uint8_t layer) {
155 if (!cmp_layer_state) { return layer == 0; } 131 if (!cmp_layer_state) {
156 return (cmp_layer_state & (1UL<<layer)) != 0; 132 return layer == 0;
133 }
134 return (cmp_layer_state & (1UL << layer)) != 0;
157} 135}
158 136
159/** \brief Layer move 137/** \brief Layer move
160 * 138 *
161 * Turns on the given layer and turn off all other layers 139 * Turns on the given layer and turn off all other layers
162 */ 140 */
163void layer_move(uint8_t layer) { 141void layer_move(uint8_t layer) { layer_state_set(1UL << layer); }
164 layer_state_set(1UL<<layer);
165}
166 142
167/** \brief Layer on 143/** \brief Layer on
168 * 144 *
169 * Turns on given layer 145 * Turns on given layer
170 */ 146 */
171void layer_on(uint8_t layer) { 147void layer_on(uint8_t layer) { layer_state_set(layer_state | (1UL << layer)); }
172 layer_state_set(layer_state | (1UL<<layer));
173}
174 148
175/** \brief Layer off 149/** \brief Layer off
176 * 150 *
177 * Turns off given layer 151 * Turns off given layer
178 */ 152 */
179void layer_off(uint8_t layer) { 153void layer_off(uint8_t layer) { layer_state_set(layer_state & ~(1UL << layer)); }
180 layer_state_set(layer_state & ~(1UL<<layer));
181}
182 154
183/** \brief Layer invert 155/** \brief Layer invert
184 * 156 *
185 * 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)
186 */ 158 */
187void layer_invert(uint8_t layer) { 159void layer_invert(uint8_t layer) { layer_state_set(layer_state ^ (1UL << layer)); }
188 layer_state_set(layer_state ^ (1UL<<layer));
189}
190 160
191/** \brief Layer or 161/** \brief Layer or
192 * 162 *
193 * Turns on layers based on matching bits between specifed layer and existing layer state 163 * Turns on layers based on matching bits between specifed layer and existing layer state
194 */ 164 */
195void layer_or(layer_state_t state) { 165void layer_or(layer_state_t state) { layer_state_set(layer_state | state); }
196 layer_state_set(layer_state | state);
197}
198/** \brief Layer and 166/** \brief Layer and
199 * 167 *
200 * Turns on layers based on matching enabled bits between specifed layer and existing layer state 168 * Turns on layers based on matching enabled bits between specifed layer and existing layer state
201 */ 169 */
202void layer_and(layer_state_t state) { 170void layer_and(layer_state_t state) { layer_state_set(layer_state & state); }
203 layer_state_set(layer_state & state);
204}
205/** \brief Layer xor 171/** \brief Layer xor
206 * 172 *
207 * Turns on layers based on non-matching bits between specifed layer and existing layer state 173 * Turns on layers based on non-matching bits between specifed layer and existing layer state
208 */ 174 */
209void layer_xor(layer_state_t state) { 175void layer_xor(layer_state_t state) { layer_state_set(layer_state ^ state); }
210 layer_state_set(layer_state ^ state);
211}
212 176
213/** \brief Layer debug printing 177/** \brief Layer debug printing
214 * 178 *
215 * Print out the hex value of the 32-bit layer state, as well as the value of the highest bit. 179 * Print out the hex value of the 32-bit layer state, as well as the value of the highest bit.
216 */ 180 */
217void layer_debug(void) { 181void layer_debug(void) { dprintf("%08lX(%u)", layer_state, biton32(layer_state)); }
218 dprintf("%08lX(%u)", layer_state, biton32(layer_state));
219}
220#endif 182#endif
221 183
222#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) 184#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
@@ -230,16 +192,13 @@ uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS]
230 * Updates the cached keys when changing layers 192 * Updates the cached keys when changing layers
231 */ 193 */
232void update_source_layers_cache(keypos_t key, uint8_t layer) { 194void update_source_layers_cache(keypos_t key, uint8_t layer) {
233 const uint8_t key_number = key.col + (key.row * MATRIX_COLS); 195 const uint8_t key_number = key.col + (key.row * MATRIX_COLS);
234 const uint8_t storage_row = key_number / 8; 196 const uint8_t storage_row = key_number / 8;
235 const uint8_t storage_bit = key_number % 8; 197 const uint8_t storage_bit = key_number % 8;
236 198
237 for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) { 199 for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
238 source_layers_cache[storage_row][bit_number] ^= 200 source_layers_cache[storage_row][bit_number] ^= (-((layer & (1U << bit_number)) != 0) ^ source_layers_cache[storage_row][bit_number]) & (1U << storage_bit);
239 (-((layer & (1U << bit_number)) != 0) 201 }
240 ^ source_layers_cache[storage_row][bit_number])
241 & (1U << storage_bit);
242 }
243} 202}
244 203
245/** \brief read source layers cache 204/** \brief read source layers cache
@@ -247,19 +206,16 @@ void update_source_layers_cache(keypos_t key, uint8_t layer) {
247 * reads the cached keys stored when the layer was changed 206 * reads the cached keys stored when the layer was changed
248 */ 207 */
249uint8_t read_source_layers_cache(keypos_t key) { 208uint8_t read_source_layers_cache(keypos_t key) {
250 const uint8_t key_number = key.col + (key.row * MATRIX_COLS); 209 const uint8_t key_number = key.col + (key.row * MATRIX_COLS);
251 const uint8_t storage_row = key_number / 8; 210 const uint8_t storage_row = key_number / 8;
252 const uint8_t storage_bit = key_number % 8; 211 const uint8_t storage_bit = key_number % 8;
253 uint8_t layer = 0; 212 uint8_t layer = 0;
254 213
255 for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) { 214 for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
256 layer |= 215 layer |= ((source_layers_cache[storage_row][bit_number] & (1U << storage_bit)) != 0) << bit_number;
257 ((source_layers_cache[storage_row][bit_number] 216 }
258 & (1U << storage_bit)) != 0) 217
259 << bit_number; 218 return layer;
260 }
261
262 return layer;
263} 219}
264#endif 220#endif
265 221
@@ -272,49 +228,47 @@ uint8_t read_source_layers_cache(keypos_t key) {
272 */ 228 */
273action_t store_or_get_action(bool pressed, keypos_t key) { 229action_t store_or_get_action(bool pressed, keypos_t key) {
274#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) 230#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
275 if (disable_action_cache) { 231 if (disable_action_cache) {
276 return layer_switch_get_action(key); 232 return layer_switch_get_action(key);
277 } 233 }
278 234
279 uint8_t layer; 235 uint8_t layer;
280 236
281 if (pressed) { 237 if (pressed) {
282 layer = layer_switch_get_layer(key); 238 layer = layer_switch_get_layer(key);
283 update_source_layers_cache(key, layer); 239 update_source_layers_cache(key, layer);
284 } 240 } else {
285 else { 241 layer = read_source_layers_cache(key);
286 layer = read_source_layers_cache(key); 242 }
287 } 243 return action_for_key(layer, key);
288 return action_for_key(layer, key);
289#else 244#else
290 return layer_switch_get_action(key); 245 return layer_switch_get_action(key);
291#endif 246#endif
292} 247}
293 248
294
295/** \brief Layer switch get layer 249/** \brief Layer switch get layer
296 * 250 *
297 * Gets the layer based on key info 251 * Gets the layer based on key info
298 */ 252 */
299uint8_t layer_switch_get_layer(keypos_t key) { 253uint8_t layer_switch_get_layer(keypos_t key) {
300#ifndef NO_ACTION_LAYER 254#ifndef NO_ACTION_LAYER
301 action_t action; 255 action_t action;
302 action.code = ACTION_TRANSPARENT; 256 action.code = ACTION_TRANSPARENT;
303 257
304 layer_state_t layers = layer_state | default_layer_state; 258 layer_state_t layers = layer_state | default_layer_state;
305 /* check top layer first */ 259 /* check top layer first */
306 for (int8_t i = sizeof(layer_state_t) * 8 - 1; i >= 0; i--) { 260 for (int8_t i = sizeof(layer_state_t) * 8 - 1; i >= 0; i--) {
307 if (layers & (1UL << i)) { 261 if (layers & (1UL << i)) {
308 action = action_for_key(i, key); 262 action = action_for_key(i, key);
309 if (action.code != ACTION_TRANSPARENT) { 263 if (action.code != ACTION_TRANSPARENT) {
310 return i; 264 return i;
311 } 265 }
266 }
312 } 267 }
313 } 268 /* fall back to layer 0 */
314 /* fall back to layer 0 */ 269 return 0;
315 return 0;
316#else 270#else
317 return biton32(default_layer_state); 271 return biton32(default_layer_state);
318#endif 272#endif
319} 273}
320 274
@@ -322,6 +276,4 @@ uint8_t layer_switch_get_layer(keypos_t key) {
322 * 276 *
323 * Gets action code based on key position 277 * Gets action code based on key position
324 */ 278 */
325action_t layer_switch_get_action(keypos_t key) { 279action_t layer_switch_get_action(keypos_t key) { return action_for_key(layer_switch_get_layer(key), key); }
326 return action_for_key(layer_switch_get_layer(key), key);
327}