diff --git a/src/main.c b/src/main.c index 143653a..a5faac7 100644 --- a/src/main.c +++ b/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 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<