Instead of acting as a strange LED mode, use a loop hook instead

Having the LED effects of the NumLock layer as a special LED mode has a number
of drawbacks, like not interacting well with led mode switching: one can't get
back to the NumLock effect once switching away from it (but the mode remains
active nevertheless).

To avoid this and other issues, don't make the effect a LED mode. Instead,
override the active LED mode with the numlock layer colors. This way, it is
always in sync with the layer.

Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
pull/365/head
Gergely Nagy 8 years ago
parent 42c833c81a
commit 98bf56d097

@ -3,31 +3,22 @@
#include "Kaleidoscope.h" #include "Kaleidoscope.h"
#include "layers.h" #include "layers.h"
uint8_t NumLock_::previousLEDMode;
uint8_t NumLock_::us;
bool NumLock_::isActive; bool NumLock_::isActive;
byte NumLock_::row = 255, NumLock_::col = 255; byte NumLock_::row = 255, NumLock_::col = 255;
cRGB numpad_color; cRGB numpad_color = CRGB(255, 0, 0);
NumLock_::NumLock_(void) { NumLock_::NumLock_(void) {
} }
void void NumLock_::begin(void) {
NumLock_::begin(void) { loop_hook_use(loopHook);
us = LEDControl.mode_add(this);
numpad_color.r = 255;
} }
void void NumLock_::loopHook(bool postClear) {
NumLock_::init(void) { if (!postClear || !isActive)
if (!isActive) { return;
LEDControl.next_mode();
}
}
void
NumLock_::update(void) {
for (uint8_t r = 0; r < ROWS; r++) { for (uint8_t r = 0; r < ROWS; r++) {
for (uint8_t c = 0; c < COLS; c++) { for (uint8_t c = 0; c < COLS; c++) {
Key k = Layer.lookup(r, c); Key k = Layer.lookup(r, c);
@ -46,21 +37,16 @@ NumLock_::update(void) {
LEDControl.led_set_crgb_at(row, col, color); LEDControl.led_set_crgb_at(row, col, color);
} }
const macro_t * const macro_t *NumLock_::toggle(byte row_, byte col_, uint8_t numPadLayer) {
NumLock_::toggle(byte row_, byte col_, uint8_t numPadLayer) {
row = row_; row = row_;
col = col_; col = col_;
if (Layer.isOn(numPadLayer)) { if (Layer.isOn(numPadLayer)) {
isActive = false;
LEDControl.set_mode(previousLEDMode);
Layer.off(numPadLayer); Layer.off(numPadLayer);
} else { } else {
isActive = true;
previousLEDMode = LEDControl.get_mode();
LEDControl.set_mode(us);
Layer.on(numPadLayer); Layer.on(numPadLayer);
} }
isActive = Layer.isOn(numPadLayer);
return MACRO(T(KeypadNumLock), END); return MACRO(T(KeypadNumLock), END);
} }

@ -7,20 +7,16 @@
#define TOGGLENUMLOCK 0 #define TOGGLENUMLOCK 0
#define Key_ToggleNumlock M(TOGGLENUMLOCK) #define Key_ToggleNumlock M(TOGGLENUMLOCK)
class NumLock_ : public LEDMode { class NumLock_ : public KaleidoscopePlugin {
public: public:
NumLock_(void); NumLock_(void);
void begin(void) final; void begin(void) final;
void update(void) final;
void init(void) final;
static const macro_t *toggle(byte row, byte col, uint8_t numPadLayer); static const macro_t *toggle(byte row, byte col, uint8_t numPadLayer);
static void loopHook(const bool postClear);
private: private:
static uint8_t previousLEDMode;
static uint8_t us;
static bool isActive; static bool isActive;
static byte row, col; static byte row, col;
}; };

Loading…
Cancel
Save