prep for better layers
parent
2f2cac7dff
commit
6534334973
45
src/main.c
45
src/main.c
|
@ -24,8 +24,6 @@
|
|||
// types and forward declarations
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
#define array_length(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
typedef int8_t i8;
|
||||
typedef uint8_t u8;
|
||||
typedef uint16_t u16;
|
||||
|
@ -44,11 +42,15 @@ typedef void (*keyfunc)(keycode, bool);
|
|||
|
||||
#include "./keyboard/layout.c"
|
||||
// defines:
|
||||
// #define KB_Layers #{Layers.size}
|
||||
// #define KB_LAYERS #{Layers.size}
|
||||
// static const keycode PROGMEM _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS];
|
||||
// static const keyfunc PROGMEM _kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS];
|
||||
// static const keyfunc PROGMEM _kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS];
|
||||
|
||||
#if KB_LAYERS > 8
|
||||
#error can only handle 8 layers for now
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// globals
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -63,6 +65,7 @@ static layer layers_pressed[KB_ROWS][KB_COLUMNS];
|
|||
|
||||
static i8 layers_active[KB_LAYERS];
|
||||
static layer layers_top;
|
||||
static u8 layers_state;
|
||||
|
||||
static bool layer_sticky_on;
|
||||
static bool layer_sticky[KB_LAYERS];
|
||||
|
@ -80,6 +83,24 @@ static const keyfunc _kb_layer_funcs[] = {
|
|||
&kbfun_win_layer_press_release,
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// utilities
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#define array_length(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
#define set_bit(x, i) (x) |= (1u << (i))
|
||||
#define unset_bit(x, i) (x) &= ~(1u << (i))
|
||||
#define toggle_bit(x, i) (x) ^= (1u << (i))
|
||||
#define is_set(x, i) (((x) >> (i)) & 1u)
|
||||
#define is_unset(x, i) !is_set((x), (i))
|
||||
|
||||
#define set_layer(x, layer) set_bit((x), (layer) - 1)
|
||||
#define unset_layer(x, layer) unset_bit((x), (layer) - 1)
|
||||
#define toggle_layer(x, layer) toggle_bit((x), (layer) - 1)
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// main
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
int main() {
|
||||
|
@ -93,8 +114,6 @@ int main() {
|
|||
return 0;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
|
||||
void main_key_loop() {
|
||||
for (;;) {
|
||||
// swap `kb_is_pressed` and `kb_was_pressed`, then update
|
||||
|
@ -182,6 +201,7 @@ void init_layers() {
|
|||
}
|
||||
layers_active[0] = 1;
|
||||
layers_top = 0;
|
||||
layers_state = 1;
|
||||
|
||||
for (u8 row=0; row<KB_ROWS; row++) {
|
||||
for (u8 col=0; col<KB_COLUMNS; col++) {
|
||||
|
@ -198,6 +218,7 @@ void init_layers() {
|
|||
layer highest_active_layer() {
|
||||
for (layer l = KB_LAYERS - 1; l > 0; l--) {
|
||||
if (layers_active[l] > 0) { return l; }
|
||||
/* if (is_set(layers_state, l)) { return l; } */
|
||||
}
|
||||
|
||||
// the base layer is always active
|
||||
|
@ -209,6 +230,7 @@ void layer_enable(layer l) {
|
|||
if (l >= KB_LAYERS || l == 0) { return; }
|
||||
|
||||
layers_active[l] += 1;
|
||||
set_layer(layers_state, l);
|
||||
|
||||
if (l > layers_top) {
|
||||
layers_top = l;
|
||||
|
@ -223,6 +245,9 @@ void layer_disable(layer l) {
|
|||
if (layers_active[l] > 0) {
|
||||
layers_active[l] -= 1;
|
||||
}
|
||||
if (layers_active[l] == 0) {
|
||||
unset_layer(layers_state, l);
|
||||
}
|
||||
|
||||
if (l == layers_top) {
|
||||
layers_top = highest_active_layer();
|
||||
|
@ -305,9 +330,9 @@ void _kbfun_mediakey_press_release(keycode key, bool is_pressed) {
|
|||
|
||||
void _kbfun_modifier_press_release(keycode key, bool is_pressed) {
|
||||
if (is_pressed) {
|
||||
keyboard_modifier_keys |= (1<<key);
|
||||
set_bit(keyboard_modifier_keys, key);
|
||||
} else {
|
||||
keyboard_modifier_keys &= ~(1<<key);
|
||||
unset_bit(keyboard_modifier_keys, key);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -326,7 +351,7 @@ bool _kbfun_mediakey_is_pressed(keycode key) {
|
|||
}
|
||||
|
||||
bool _kbfun_modifier_is_pressed(keycode key) {
|
||||
return (keyboard_modifier_keys & (1<<key));
|
||||
return is_set(keyboard_modifier_keys, key);
|
||||
}
|
||||
|
||||
void _kbfun_normal_sticky_done() {
|
||||
|
@ -411,8 +436,8 @@ void kbfun_modifier_sticky(keycode key, bool is_pressed) {
|
|||
if (mod_sticky_done) {
|
||||
kbfun_modifier_press_release(key, false);
|
||||
} else {
|
||||
mod_sticky |= 1<<mod;
|
||||
mod_sticky_done = false;
|
||||
set_bit(mod_sticky, mod);
|
||||
mod_sticky_done = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue