#include "layer.h" #include "slot.h" #include "module.h" #include "key_states.h" #include "keymap.h" static bool heldLayers[LAYER_COUNT]; static switch_layer_mode_t pressedLayers[LAYER_COUNT]; void updateLayerStates(void) { memset(heldLayers, false, LAYER_COUNT); memset(pressedLayers, false, LAYER_COUNT); for (uint8_t slotId=0; slotIdcurrent) { key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId]; if (action.type == KeyActionType_SwitchLayer) { if (action.switchLayer.mode != SwitchLayerMode_Toggle) { heldLayers[action.switchLayer.layer] = true; } if (action.switchLayer.mode != SwitchLayerMode_Hold && !keyState->previous && keyState->current) { pressedLayers[action.switchLayer.layer] = action.switchLayer.mode; } } } } } } layer_id_t PreviousHeldLayer = LayerId_Base; layer_id_t ToggledLayer = LayerId_Base; layer_id_t GetActiveLayer() { updateLayerStates(); // Handle toggled layers for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) { if (pressedLayers[layerId]) { if (ToggledLayer == layerId) { ToggledLayer = LayerId_Base; break; } else if (ToggledLayer == LayerId_Base && pressedLayers[layerId] == SwitchLayerMode_Toggle) { ToggledLayer = layerId; break; } } } if (ToggledLayer != LayerId_Base) { return ToggledLayer; } // Handle held layers layer_id_t heldLayer = LayerId_Base; for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) { if (heldLayers[layerId]) { heldLayer = layerId; break; } } heldLayer = heldLayer != LayerId_Base && heldLayers[PreviousHeldLayer] ? PreviousHeldLayer : heldLayer; PreviousHeldLayer = heldLayer; return heldLayer; }