Handle layer toggle actions.

This commit is contained in:
László Monda
2017-11-03 18:29:17 +01:00
parent 05bbd28877
commit bbbecb8f87

View File

@@ -74,43 +74,75 @@ void processMouseAction(key_action_t action)
wasPreviousMouseActionWheelAction = isWheelAction; wasPreviousMouseActionWheelAction = isWheelAction;
} }
static bool pressedLayers[LAYER_COUNT]; static bool HeldLayers[LAYER_COUNT];
static bool PressedLayers[LAYER_COUNT];
void updatePressedLayers(void) void updateLayerStates(void)
{ {
memset(pressedLayers, false, LAYER_COUNT); memset(HeldLayers, false, LAYER_COUNT);
memset(PressedLayers, false, LAYER_COUNT);
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) { for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) { for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
if (KeyStates[slotId][keyId].current) { key_state_t *keyState = &KeyStates[slotId][keyId];
if (keyState->current) {
key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId]; key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId];
if (action.type == KeyActionType_SwitchLayer) { if (action.type == KeyActionType_SwitchLayer) {
pressedLayers[action.switchLayer.layer] = true; if (!action.switchLayer.isToggle) {
HeldLayers[action.switchLayer.layer] = true;
} else if (!keyState->previous && keyState->current) {
PressedLayers[action.switchLayer.layer] = true;
}
} }
} }
} }
} }
} }
static uint8_t PreviousLayer = LayerId_Base; static layer_id_t PreviousHeldLayer = LayerId_Base;
static layer_id_t PreviousToggledLayer = LayerId_Base;
layer_id_t getActiveLayer() layer_id_t getActiveLayer()
{ {
updatePressedLayers(); updateLayerStates();
layer_id_t activeLayer = LayerId_Base; // Handle toggled layers
layer_id_t toggledLayer = PreviousToggledLayer;
for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) { for (layer_id_t layerId=LayerId_Mod; layerId<=LayerId_Mouse; layerId++) {
if (pressedLayers[layerId]) { if (PressedLayers[layerId]) {
activeLayer = layerId; if (PreviousToggledLayer == layerId) {
toggledLayer = LayerId_Base;
break;
} else if (PreviousToggledLayer == LayerId_Base) {
toggledLayer = layerId;
break;
}
}
}
PreviousToggledLayer = toggledLayer;
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; break;
} }
} }
activeLayer = activeLayer != LayerId_Base && pressedLayers[PreviousLayer] ? PreviousLayer : activeLayer; heldLayer = heldLayer != LayerId_Base && HeldLayers[PreviousHeldLayer] ? PreviousHeldLayer : heldLayer;
PreviousLayer = activeLayer; PreviousHeldLayer = heldLayer;
return activeLayer; return heldLayer;
} }
void UpdateActiveUsbReports(void) void UpdateActiveUsbReports(void)
@@ -119,14 +151,14 @@ void UpdateActiveUsbReports(void)
uint8_t mediaScancodeIndex = 0; uint8_t mediaScancodeIndex = 0;
uint8_t systemScancodeIndex = 0; uint8_t systemScancodeIndex = 0;
layer_id_t activeLayer = getActiveLayer();
LedDisplay_SetLayer(activeLayer);
static uint8_t previousModifiers = 0;
for (uint8_t keyId=0; keyId < RIGHT_KEY_MATRIX_KEY_COUNT; keyId++) { for (uint8_t keyId=0; keyId < RIGHT_KEY_MATRIX_KEY_COUNT; keyId++) {
KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId]; KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId];
} }
layer_id_t activeLayer = getActiveLayer();
LedDisplay_SetLayer(activeLayer);
static uint8_t previousModifiers = 0;
if (MacroPlaying) { if (MacroPlaying) {
Macros_ContinueMacro(); Macros_ContinueMacro();
memcpy(&ActiveUsbMouseReport, &MacroMouseReport, sizeof MacroMouseReport); memcpy(&ActiveUsbMouseReport, &MacroMouseReport, sizeof MacroMouseReport);
@@ -136,11 +168,10 @@ void UpdateActiveUsbReports(void)
return; return;
} }
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) { for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) { for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
key_state_t keyState = KeyStates[slotId][keyId]; key_state_t *keyState = &KeyStates[slotId][keyId];
if (keyState.current) { if (keyState->current) {
key_action_t action = CurrentKeymap[activeLayer][slotId][keyId]; key_action_t action = CurrentKeymap[activeLayer][slotId][keyId];
switch (action.type) { switch (action.type) {
case KeyActionType_Keystroke: case KeyActionType_Keystroke:
@@ -175,14 +206,14 @@ void UpdateActiveUsbReports(void)
break; break;
} }
} }
keyState.previous = keyState.current; keyState->previous = keyState->current;
} }
} }
// When a layer switcher key gets pressed along with another key that produces some modifiers // When a layer switcher key gets pressed along with another key that produces some modifiers
// and the accomanying key gets released then keep the related modifiers active a long as the // and the accomanying key gets released then keep the related modifiers active a long as the
// layer switcher key stays pressed. Useful for Alt+Tab keymappings and the like. // layer switcher key stays pressed. Useful for Alt+Tab keymappings and the like.
if (activeLayer != LayerId_Base && activeLayer == PreviousLayer && basicScancodeIndex == 0) { if (activeLayer != LayerId_Base && activeLayer == PreviousHeldLayer && basicScancodeIndex == 0) {
ActiveUsbBasicKeyboardReport->modifiers |= previousModifiers; ActiveUsbBasicKeyboardReport->modifiers |= previousModifiers;
} }