From 7fa2155e0583ec34cb912228d95d92cb5ac4ea2b Mon Sep 17 00:00:00 2001 From: Ben Blazak Date: Fri, 30 Nov 2012 12:06:41 -0800 Subject: [PATCH] changed the way layers are handled note: NOT YET TESTED, only compiled --- src/TODO | 6 - src/keyboard/ergodox/circuit-diagram.svg | 14 +- .../ergodox/layout/qwerty-kinesis-mod.c | 311 ++++++++++-------- src/lib/key-functions/private.c | 42 --- src/lib/key-functions/private.h | 3 - src/lib/key-functions/public.h | 35 +- src/lib/key-functions/public/basic.c | 303 +++++++++++++++-- src/lib/key-functions/public/numpad.c | 150 --------- src/lib/key-functions/public/special.c | 129 ++++---- src/main.c | 148 ++++++++- src/main.h | 13 +- 11 files changed, 696 insertions(+), 458 deletions(-) delete mode 100644 src/TODO delete mode 100644 src/lib/key-functions/public/numpad.c 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