Merge pull request #21 from algernon/f/layering

Layer handling simplified, and streamlined
This commit is contained in:
László Monda
2016-12-13 20:05:34 +01:00
committed by GitHub

View File

@@ -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;