]>
git.gir.st - tmk_keyboard.git/blob - common/layer_stack.c
3 #include "layer_stack.h"
7 static uint8_t top_layer
= 0;
9 /* [0] always works as sentinel and not used for store.*/
10 static layer_item_t layer_stack
[LAYER_STACK_SIZE
] = {};
13 void layer_stack_clear(void)
15 for (uint8_t i
= 0; i
< LAYER_STACK_SIZE
; i
++) {
16 layer_stack
[i
] = (layer_item_t
){ .layer
= 0,
22 bool layer_stack_push(uint8_t layer
)
24 for (uint8_t i
= 1; i
< LAYER_STACK_SIZE
; i
++) {
25 if (!layer_stack
[i
].used
) {
26 layer_stack
[i
] = (layer_item_t
){ .layer
= layer
,
36 bool layer_stack_pop(void)
38 if (layer_stack
[top_layer
].used
) {
39 uint8_t popped
= top_layer
;
40 top_layer
= layer_stack
[popped
].next
;
41 layer_stack
[popped
] = (layer_item_t
){};
47 bool layer_stack_remove(uint8_t layer
)
49 if (layer_stack
[top_layer
].used
&& layer_stack
[top_layer
].layer
== layer
) {
51 debug("layer_stack_remove: top_layer\n");
55 for (uint8_t i
= top_layer
; layer_stack
[i
].used
; i
= layer_stack
[i
].next
) {
56 debug("layer_stack_remove: ["); debug_dec(i
); debug("]");
57 debug_dec(layer_stack
[i
].layer
); debug("\n");
58 uint8_t removed
= layer_stack
[i
].next
;
59 if (layer_stack
[removed
].used
&& layer_stack
[removed
].layer
== layer
) {
60 layer_stack
[i
].next
= layer_stack
[removed
].next
;
61 layer_stack
[removed
] = (layer_item_t
){};
62 debug("layer_stack_remove: removed.\n");
69 bool layer_stack_remove_then_push(uint8_t layer
)
71 layer_stack_remove(layer
);
72 return layer_stack_push(layer
);
75 bool layer_stack_remove_or_push(uint8_t layer
)
77 return (layer_stack_remove(layer
)) || layer_stack_push(layer
);
80 void layer_stack_debug(void)
82 debug("layer_stack: ");
83 layer_item_t item
= layer_stack
[top_layer
];
85 debug_dec(item
.layer
);
86 debug("["); debug_dec(item
.next
); debug("] ");
87 item
= layer_stack
[item
.next
];
92 action_t
layer_stack_get_action(key_t key
)
95 action
.code
= ACTION_TRANSPARENT
;
98 for (layer_item_t i
= layer_stack
[top_layer
]; i
.used
; i
= layer_stack
[i
.next
]) {
99 action
= action_for_key(i
.layer
, key
);
100 if (action
.code
!= ACTION_TRANSPARENT
) {
102 debug("layer_stack: used. "); debug_dec(i
.layer
); debug("\n");
105 debug("layer_stack: through. "); debug_dec(i
.layer
); debug("\n");