diff --git a/src/TODO b/src/TODO
deleted file mode 100644
index 3f7468b..0000000
--- a/src/TODO
+++ /dev/null
@@ -1,6 +0,0 @@
-- think about how to implement variable length arrays, and write some
-
-- then i'll think about how to use them as stacks, to deal with layer issues
-
-- implement the dvorak layout (see github issue)
-
diff --git a/src/keyboard/ergodox/circuit-diagram.svg b/src/keyboard/ergodox/circuit-diagram.svg
index c4107d7..d6709d1 100644
--- a/src/keyboard/ergodox/circuit-diagram.svg
+++ b/src/keyboard/ergodox/circuit-diagram.svg
@@ -37,10 +37,10 @@
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="false"
inkscape:bbox-paths="false"
- inkscape:window-width="1920"
- inkscape:window-height="997"
+ inkscape:window-width="1440"
+ inkscape:window-height="852"
inkscape:window-x="0"
- inkscape:window-y="30"
+ inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-bbox-midpoints="true"
showguides="true"
@@ -2129,14 +2129,14 @@
R = 220 Ω
+ x="429.96448"
+ y="346.10483">R = (match to LEDs)
* Released under The MIT License (MIT) (see "license.md")
@@ -19,28 +20,8 @@
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
-// aliases
-// --- basic
-#define f_prrel &kbfun_press_release
-#define f_toggl &kbfun_toggle
-#define f_l_inc &kbfun_layer_inc
-#define f_l_dec &kbfun_layer_dec
-// --- device
-#define f_btldr &kbfun_jump_to_bootloader
-// --- numpad
-#define f_np_to &kbfun_layermask_numpad_toggle
-#define f_np_on &kbfun_layermask_numpad_on
-#define f_np_of &kbfun_layermask_numpad_off
-// --- special
-#define f_l_iex &kbfun_layer_inc_exec
-#define f_l_dex &kbfun_layer_dec_exec
-#define f_2kcap &kbfun_2_keys_capslock_press_release
-
-// ----------------------------------------------------------------------------
-// ----------------------------------------------------------------------------
-
const uint8_t PROGMEM _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS] = {
- // --------------------------------------------------------------------
+
KB_MATRIX_LAYER( // layout: layer 0: default
// unused
0,
@@ -62,7 +43,8 @@ _capsLock, _A, _S, _D, _F, _G,
0, _space,
_ctrlR, 0, _enter,
_altR, _pageU, _pageD ),
- // --------------------------------------------------------------------
+
+
KB_MATRIX_LAYER( // layout: layer 1: function and symbol keys
// unused
0,
@@ -84,7 +66,8 @@ _bracketL, 0, _dash, _lt_kp, _gt_kp,_currencyUnit,_bracketR,
0, _space,
_ctrlR, 0, _enter,
_altR, _pageU, _pageD ),
- // --------------------------------------------------------------------
+
+
KB_MATRIX_LAYER( // layout: layer 2: numpad
// unused
0,
@@ -106,167 +89,213 @@ _ctrlR, 0, _enter,
0, _0_kp,
0, 0, 0,
0, 0, 0 ),
- // --------------------------------------------------------------------
+
};
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+
+// aliases
+
+// basic
+#define kprrel &kbfun_press_release
+#define ktog &kbfun_toggle
+#define ktrans &kbfun_transparent
+// --- layer push/pop functions
+#define lpush1 &kbfun_layer_push_1
+#define lpush2 &kbfun_layer_push_2
+#define lpush3 &kbfun_layer_push_3
+#define lpush4 &kbfun_layer_push_4
+#define lpush5 &kbfun_layer_push_5
+#define lpush6 &kbfun_layer_push_6
+#define lpush7 &kbfun_layer_push_7
+#define lpush8 &kbfun_layer_push_8
+#define lpush9 &kbfun_layer_push_9
+#define lpush10 &kbfun_layer_push_10
+#define lpop1 &kbfun_layer_pop_1
+#define lpop2 &kbfun_layer_pop_2
+#define lpop3 &kbfun_layer_pop_3
+#define lpop4 &kbfun_layer_pop_4
+#define lpop5 &kbfun_layer_pop_5
+#define lpop6 &kbfun_layer_pop_6
+#define lpop7 &kbfun_layer_pop_7
+#define lpop8 &kbfun_layer_pop_8
+#define lpop9 &kbfun_layer_pop_9
+#define lpop10 &kbfun_layer_pop_10
+// ---
+
+// device
+#define dbtldr &kbfun_jump_to_bootloader
+
+// special
+#define s2kcap &kbfun_2_keys_capslock_press_release
+#define slpunum &kbfun_layer_push_numpad
+#define slponum &kbfun_layer_pop_numpad
+
+// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
const void_funptr_t PROGMEM _kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS] = {
- // --------------------------------------------------------------------
+
KB_MATRIX_LAYER( // press: layer 0: default
// unused
NULL,
// left hand
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_l_inc,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
-f_2kcap,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_l_inc,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel, NULL,
- f_prrel, NULL,f_prrel,
- f_prrel,f_prrel,f_prrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel, lpush1,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ s2kcap, kprrel, kprrel, kprrel, kprrel, kprrel, lpush1,
+ kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, NULL,
+ kprrel, NULL, kprrel,
+ kprrel, kprrel, kprrel,
// right hand
- f_np_to,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_l_inc,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_2kcap,
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- NULL,f_prrel,
-f_prrel, NULL,f_prrel,
-f_prrel,f_prrel,f_prrel ),
- // --------------------------------------------------------------------
+ slpunum, kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ lpush1, kprrel, kprrel, kprrel, kprrel, kprrel, s2kcap,
+ kprrel, kprrel, kprrel, kprrel, kprrel,
+ NULL, kprrel,
+ kprrel, NULL, kprrel,
+ kprrel, kprrel, kprrel ),
+
+
KB_MATRIX_LAYER( // press: layer 1: function and symbol keys
// unused
NULL,
// left hand
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel, NULL,f_l_dec,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
-f_2kcap,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel, NULL,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel, NULL,
- f_prrel, NULL,f_prrel,
- f_prrel,f_prrel,f_prrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, NULL, lpop1,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ s2kcap, kprrel, kprrel, kprrel, kprrel, kprrel, NULL,
+ kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, NULL,
+ kprrel, NULL, kprrel,
+ kprrel, kprrel, kprrel,
// right hand
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel, NULL,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- NULL,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_2kcap,
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- NULL,f_prrel,
-f_prrel, NULL,f_prrel,
-f_prrel,f_prrel,f_prrel ),
- // --------------------------------------------------------------------
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, NULL, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ NULL, kprrel, kprrel, kprrel, kprrel, kprrel, s2kcap,
+ kprrel, kprrel, kprrel, kprrel, kprrel,
+ NULL, kprrel,
+ kprrel, NULL, kprrel,
+ kprrel, kprrel, kprrel ),
+
+
KB_MATRIX_LAYER( // press: layer 2: numpad
// unused
NULL,
// left hand
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL,
- NULL, NULL, NULL,
- NULL, NULL, NULL,
+ ktrans, ktrans, ktrans, ktrans, ktrans, ktrans, ktrans,
+ ktrans, ktrans, ktrans, ktrans, ktrans, ktrans, ktrans,
+ ktrans, ktrans, ktrans, ktrans, ktrans, ktrans,
+ ktrans, ktrans, ktrans, ktrans, ktrans, ktrans, ktrans,
+ ktrans, kprrel, ktrans, ktrans, ktrans,
+ ktrans, ktrans,
+ ktrans, ktrans, ktrans,
+ ktrans, ktrans, ktrans,
// right hand
- f_np_to, NULL,f_np_to,f_prrel,f_prrel,f_prrel, NULL,
- NULL, NULL,f_prrel,f_prrel,f_prrel,f_prrel, NULL,
- NULL,f_prrel,f_prrel,f_prrel,f_prrel, NULL,
- NULL, NULL,f_prrel,f_prrel,f_prrel,f_prrel, NULL,
- NULL, NULL,f_prrel,f_prrel, NULL,
- NULL,f_prrel,
- NULL, NULL, NULL,
- NULL, NULL, NULL ),
- // --------------------------------------------------------------------
+ slponum, ktrans,slponum, kprrel, kprrel, kprrel, ktrans,
+ ktrans, ktrans, kprrel, kprrel, kprrel, kprrel, ktrans,
+ ktrans, kprrel, kprrel, kprrel, kprrel, ktrans,
+ ktrans, ktrans, kprrel, kprrel, kprrel, kprrel, ktrans,
+ ktrans, ktrans, kprrel, kprrel, ktrans,
+ ktrans, kprrel,
+ ktrans, ktrans, ktrans,
+ ktrans, ktrans, ktrans ),
+
};
+// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
const void_funptr_t PROGMEM _kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS] = {
- // --------------------------------------------------------------------
+
KB_MATRIX_LAYER( // release: layer 0: default
// unused
NULL,
// left hand
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel, NULL,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
-f_2kcap,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_l_dec,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel, NULL,
- f_prrel, NULL,f_prrel,
- f_prrel,f_prrel,f_prrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel, NULL,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ s2kcap, kprrel, kprrel, kprrel, kprrel, kprrel, lpop1,
+ kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, NULL,
+ kprrel, NULL, kprrel,
+ kprrel, kprrel, kprrel,
// right hand
- NULL,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_l_dec,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_2kcap,
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- NULL,f_prrel,
-f_prrel, NULL,f_prrel,
-f_prrel,f_prrel,f_prrel ),
- // --------------------------------------------------------------------
+ NULL, kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ lpop1, kprrel, kprrel, kprrel, kprrel, kprrel, s2kcap,
+ kprrel, kprrel, kprrel, kprrel, kprrel,
+ NULL, kprrel,
+ kprrel, NULL, kprrel,
+ kprrel, kprrel, kprrel ),
+
+
KB_MATRIX_LAYER( // release: layer 1: function and symbol keys
// unused
NULL,
// left hand
- NULL,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel, NULL, NULL,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
-f_2kcap,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel, NULL,
-f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel, NULL,
- f_prrel, NULL,f_prrel,
- f_prrel,f_prrel,f_prrel,
+ NULL, kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, NULL, NULL,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ s2kcap, kprrel, kprrel, kprrel, kprrel, kprrel, NULL,
+ kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, NULL,
+ kprrel, NULL, kprrel,
+ kprrel, kprrel, kprrel,
// right hand
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel, NULL,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- NULL,f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,f_2kcap,
- f_prrel,f_prrel,f_prrel,f_prrel,f_prrel,
- NULL,f_prrel,
-f_prrel, NULL,f_prrel,
-f_prrel,f_prrel,f_prrel ),
- // --------------------------------------------------------------------
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, NULL, kprrel, kprrel, kprrel, kprrel, kprrel,
+ kprrel, kprrel, kprrel, kprrel, kprrel, kprrel,
+ NULL, kprrel, kprrel, kprrel, kprrel, kprrel, s2kcap,
+ kprrel, kprrel, kprrel, kprrel, kprrel,
+ NULL, kprrel,
+ kprrel, NULL, kprrel,
+ kprrel, kprrel, kprrel ),
+
+
KB_MATRIX_LAYER( // release: layer 2: numpad
// unused
NULL,
// left hand
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL,
- NULL, NULL, NULL,
- NULL, NULL, NULL,
+ ktrans, ktrans, ktrans, ktrans, ktrans, ktrans, ktrans,
+ ktrans, ktrans, ktrans, ktrans, ktrans, ktrans, ktrans,
+ ktrans, ktrans, ktrans, ktrans, ktrans, ktrans,
+ ktrans, ktrans, ktrans, ktrans, ktrans, ktrans, ktrans,
+ ktrans, kprrel, ktrans, ktrans, ktrans,
+ ktrans, ktrans,
+ ktrans, ktrans, ktrans,
+ ktrans, ktrans, ktrans,
// right hand
- NULL, NULL, NULL,f_prrel,f_prrel,f_prrel, NULL,
- NULL, NULL,f_prrel,f_prrel,f_prrel,f_prrel, NULL,
- NULL,f_prrel,f_prrel,f_prrel,f_prrel, NULL,
- NULL, NULL,f_prrel,f_prrel,f_prrel,f_prrel, NULL,
- NULL, NULL,f_prrel,f_prrel, NULL,
- NULL,f_prrel,
- NULL, NULL, NULL,
- NULL, NULL, NULL ),
- // --------------------------------------------------------------------
+ NULL, ktrans, NULL, kprrel, kprrel, kprrel, ktrans,
+ ktrans, ktrans, kprrel, kprrel, kprrel, kprrel, ktrans,
+ ktrans, kprrel, kprrel, kprrel, kprrel, ktrans,
+ ktrans, ktrans, kprrel, kprrel, kprrel, kprrel, ktrans,
+ ktrans, ktrans, kprrel, kprrel, ktrans,
+ ktrans, kprrel,
+ ktrans, ktrans, ktrans,
+ ktrans, ktrans, ktrans ),
+
+
KB_MATRIX_LAYER( // release: layer 3: nothing (just making sure unused
- // functions don't get compiled
- // out)
+ // functions don't get compiled out)
// unused
NULL,
// other
-f_prrel,f_btldr, NULL, NULL, NULL, NULL, NULL, NULL,
-f_toggl, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-f_l_inc, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-f_l_dec, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-f_l_iex, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-f_l_dex, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-f_2kcap, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-f_np_to, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-f_np_on, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-f_np_of, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
- // --------------------------------------------------------------------
+ kprrel, lpush8, lpop8, NULL, NULL, NULL, NULL, NULL,
+ ktog, lpush9, lpop9, NULL, NULL, NULL, NULL, NULL,
+ ktrans,lpush10, lpop10, NULL, NULL, NULL, NULL, NULL,
+ lpush1, lpop1, NULL, NULL, NULL, NULL, NULL, NULL,
+ lpush2, lpop2, dbtldr, NULL, NULL, NULL, NULL, NULL,
+ lpush3, lpop3, NULL, NULL, NULL, NULL, NULL, NULL,
+ lpush4, lpop4, s2kcap, NULL, NULL, NULL, NULL, NULL,
+ lpush5, lpop5,slpunum, NULL, NULL, NULL, NULL, NULL,
+ lpush6, lpop6,slponum, NULL, NULL, NULL, NULL, NULL,
+ lpush7, lpop7, NULL, NULL, NULL, NULL, NULL, NULL )
+
};
diff --git a/src/lib/key-functions/private.c b/src/lib/key-functions/private.c
index 03e8c15..6501449 100644
--- a/src/lib/key-functions/private.c
+++ b/src/lib/key-functions/private.c
@@ -87,48 +87,6 @@ void _kbfun_press_release(bool press, uint8_t keycode) {
}
}
-/*
- * Set current layer
- * - Sets any keys currently set to the overall current layer to the new layer,
- * and then sets the overall current layer
- *
- * Note
- * - Leaving all non-current layer values alone allows changing layers while
- * maintaining a possibly enabled layer mask (as might be used to implement
- * firmware enabled numlock)
- */
-void _kbfun_layer_set_current(uint8_t layer) {
- // don't switch to out-of-bounds layers
- if ( layer < 0 || layer >= KB_LAYERS )
- return;
-
- for (uint8_t row=0; row= KB_LAYERS )
- return;
-
- for (uint8_t row=0; row
- * Released under The MIT License (MIT) (see "license.md")
- * Project located at
- * ------------------------------------------------------------------------- */
-
-
-#include
-#include
-#include "../../../lib-other/pjrc/usb_keyboard/usb_keyboard.h"
-#include "../../../lib/usb/usage-page/keyboard.h"
-#include "../../../keyboard/layout.h"
-#include "../../../keyboard/matrix.h"
-#include "../../../main.h"
-#include "../public.h"
-#include "../private.h"
-
-// ----------------------------------------------------------------------------
-
-// convenience macros
-#define layer main_arg_layer
-#define row main_arg_row
-#define col main_arg_col
-#define is_pressed main_arg_is_pressed
-#define was_pressed main_arg_was_pressed
-
-// ----------------------------------------------------------------------------
-// vars
-// ----------------------------------------------------------------------------
-
-static bool _numpad_activated = false;
-
-static bool _layer_mask[KB_ROWS][KB_COLUMNS] =
- KB_MATRIX_LAYER(
- // unused
- 0,
-
- // left hand
- 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 0, 0,
- 0, 0,
- 0, 0, 0,
- 0, 0, 0,
-
- // right hand
- 1, 0, 1, 1, 1, 1, 0,
- 0, 0, 1, 1, 1, 1, 0,
- 0, 1, 1, 1, 1, 0,
- 0, 0, 1, 1, 1, 1, 0,
- 0, 0, 1, 1, 0,
- 0, 1,
- 0, 0, 0,
- 0, 0, 0 );
-
-
-// ----------------------------------------------------------------------------
-// private functions
-// ----------------------------------------------------------------------------
-
-static inline void _toggle_numlock(void) {
- _kbfun_press_release(true, KEYPAD_NumLock_Clear);
- usb_keyboard_send();
- _kbfun_press_release(false, KEYPAD_NumLock_Clear);
- usb_keyboard_send();
-}
-
-static void _toggle_numpad(uint8_t numpad_layer) {
- if (_numpad_activated) {
- // deactivate numpad
- _kbfun_layer_set_mask(main_layers_current, _layer_mask);
- _numpad_activated = false;
-
- // if: numlock on
- if (keyboard_leds & (1<<0))
- _toggle_numlock();
- } else {
- // activate numpad
- _kbfun_layer_set_mask(numpad_layer, _layer_mask);
- _numpad_activated = true;
-
- // if: numlock off
- if (!(keyboard_leds & (1<<0)))
- _toggle_numlock();
- }
-}
-
-
-// ----------------------------------------------------------------------------
-// public functions
-// ----------------------------------------------------------------------------
-
-/*
- * [name]
- * Numpad toggle
- *
- * [description]
- * Toggles the numpad and sets numlock on (for active) or off (for inactive)
- * with it, if it's not already in that state
- */
-void kbfun_layermask_numpad_toggle(void) {
- uint8_t keycode = kb_layout_get(layer, row, col);
- _toggle_numpad(keycode);
-}
-
-/*
- * [name]
- * Numpad on
- *
- * [description]
- * Set the numpad on (along with numlock, if it's not already)
- */
-void kbfun_layermask_numpad_on(void) {
- uint8_t keycode = kb_layout_get(layer, row, col);
- if (!_numpad_activated)
- _toggle_numpad(keycode);
-}
-
-/*
- * [name]
- * Numpad off
- *
- * [description]
- * Set the numpad off (along with numlock, if it's not already)
- */
-void kbfun_layermask_numpad_off(void) {
- uint8_t keycode = kb_layout_get(layer, row, col);
- if (_numpad_activated)
- _toggle_numpad(keycode);
-}
-
diff --git a/src/lib/key-functions/public/special.c b/src/lib/key-functions/public/special.c
index 48b8496..ce1013a 100644
--- a/src/lib/key-functions/public/special.c
+++ b/src/lib/key-functions/public/special.c
@@ -19,66 +19,16 @@
// ----------------------------------------------------------------------------
// convenience macros
-#define layer main_arg_layer
-#define row main_arg_row
-#define col main_arg_col
-#define is_pressed main_arg_is_pressed
-#define was_pressed main_arg_was_pressed
+#define LAYER main_arg_layer
+#define LAYER_OFFSET main_arg_layer_offset
+#define ROW main_arg_row
+#define COL main_arg_col
+#define IS_PRESSED main_arg_is_pressed
+#define WAS_PRESSED main_arg_was_pressed
+
// ----------------------------------------------------------------------------
-/*
- * [name]
- * Increase layer, Execute key
- *
- * [description]
- * Increment the current layer by the value specified in the keymap (for all
- * non-masked keys), and execute (usually press|release) the key in the same
- * position on that new layer
- *
- * [note]
- * Meant to be paired with `kbfun_layer_dec_exec()`
- */
-void kbfun_layer_inc_exec(void) {
- uint8_t keycode = kb_layout_get(layer, row, col);
-
- // switch layers
- _kbfun_layer_set_current(main_layers_current + keycode);
-
- // exececute second key (in the same position)
- // - `layer+keycode` will be constant (under normal circumstances)
- // between the press and release
- layer += keycode;
- main_exec_key();
-}
-
-
-/*
- * [name]
- * Decrease layer, Execute key
- *
- * [description]
- * Decrement the current layer by the value specified in the keymap (for all
- * non-masked keys), and execute (usually press|release) the key in the same
- * position on that new layer
- *
- * [note]
- * Meant to be paired with `kbfun_layer_inc_exec()`
- */
-void kbfun_layer_dec_exec(void) {
- uint8_t keycode = kb_layout_get(layer, row, col);
-
- // switch layers
- _kbfun_layer_set_current(main_layers_current - keycode);
-
- // exececute second key (in the same position)
- // - `layer+keycode` will be constant (under normal circumstances)
- // between the press and release
- layer += keycode;
- main_exec_key();
-}
-
-
/*
* [name]
* Two keys => capslock
@@ -99,15 +49,15 @@ void kbfun_2_keys_capslock_press_release(void) {
static bool lshift_pressed;
static bool rshift_pressed;
- uint8_t keycode = kb_layout_get(layer, row, col);
+ uint8_t keycode = kb_layout_get(LAYER, ROW, COL);
- if (!is_pressed) keys_pressed--;
+ if (!IS_PRESSED) keys_pressed--;
// take care of the key that was actually pressed
- _kbfun_press_release(is_pressed, keycode);
+ _kbfun_press_release(IS_PRESSED, keycode);
// take care of capslock (only on the press of the 2nd key)
- if (keys_pressed == 1 && is_pressed) {
+ if (keys_pressed == 1 && IS_PRESSED) {
// save the state of left and right shift
lshift_pressed = _kbfun_is_pressed(KEY_LeftShift);
rshift_pressed = _kbfun_is_pressed(KEY_RightShift);
@@ -128,6 +78,61 @@ void kbfun_2_keys_capslock_press_release(void) {
_kbfun_press_release(true, KEY_RightShift);
}
- if (is_pressed) keys_pressed++;
+ if (IS_PRESSED) keys_pressed++;
}
+/* ----------------------------------------------------------------------------
+ * numpad functions
+ * ------------------------------------------------------------------------- */
+
+static uint8_t numpad_layer_id;
+
+static inline void numpad_toggle_numlock(void) {
+ _kbfun_press_release(true, KEYPAD_NumLock_Clear);
+ usb_keyboard_send();
+ _kbfun_press_release(false, KEYPAD_NumLock_Clear);
+ usb_keyboard_send();
+}
+
+/*
+ * [name]
+ * Numpad on
+ *
+ * [description]
+ * Set the numpad to on (put the numpad layer, specified in the keymap, in an
+ * element at the top of the layer stack, and record that element's id) and
+ * toggle numlock (regardless of whether or not numlock is currently on)
+ *
+ * [note]
+ * Meant to be assigned (along with "numpad off") instead of a normal numlock
+ * key
+ */
+void kbfun_layer_push_numpad(void) {
+ uint8_t keycode = kb_layout_get(LAYER, ROW, COL);
+ main_layers_pop_id(numpad_layer_id);
+ numpad_layer_id = main_layers_push(keycode);
+ numpad_toggle_numlock();
+}
+
+/*
+ * [name]
+ * Numpad off
+ *
+ * [description]
+ * Set the numpad to off (pop the layer element created by "numpad on" out of
+ * the stack) and toggle numlock (regardless of whether or not numlock is
+ * currently on)
+ *
+ * [note]
+ * Meant to be assigned (along with "numpad on") instead of a normal numlock
+ * key
+ */
+void kbfun_layer_pop_numpad(void) {
+ main_layers_pop_id(numpad_layer_id);
+ numpad_layer_id = 0;
+ numpad_toggle_numlock();
+}
+
+/* ----------------------------------------------------------------------------
+ * ------------------------------------------------------------------------- */
+
diff --git a/src/main.c b/src/main.c
index 8e3943a..c0c1086 100644
--- a/src/main.c
+++ b/src/main.c
@@ -20,20 +20,23 @@
// ----------------------------------------------------------------------------
+#define MAX_ACTIVE_LAYERS 20
+
+// ----------------------------------------------------------------------------
+
static bool _main_kb_is_pressed[KB_ROWS][KB_COLUMNS];
bool (*main_kb_is_pressed)[KB_ROWS][KB_COLUMNS] = &_main_kb_is_pressed;
static bool _main_kb_was_pressed[KB_ROWS][KB_COLUMNS];
bool (*main_kb_was_pressed)[KB_ROWS][KB_COLUMNS] = &_main_kb_was_pressed;
-uint8_t main_layers_current;
-uint8_t main_layers_press[KB_ROWS][KB_COLUMNS];
-uint8_t main_layers_release[KB_ROWS][KB_COLUMNS];
+uint8_t main_layers_pressed[KB_ROWS][KB_COLUMNS];
uint8_t main_loop_row;
uint8_t main_loop_col;
uint8_t main_arg_layer;
+uint8_t main_arg_layer_offset;
uint8_t main_arg_row;
uint8_t main_arg_col;
bool main_arg_is_pressed;
@@ -73,11 +76,11 @@ int main(void) {
// - see the keyboard layout file ("keyboard/ergodox/layout/*.c") for
// which key is assigned which function (per layer)
// - see "lib/key-functions/public/*.c" for the function definitions
- #define row main_loop_row
- #define col main_loop_col
- #define layer main_arg_layer
- #define is_pressed main_arg_is_pressed
- #define was_pressed main_arg_was_pressed
+ #define row main_loop_row
+ #define col main_loop_col
+ #define layer main_arg_layer
+ #define is_pressed main_arg_is_pressed
+ #define was_pressed main_arg_was_pressed
for (row=0; row layers_info.head) // uint8_t, so they're both >0
+ return 0; // default
+
+ return layers[layers_info.head - offset].layer;
+}
+
+/*
+ * push()
+ *
+ * Arguments
+ * - 'layer': the layer-number to push to the top of the stack
+ *
+ * Returns
+ * - success: the id assigned to the newly added element
+ * - failure: 0 (the stack was already full)
+ */
+uint8_t main_layers_push(uint8_t layer) {
+ if (layers_info.head == MAX_ACTIVE_LAYERS)
+ return 0; // error
+
+ layers_info.head++;
+
+ for (uint8_t id=1; id