split {mod,layer}_sticky_on
parent
e8c5f2a69d
commit
90bb49c27d
116
src/main.c
116
src/main.c
|
@ -65,19 +65,17 @@ static bool current_is_pressed;
|
|||
static bool layers_active[KB_LAYERS];
|
||||
static layer layers_top = 0;
|
||||
|
||||
static bool sticky_on;
|
||||
static bool sticky_done;
|
||||
static bool layer_sticky_on;
|
||||
static bool layer_sticky[KB_LAYERS];
|
||||
static u8 modifier_sticky;
|
||||
static bool layer_sticky_done;
|
||||
static u8 mod_sticky;
|
||||
static bool mod_sticky_done;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
int main() {
|
||||
kb_init();
|
||||
usb_init();
|
||||
while (!usb_configured());
|
||||
|
||||
// initialize
|
||||
init_hw();
|
||||
init_layers();
|
||||
init_sticky();
|
||||
|
||||
|
@ -127,9 +125,22 @@ void main_key_loop() {
|
|||
usb_extra_consumer_send();
|
||||
|
||||
// unset sticky keys if necessary
|
||||
if (sticky_on && sticky_done) {
|
||||
sticky_disable();
|
||||
if (layer_sticky_on && layer_sticky_done) {
|
||||
for (layer l=1; l < KB_LAYERS; l++) {
|
||||
if (layer_sticky[l]) {
|
||||
layer_disable(l);
|
||||
layer_sticky[l] = false;
|
||||
}
|
||||
}
|
||||
layer_sticky_on = false;
|
||||
layer_sticky_done = false;
|
||||
}
|
||||
|
||||
if (mod_sticky && mod_sticky_done) {
|
||||
keyboard_modifier_keys &= ~mod_sticky;
|
||||
usb_keyboard_send();
|
||||
mod_sticky = 0;
|
||||
mod_sticky_done = false;
|
||||
}
|
||||
|
||||
// debounce in ms; see keyswitch spec for necessary value
|
||||
|
@ -138,9 +149,25 @@ void main_key_loop() {
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// layer functions
|
||||
// init functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void init_hw() {
|
||||
kb_init();
|
||||
usb_init();
|
||||
while (!usb_configured());
|
||||
}
|
||||
|
||||
void init_sticky() {
|
||||
for (layer l=1; l < KB_LAYERS; l++) {
|
||||
layer_sticky[l] = false;
|
||||
}
|
||||
layer_sticky_on = false;
|
||||
mod_sticky = 0;
|
||||
layer_sticky_done = false;
|
||||
mod_sticky_done = false;
|
||||
}
|
||||
|
||||
void init_layers() {
|
||||
for (layer l=0; l < KB_LAYERS; l++) {
|
||||
layers_active[l] = false;
|
||||
|
@ -148,6 +175,9 @@ void init_layers() {
|
|||
layers_active[0] = true;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// layer functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// find highest active layer
|
||||
layer highest_active_layer(layer offset) {
|
||||
|
@ -224,38 +254,6 @@ void layer_enable_upto(layer max_layer) {
|
|||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// sticky functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void init_sticky() {
|
||||
for (layer l=1; l < KB_LAYERS; l++) {
|
||||
layer_sticky[l] = false;
|
||||
}
|
||||
for (keycode mod=0; mod < MODIFIERS; mod++) {
|
||||
modifier_sticky = 0;
|
||||
}
|
||||
sticky_on = false;
|
||||
sticky_done = true;
|
||||
}
|
||||
|
||||
void sticky_disable() {
|
||||
for (layer l=1; l < KB_LAYERS; l++) {
|
||||
if (layer_sticky[l]) {
|
||||
layer_disable(l);
|
||||
layer_sticky[l] = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (modifier_sticky) {
|
||||
keyboard_modifier_keys &= ~modifier_sticky;
|
||||
modifier_sticky = 0;
|
||||
}
|
||||
|
||||
sticky_on = false;
|
||||
sticky_done = false;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// layout info
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -327,6 +325,11 @@ bool _kbfun_modifier_is_pressed(keycode key) {
|
|||
return (keyboard_modifier_keys & (1<<key));
|
||||
}
|
||||
|
||||
void _kbfun_normal_sticky_done() {
|
||||
layer_sticky_done = true;
|
||||
mod_sticky_done = true;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// basic keyfuncs
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -343,13 +346,13 @@ void exec_key() {
|
|||
|
||||
// normal key
|
||||
void kbfun_normal_press_release() {
|
||||
sticky_done = true;
|
||||
_kbfun_normal_sticky_done();
|
||||
_kbfun_normal_press_release(current_is_pressed, current_keycode);
|
||||
}
|
||||
|
||||
// media key
|
||||
void kbfun_mediakey_press_release() {
|
||||
sticky_done = true;
|
||||
_kbfun_normal_sticky_done();
|
||||
_kbfun_mediakey_press_release(current_is_pressed, current_keycode);
|
||||
}
|
||||
|
||||
|
@ -360,7 +363,7 @@ void kbfun_modifier_press_release() {
|
|||
|
||||
// enable layer
|
||||
void kbfun_layer_enable() {
|
||||
sticky_done = true;
|
||||
layer_sticky_done = true; // don't disable sticky mods!
|
||||
|
||||
layer l = (layer) current_keycode;
|
||||
layer_enable_upto(l);
|
||||
|
@ -368,11 +371,10 @@ void kbfun_layer_enable() {
|
|||
|
||||
// disable layer
|
||||
void kbfun_layer_disable() {
|
||||
sticky_done = true;
|
||||
layer_sticky_done = true; // don't disable sticky mods!
|
||||
|
||||
// letting go off a key releases *all* layers on that key
|
||||
for (layer l=0; l <= KB_LAYERS; l++) {
|
||||
// FIXME this is broken with sticky
|
||||
void (*key_function)(void) = kb_keyfunc_release(l, current_row, current_col);
|
||||
|
||||
if (is_layer_disable(key_function)) {
|
||||
|
@ -388,14 +390,14 @@ void kbfun_layer_sticky() {
|
|||
|
||||
if (current_is_pressed) {
|
||||
layer_enable(l);
|
||||
sticky_done = false;
|
||||
layer_sticky_done = false;
|
||||
} else {
|
||||
if (sticky_done) {
|
||||
if (layer_sticky_done) {
|
||||
layer_disable(l);
|
||||
} else {
|
||||
layer_sticky[l] = true;
|
||||
sticky_on = true;
|
||||
sticky_done = false;
|
||||
layer_sticky[l] = true;
|
||||
layer_sticky_on = true;
|
||||
layer_sticky_done = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -403,19 +405,17 @@ void kbfun_layer_sticky() {
|
|||
// sticky modifier key
|
||||
void kbfun_modifier_sticky() {
|
||||
// TODO handle: sticky, then same modifier
|
||||
// TODO split sticky_on/done layer vs modifier so we can fine-tune it more?
|
||||
keycode mod = current_keycode;
|
||||
|
||||
if (current_is_pressed) {
|
||||
kbfun_modifier_press_release();
|
||||
sticky_done = false;
|
||||
mod_sticky_done = false;
|
||||
} else {
|
||||
if (sticky_done) {
|
||||
if (mod_sticky_done) {
|
||||
kbfun_modifier_press_release();
|
||||
} else {
|
||||
modifier_sticky |= 1<<mod;
|
||||
sticky_on = true;
|
||||
sticky_done = false;
|
||||
mod_sticky |= 1<<mod;
|
||||
mod_sticky_done = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ void kbfun_modifier_sticky();
|
|||
void kbfun_modifier_press_release();
|
||||
void kbfun_mediakey_press_release();
|
||||
void kbfun_normal_press_release();
|
||||
void _kbfun_normal_sticky_done();
|
||||
bool _kbfun_modifier_is_pressed(keycode key);
|
||||
bool _kbfun_mediakey_is_pressed(keycode key);
|
||||
bool _kbfun_normal_is_pressed(keycode key);
|
||||
|
@ -25,13 +26,13 @@ void kbfun_layer_enable();
|
|||
bool is_layer_enable(keyfunc f);
|
||||
layer layer_peek(layer offset);
|
||||
void layer_disable_top();
|
||||
void layer_disable(layer l);
|
||||
void layer_enable(layer l);
|
||||
layer highest_active_layer(layer offset);
|
||||
void sticky_disable();
|
||||
void layer_disable(layer l);
|
||||
void exec_key();
|
||||
keycode kb_keycode(layer l,u8 row,u8 col);
|
||||
void main_key_loop();
|
||||
void init_sticky();
|
||||
void init_layers();
|
||||
void init_hw();
|
||||
int main();
|
||||
|
|
Loading…
Reference in New Issue