aboutsummaryrefslogtreecommitdiff
path: root/common/layer_switch.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/layer_switch.c')
-rw-r--r--common/layer_switch.c122
1 files changed, 67 insertions, 55 deletions
diff --git a/common/layer_switch.c b/common/layer_switch.c
index 359e6b9d8..9905741f4 100644
--- a/common/layer_switch.c
+++ b/common/layer_switch.c
@@ -7,94 +7,103 @@
7 7
8 8
9/* 9/*
10 * Default Layer (0-15) 10 * Default Layer State
11 */ 11 */
12uint8_t default_layer = 0; 12uint32_t default_layer_state = 0;
13 13
14void default_layer_set(uint8_t layer) 14static void default_layer_state_set(uint32_t state)
15{ 15{
16 debug("default_layer_set: "); 16 debug("default_layer_state: ");
17 debug_dec(default_layer); debug(" to "); 17 default_layer_debug(); debug(" to ");
18 18 default_layer_state = state;
19 default_layer = layer; 19 default_layer_debug(); debug("\n");
20
21 debug_dec(default_layer); debug("\n");
22
23 clear_keyboard_but_mods(); // To avoid stuck keys 20 clear_keyboard_but_mods(); // To avoid stuck keys
24} 21}
25 22
26 23void default_layer_debug(void)
27#ifndef NO_ACTION_LAYER
28/*
29 * Keymap Layer (0-15)
30 */
31uint16_t keymap_stat = 0;
32
33/* return highest layer whose state is on */
34uint8_t keymap_get_layer(void)
35{ 24{
36 return biton16(keymap_stat); 25 debug_hex32(default_layer_state);
26 debug("("); debug_dec(biton32(default_layer_state)); debug(")");
37} 27}
38 28
39static void keymap_stat_set(uint16_t stat) 29void default_layer_set(uint8_t layer)
40{ 30{
41 debug("keymap: "); 31 default_layer_state_set(1UL<<layer);
42 keymap_debug(); debug(" to "); 32}
43 33
44 keymap_stat = stat; 34#ifndef NO_ACTION_LAYER
35void default_layer_or(uint32_t state)
36{
37 default_layer_state_set(default_layer_state | state);
38}
39void default_layer_and(uint32_t state)
40{
41 default_layer_state_set(default_layer_state & state);
42}
43void default_layer_xor(uint32_t state)
44{
45 default_layer_state_set(default_layer_state ^ state);
46}
47#endif
45 48
46 keymap_debug(); debug("\n");
47 49
48 clear_keyboard_but_mods(); // To avoid stuck keys 50#ifndef NO_ACTION_LAYER
49} 51/*
52 * Keymap Layer State
53 */
54uint32_t layer_state = 0;
50 55
51void keymap_clear(void) 56static void layer_state_set(uint32_t state)
52{ 57{
53 keymap_stat_set(0); 58 debug("layer_state: ");
59 layer_debug(); debug(" to ");
60 layer_state = state;
61 layer_debug(); debug("\n");
62 clear_keyboard_but_mods(); // To avoid stuck keys
54} 63}
55 64
56 65void layer_clear(void)
57void keymap_set(uint16_t stat)
58{ 66{
59 keymap_stat_set(stat); 67 layer_state_set(0);
60} 68}
61 69
62void keymap_move(uint8_t layer) 70void layer_move(uint8_t layer)
63{ 71{
64 keymap_stat_set(1<<layer); 72 layer_state_set(1UL<<layer);
65} 73}
66 74
67void keymap_on(uint8_t layer) 75void layer_on(uint8_t layer)
68{ 76{
69 keymap_stat_set(keymap_stat | (1<<layer)); 77 layer_state_set(layer_state | (1UL<<layer));
70} 78}
71 79
72void keymap_off(uint8_t layer) 80void layer_off(uint8_t layer)
73{ 81{
74 keymap_stat_set(keymap_stat & ~(1<<layer)); 82 layer_state_set(layer_state & ~(1UL<<layer));
75} 83}
76 84
77void keymap_invert(uint8_t layer) 85void layer_invert(uint8_t layer)
78{ 86{
79 keymap_stat_set(keymap_stat ^ (1<<layer)); 87 layer_state_set(layer_state ^ (1UL<<layer));
80} 88}
81 89
82void keymap_or(uint16_t stat) 90void layer_or(uint32_t state)
83{ 91{
84 keymap_stat_set(keymap_stat | stat); 92 layer_state_set(layer_state | state);
85} 93}
86void keymap_and(uint16_t stat) 94void layer_and(uint32_t state)
87{ 95{
88 keymap_stat_set(keymap_stat & stat); 96 layer_state_set(layer_state & state);
89} 97}
90void keymap_xor(uint16_t stat) 98void layer_xor(uint32_t state)
91{ 99{
92 keymap_stat_set(keymap_stat ^ stat); 100 layer_state_set(layer_state ^ state);
93} 101}
94 102
95void keymap_debug(void) 103void layer_debug(void)
96{ 104{
97 debug_hex16(keymap_stat); debug("("); debug_dec(keymap_get_layer()); debug(")"); 105 debug_hex32(layer_state);
106 debug("("); debug_dec(biton32(layer_state)); debug(")");
98} 107}
99#endif 108#endif
100 109
@@ -106,18 +115,21 @@ action_t layer_switch_get_action(key_t key)
106 action.code = ACTION_TRANSPARENT; 115 action.code = ACTION_TRANSPARENT;
107 116
108#ifndef NO_ACTION_LAYER 117#ifndef NO_ACTION_LAYER
109 /* keymap: top layer first */ 118 uint32_t layers = layer_state | default_layer_state;
110 for (int8_t i = 15; i >= 0; i--) { 119 /* check top layer first */
111 if (keymap_stat & (1<<i)) { 120 for (int8_t i = 31; i >= 0; i--) {
121 if (layers & (1UL<<i)) {
112 action = action_for_key(i, key); 122 action = action_for_key(i, key);
113 if (action.code != ACTION_TRANSPARENT) { 123 if (action.code != ACTION_TRANSPARENT) {
114 return action; 124 return action;
115 } 125 }
116 } 126 }
117 } 127 }
118#endif 128 /* fall back to layer 0 */
119 129 action = action_for_key(0, key);
120 /* default layer */ 130 return action;
121 action = action_for_key(default_layer, key); 131#else
132 action = action_for_key(biton32(default_layer_state), key);
122 return action; 133 return action;
134#endif
123} 135}