Layers: Fix the initial state of layer 0

When starting up, we correctly set the active layer counter to one, and the
active layer stack will therefore correctly contain layer 0 as an active layer.
However, we weren't setting the `layer_state_` bitmap up properly, and as such,
`Layer.isActive(0)` was returning false, despite the layer being active as far
as lookups were concerned.

To fix this, we explicitly flip the 0th bit on in the newly introduced
`Layer.setup()` method, where the initial keymap cache update was moved to, too.

Fixes #951.

Signed-off-by: Gergely Nagy <algernon@keyboard.io>
pull/952/head
Gergely Nagy 4 years ago
parent f32f845d97
commit 60b5b24bd6
No known key found for this signature in database
GPG Key ID: AC1E90BAC433F68F

@ -42,11 +42,7 @@ Runtime_::setup(void) {
device().setup(); device().setup();
// Update the keymap cache, so we start with a non-empty state. Layer.setup();
Layer.updateActiveLayers();
for (auto key_addr : KeyAddr::all()) {
Layer.updateLiveCompositeKeymap(key_addr);
}
} }
void void

@ -46,6 +46,17 @@ Key Layer_::live_composite_keymap_[Runtime.device().numKeys()];
uint8_t Layer_::active_layer_keymap_[Runtime.device().numKeys()]; uint8_t Layer_::active_layer_keymap_[Runtime.device().numKeys()];
Layer_::GetKeyFunction Layer_::getKey = &Layer_::getKeyFromPROGMEM; Layer_::GetKeyFunction Layer_::getKey = &Layer_::getKeyFromPROGMEM;
void Layer_::setup() {
// Explicitly set layer 0's state to 1
bitSet(layer_state_, 0);
// Update the keymap cache, so we start with a non-empty state.
Layer.updateActiveLayers();
for (auto key_addr : KeyAddr::all()) {
Layer.updateLiveCompositeKeymap(key_addr);
}
}
void Layer_::handleKeymapKeyswitchEvent(Key keymapEntry, uint8_t keyState) { void Layer_::handleKeymapKeyswitchEvent(Key keymapEntry, uint8_t keyState) {
if (keymapEntry.getKeyCode() >= LAYER_MOVE_OFFSET) { if (keymapEntry.getKeyCode() >= LAYER_MOVE_OFFSET) {
if (keyToggledOn(keyState)) { if (keyToggledOn(keyState)) {

@ -51,6 +51,8 @@ class Layer_ {
public: public:
Layer_() {} Layer_() {}
void setup();
/* There are two lookup functions, because we have two caches, and different /* There are two lookup functions, because we have two caches, and different
* parts of the firmware will want to use either this or that (or perhaps * parts of the firmware will want to use either this or that (or perhaps
* both, in rare cases). * both, in rare cases).

Loading…
Cancel
Save