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