]> git.gir.st - tmk_keyboard.git/blob - tmk_core/common/action_layer.c
remove led_layer_set crap
[tmk_keyboard.git] / tmk_core / common / action_layer.c
1 #include <stdint.h>
2 #include "keyboard.h"
3 #include "action.h"
4 #include "util.h"
5 #include "action_layer.h"
6 #include "led.h"
7 #include "hook.h"
8
9 #ifdef DEBUG_ACTION
10 #include "debug.h"
11 #else
12 #include "nodebug.h"
13 #endif
14
15
16 /*
17 * Default Layer State
18 */
19 uint32_t default_layer_state = 0;
20
21 static void default_layer_state_set(uint32_t state)
22 {
23 debug("default_layer_state: ");
24 default_layer_debug(); debug(" to ");
25 default_layer_state = state;
26 hook_default_layer_change(default_layer_state);
27 default_layer_debug(); debug("\n");
28 clear_keyboard_but_mods(); // To avoid stuck keys
29 }
30
31 void default_layer_debug(void)
32 {
33 dprintf("%08lX(%u)", default_layer_state, biton32(default_layer_state));
34 }
35
36 void default_layer_set(uint32_t state)
37 {
38 default_layer_state_set(state);
39 }
40
41 #ifndef NO_ACTION_LAYER
42 void default_layer_or(uint32_t state)
43 {
44 default_layer_state_set(default_layer_state | state);
45 }
46 void default_layer_and(uint32_t state)
47 {
48 default_layer_state_set(default_layer_state & state);
49 }
50 void default_layer_xor(uint32_t state)
51 {
52 default_layer_state_set(default_layer_state ^ state);
53 }
54 #endif
55
56
57 #ifndef NO_ACTION_LAYER
58 /*
59 * Keymap Layer State
60 */
61 uint32_t layer_state = 0;
62
63 static void layer_state_set(uint32_t state)
64 {
65 dprint("layer_state: ");
66 layer_debug(); dprint(" to ");
67 layer_state = state;
68 hook_layer_change(layer_state);
69 layer_debug(); dprintln();
70 clear_keyboard_but_mods(); // To avoid stuck keys
71 }
72
73 void layer_clear(void)
74 {
75 layer_state_set(0);
76 }
77
78 void layer_move(uint8_t layer)
79 {
80 layer_state_set(1UL<<layer);
81 }
82
83 void layer_on(uint8_t layer)
84 {
85 layer_state_set(layer_state | (1UL<<layer));
86 }
87
88 void layer_off(uint8_t layer)
89 {
90 layer_state_set(layer_state & ~(1UL<<layer));
91 }
92
93 void layer_invert(uint8_t layer)
94 {
95 layer_state_set(layer_state ^ (1UL<<layer));
96 }
97
98 void layer_or(uint32_t state)
99 {
100 layer_state_set(layer_state | state);
101 }
102 void layer_and(uint32_t state)
103 {
104 layer_state_set(layer_state & state);
105 }
106 void layer_xor(uint32_t state)
107 {
108 layer_state_set(layer_state ^ state);
109 }
110
111 void layer_debug(void)
112 {
113 dprintf("%08lX(%u)", layer_state, biton32(layer_state));
114 }
115 #endif
116
117
118
119 action_t layer_switch_get_action(keypos_t key)
120 {
121 action_t action = ACTION_TRANSPARENT;
122
123 #ifndef NO_ACTION_LAYER
124 uint32_t layers = layer_state | default_layer_state;
125 /* check top layer first */
126 for (int8_t i = 31; i >= 0; i--) {
127 if (layers & (1UL<<i)) {
128 action = action_for_key(i, key);
129 if (action.code != (action_t)ACTION_TRANSPARENT.code) {
130 return action;
131 }
132 }
133 }
134 /* fall back to layer 0 */
135 action = action_for_key(0, key);
136 return action;
137 #else
138 action = action_for_key(biton32(default_layer_state), key);
139 return action;
140 #endif
141 }
Imprint / Impressum