diff --git a/src/main.c b/src/main.c index 6dcac39..6bd2fa6 100644 --- a/src/main.c +++ b/src/main.c @@ -60,7 +60,6 @@ static bool (*kb_is_pressed)[KB_ROWS][KB_COLUMNS] = &_kb_is_pressed; static bool _kb_was_pressed[KB_ROWS][KB_COLUMNS]; static bool (*kb_was_pressed)[KB_ROWS][KB_COLUMNS] = &_kb_was_pressed; -static bool kb_was_transparent[KB_ROWS][KB_COLUMNS]; static layer layers_pressed[KB_ROWS][KB_COLUMNS]; static layer current_layer; @@ -68,8 +67,7 @@ static layer layer_offset; static u8 current_row; static u8 current_col; static bool current_is_pressed; -static bool non_trans_key_pressed; -static bool trans_key_pressed; +static bool sticky_done; static bool layers_active[KB_LAYERS]; static StickyState layers_sticky[KB_LAYERS]; @@ -113,10 +111,8 @@ void main_key_loop() { if (current_is_pressed) { current_layer = layers_top; layers_pressed[row][col] = current_layer; - trans_key_pressed = false; } else { - current_layer = layers_pressed[row][col]; - trans_key_pressed = kb_was_transparent[row][col]; + current_layer = layers_pressed[row][col]; } // set remaining vars, and "execute" key @@ -124,7 +120,6 @@ void main_key_loop() { current_col = col; layer_offset = 0; exec_key(); - kb_was_transparent[row][col] = trans_key_pressed; } } } @@ -150,7 +145,7 @@ void exec_key(void) { // FIXME // If the current layer is in the sticky once up state and a key defined // for this layer (a non-transparent key) was pressed, pop the layer - if (layer_top_sticky() == StickyOnceUp && non_trans_key_pressed) { + if (layer_top_sticky() == StickyOnceUp && sticky_done) { layer_disable_top(); } } @@ -374,7 +369,6 @@ void _kbfun_mediakey_press_release(bool press, keycode key) { } } - // ---------------------------------------------------------------------------- // basic keyfuncs // ---------------------------------------------------------------------------- @@ -383,16 +377,29 @@ keycode current_keycode() { return kb_keycode(current_layer, current_row keyfunc current_keyfunc_press() { return kb_keyfunc_press(current_layer, current_row, current_col); } keyfunc current_keycode_release() { return kb_keyfunc_release(current_layer, current_row, current_col); } +bool key_is_modifier(keycode key) { + switch (key) { + case KEY_LeftControl: return true; + case KEY_LeftShift: return true; + case KEY_LeftAlt: return true; + case KEY_LeftGUI: return true; + case KEY_RightControl: return true; + case KEY_RightShift: return true; + case KEY_RightAlt: return true; + case KEY_RightGUI: return true; + default: return false; + } +} + // normal key void kbfun_press_release() { - if (!trans_key_pressed) { - non_trans_key_pressed = true; - } + sticky_done = ! key_is_modifier(current_keycode()); _kbfun_press_release(current_is_pressed, current_keycode()); } // media key void kbfun_mediakey_press_release() { + sticky_done = true; keycode key = current_keycode(); _kbfun_mediakey_press_release(current_is_pressed, key); } @@ -431,17 +438,15 @@ void kbfun_layer_sticky() { debug_printf("sticky %d down!\n", l); // this should be the only place we care about this flag being cleared - non_trans_key_pressed = false; + sticky_done = false; } } else { if (layer_sticky(l) == StickyOnceDown) { // When releasing this sticky key, pop the layer always layer_disable(l); - if (!non_trans_key_pressed) { - // If no key defined for this layer (a non-transparent key) - // was pressed, push the layer again, but in the - // StickyOnceUp state + if (!sticky_done) { + // re-enable the sticky key if we didn't actually use it yet layer_enable(l, StickyOnceUp); debug_printf("sticky %d still down!\n", l); } diff --git a/src/main.h b/src/main.h index 736c38c..c1015cf 100644 --- a/src/main.h +++ b/src/main.h @@ -6,6 +6,7 @@ void kbfun_control_press_release(); void kbfun_shift_press_release(); void kbfun_mediakey_press_release(); void kbfun_press_release(); +bool key_is_modifier(keycode key); keyfunc current_keycode_release(); keyfunc current_keyfunc_press(); keycode current_keycode();