Merge pull request #21 from algernon/f/layering
Layer handling simplified, and streamlined
This commit is contained in:
@@ -1,21 +1,22 @@
|
|||||||
#include "keyboard_layout.h"
|
#include "keyboard_layout.h"
|
||||||
#include "led_driver.h"
|
#include "led_driver.h"
|
||||||
|
#include "layer.h"
|
||||||
|
|
||||||
static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
|
static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
|
||||||
static uint8_t modifierState = 0;
|
|
||||||
|
|
||||||
|
static uint8_t ActiveLayer = LAYER_ID_BASE;
|
||||||
uint8_t prevKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
|
uint8_t prevKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
|
||||||
|
|
||||||
static inline __attribute__((always_inline)) uhk_key_t getKeycode(uint8_t slotId, uint8_t keyId)
|
static inline __attribute__((always_inline)) uhk_key_t getKeycode(uint8_t slotId, uint8_t keyId)
|
||||||
{
|
{
|
||||||
if (keyId < MAX_KEY_COUNT_PER_MODULE) {
|
if (keyId < MAX_KEY_COUNT_PER_MODULE) {
|
||||||
if (keyMasks[slotId][keyId]!=0 && keyMasks[slotId][keyId]!=modifierState) {
|
if (keyMasks[slotId][keyId]!=0 && keyMasks[slotId][keyId]!=ActiveLayer) {
|
||||||
// Mask out key presses after releasing modifier keys
|
// Mask out key presses after releasing modifier keys
|
||||||
return (uhk_key_t){.type = UHK_KEY_NONE};
|
return (uhk_key_t){.type = UHK_KEY_NONE};
|
||||||
}
|
}
|
||||||
|
|
||||||
uhk_key_t k = CurrentKeymap[modifierState][slotId][keyId];
|
uhk_key_t k = CurrentKeymap[ActiveLayer][slotId][keyId];
|
||||||
keyMasks[slotId][keyId] = modifierState;
|
keyMasks[slotId][keyId] = ActiveLayer;
|
||||||
|
|
||||||
return k;
|
return k;
|
||||||
} else {
|
} else {
|
||||||
@@ -55,16 +56,6 @@ bool pressKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool layerOn(uhk_key_t key) {
|
|
||||||
modifierState |= (1 << (key.layer.target - 1));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool layerOff(uhk_key_t key) {
|
|
||||||
modifierState &= ~(1 << (key.layer.target - 1));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool key_toggled_on(const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) {
|
bool key_toggled_on(const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) {
|
||||||
return (!prevKeyStates[keyId]) && currKeyStates[keyId];
|
return (!prevKeyStates[keyId]) && currKeyStates[keyId];
|
||||||
}
|
}
|
||||||
@@ -86,11 +77,12 @@ bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, co
|
|||||||
break;
|
break;
|
||||||
case UHK_KEY_LAYER:
|
case UHK_KEY_LAYER:
|
||||||
if (key_toggled_on(prevKeyStates, currKeyStates, keyId)) {
|
if (key_toggled_on(prevKeyStates, currKeyStates, keyId)) {
|
||||||
return layerOn(key);
|
ActiveLayer = key.layer.target;
|
||||||
}
|
}
|
||||||
if (key_toggled_off(prevKeyStates, currKeyStates, keyId)) {
|
if (key_toggled_off(prevKeyStates, currKeyStates, keyId)) {
|
||||||
return layerOff(key);
|
ActiveLayer = LAYER_ID_BASE;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user