Previously, we used index-ordering for layers, meaning, we looked keys up based on the index of active layers. This turned out to be confusing, and in many cases, limiting, since we couldn't easily shift to a lower layer from a higher one. As such, index-ordering required careful planning of one's layers, and a deeper understanding of the system. This patch switches us to activation-ordering: the layer subsystem now keeps track of the order in which layers are activated, and uses that order to look keys up, instead of the index of layers. This makes it easier to understand how the system works, and allows us to shift to lower layers too. It does require a bit more resources, since we can't just store a bitmap of active layers, but need 32 bytes to store the order. We still keep the bitmap, to make `Layer.isActive()` fast: looking up a bit in the bitmap is more efficient than walking the active layer array, and this function is often used in cases where speed matters. As a side effect of the switch, a number of methods were deprecated, and similar ones with more appropriate names were introduced. See the updated `UPGRADING.md` document for more details. Plugins that used the deprecated methods were updated to use the new ones. Fixes #857. Signed-off-by: Gergely Nagy <algernon@keyboard.io>pull/867/head
parent
78b32f6b80
commit
ab3b661cd5
@ -0,0 +1,104 @@
|
||||
/* -*- mode: c++ -*-
|
||||
* Kaleidoscope - Firmware for computer input devices
|
||||
* Copyright (C) 2020 Keyboard.io, Inc.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License as published by the Free Software
|
||||
* Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <Kaleidoscope.h>
|
||||
#include <Kaleidoscope-FocusSerial.h>
|
||||
#include <Kaleidoscope-MouseKeys.h>
|
||||
|
||||
enum { PRIMARY, NUMPAD, FUNCTION }; // layers
|
||||
|
||||
// *INDENT-OFF*
|
||||
KEYMAPS(
|
||||
[PRIMARY] = KEYMAP_STACKED
|
||||
(___, Key_1, Key_2, Key_3, Key_4, Key_5, XXX,
|
||||
Key_Backtick, Key_Q, Key_W, Key_E, Key_R, Key_T, Key_Tab,
|
||||
Key_PageUp, Key_A, Key_S, Key_D, Key_F, Key_G,
|
||||
Key_PageDown, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Escape,
|
||||
Key_LeftControl, Key_Backspace, Key_LeftGui, Key_LeftShift,
|
||||
ShiftToLayer(FUNCTION),
|
||||
|
||||
XXX, Key_6, Key_7, Key_8, Key_9, Key_0, LockLayer(NUMPAD),
|
||||
Key_Enter, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_Equals,
|
||||
Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote,
|
||||
Key_RightAlt, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus,
|
||||
Key_RightShift, Key_LeftAlt, Key_Spacebar, Key_RightControl,
|
||||
ShiftToLayer(FUNCTION)),
|
||||
|
||||
[NUMPAD] = KEYMAP_STACKED
|
||||
(___, ___, ___, ___, ___, ___, ___,
|
||||
___, ___, ___, ___, ___, ___, ___,
|
||||
___, ___, ___, ___, ___, ___,
|
||||
___, ___, ___, ___, ___, ___, ___,
|
||||
___, ___, ___, ___,
|
||||
___,
|
||||
|
||||
XXX, ___, Key_7, Key_8, Key_9, Key_KeypadSubtract, ___,
|
||||
___, ___, Key_4, Key_5, Key_6, Key_KeypadAdd, ___,
|
||||
___, Key_1, Key_2, Key_3, Key_Equals, ___,
|
||||
___, ___, Key_0, Key_Period, Key_KeypadMultiply, Key_KeypadDivide, Key_Enter,
|
||||
___, ___, ___, ___,
|
||||
___),
|
||||
|
||||
[FUNCTION] = KEYMAP_STACKED
|
||||
(ShiftToLayer(NUMPAD), Key_F1, Key_F2, Key_F3, Key_F4, Key_F5, Key_CapsLock,
|
||||
Key_Tab, ___, Key_mouseUp, ___, Key_mouseBtnR, Key_mouseWarpEnd, Key_mouseWarpNE,
|
||||
Key_Home, Key_mouseL, Key_mouseDn, Key_mouseR, Key_mouseBtnL, Key_mouseWarpNW,
|
||||
Key_End, Key_PrintScreen, Key_Insert, ___, Key_mouseBtnM, Key_mouseWarpSW, Key_mouseWarpSE,
|
||||
___, Key_Delete, ___, ___,
|
||||
___,
|
||||
|
||||
Consumer_ScanPreviousTrack, Key_F6, Key_F7, Key_F8, Key_F9, Key_F10, Key_F11,
|
||||
Consumer_PlaySlashPause, Consumer_ScanNextTrack, Key_LeftCurlyBracket, Key_RightCurlyBracket, Key_LeftBracket, Key_RightBracket, Key_F12,
|
||||
Key_LeftArrow, Key_DownArrow, Key_UpArrow, Key_RightArrow, ___, ___,
|
||||
Key_PcApplication, Consumer_Mute, Consumer_VolumeDecrement, Consumer_VolumeIncrement, ___, Key_Backslash, Key_Pipe,
|
||||
___, ___, Key_Enter, ___,
|
||||
___)
|
||||
)
|
||||
// *INDENT-OFF*
|
||||
|
||||
namespace kaleidoscope {
|
||||
class LayerDumper: public Plugin {
|
||||
public:
|
||||
LayerDumper() {}
|
||||
|
||||
static void dumpLayerState(uint8_t index, uint8_t layer) {
|
||||
Serial.print(index);
|
||||
Serial.print(" -> ");
|
||||
Serial.println(layer);
|
||||
}
|
||||
|
||||
EventHandlerResult onLayerChange() {
|
||||
Serial.println("Active Layers:");
|
||||
Layer.forEachActiveLayer(&dumpLayerState);
|
||||
Serial.println();
|
||||
return EventHandlerResult::OK;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
kaleidoscope::LayerDumper LayerDumper;
|
||||
|
||||
KALEIDOSCOPE_INIT_PLUGINS(Focus, LayerDumper, MouseKeys);
|
||||
|
||||
void setup() {
|
||||
Kaleidoscope.setup();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
Kaleidoscope.loop();
|
||||
}
|
Loading…
Reference in new issue