diff options
author | tmk <nobody@nowhere> | 2013-03-05 15:45:15 +0900 |
---|---|---|
committer | tmk <nobody@nowhere> | 2013-03-05 15:45:15 +0900 |
commit | 38bbe976e00a9a7bf6f8157016717e80503bf6a9 (patch) | |
tree | 9113cd57c1bff3deef394ee966e2fdac8731a244 /common/layer_switch.c | |
parent | 1720cf34caa518a2cf85f286d1ca077ebe1a1451 (diff) | |
parent | 5808317b694004c43a6e0f76e9715415cce19a25 (diff) |
Merge branch 'overlays'
Diffstat (limited to 'common/layer_switch.c')
-rw-r--r-- | common/layer_switch.c | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/common/layer_switch.c b/common/layer_switch.c new file mode 100644 index 0000000000..19e286f885 --- /dev/null +++ b/common/layer_switch.c @@ -0,0 +1,201 @@ +#include <stdint.h> +#include "keyboard.h" +#include "action.h" +#include "debug.h" +#include "util.h" +#include "layer_switch.h" + + +/* + * Default Layer (0-15) + */ +uint8_t default_layer = 0; + +void default_layer_set(uint8_t layer) +{ + debug("default_layer_set: "); + debug_dec(default_layer); debug(" to "); + + default_layer = layer; + + debug_dec(default_layer); debug("\n"); + + clear_keyboard_but_mods(); // To avoid stuck keys +} + + +/* + * Keymap Layer (0-15) + */ +uint16_t keymap_stat = 0; + +/* return highest layer whose state is on */ +uint8_t keymap_get_layer(void) +{ + return biton16(keymap_stat); +} + +static void keymap_stat_set(uint16_t stat) +{ + debug("keymap: "); + keymap_debug(); debug(" to "); + + keymap_stat = stat; + + keymap_debug(); debug("\n"); + + clear_keyboard_but_mods(); // To avoid stuck keys +} + +void keymap_clear(void) +{ + keymap_stat_set(0); +} + + +void keymap_set(uint16_t stat) +{ + keymap_stat_set(stat); +} + +void keymap_move(uint8_t layer) +{ + keymap_stat_set(1<<layer); +} + +void keymap_on(uint8_t layer) +{ + keymap_stat_set(keymap_stat | (1<<layer)); +} + +void keymap_off(uint8_t layer) +{ + keymap_stat_set(keymap_stat & ~(1<<layer)); +} + +void keymap_invert(uint8_t layer) +{ + keymap_stat_set(keymap_stat ^ (1<<layer)); +} + +void keymap_or(uint16_t stat) +{ + keymap_stat_set(keymap_stat | stat); +} +void keymap_and(uint16_t stat) +{ + keymap_stat_set(keymap_stat & stat); +} +void keymap_xor(uint16_t stat) +{ + keymap_stat_set(keymap_stat ^ stat); +} + +void keymap_debug(void) +{ + debug_hex16(keymap_stat); debug("("); debug_dec(keymap_get_layer()); debug(")"); +} + + + +/* + * Overlay Layer (16-31 = 0-15|0x10) + */ +uint16_t overlay_stat = 0; + +/* return highest layer whose state is on */ +uint8_t overlay_get_layer(void) +{ + return biton16(overlay_stat); +} + +static void overlay_stat_set(uint16_t stat) +{ + debug("overlay: "); + overlay_debug(); debug(" to "); + + overlay_stat = stat; + + overlay_debug(); debug("\n"); + + clear_keyboard_but_mods(); // To avoid stuck keys +} + +void overlay_clear(void) +{ + overlay_stat_set(0); +} + + +void overlay_set(uint16_t stat) +{ + overlay_stat_set(stat); +} + +void overlay_move(uint8_t layer) +{ + overlay_stat_set(1<<layer); +} + +void overlay_on(uint8_t layer) +{ + overlay_stat_set(overlay_stat | (1<<layer)); +} + +void overlay_off(uint8_t layer) +{ + overlay_stat_set(overlay_stat & ~(1<<layer)); +} + +void overlay_invert(uint8_t layer) +{ + overlay_stat_set(overlay_stat ^ (1<<layer)); +} + +void overlay_or(uint16_t stat) +{ + overlay_stat_set(overlay_stat | stat); +} +void overlay_and(uint16_t stat) +{ + overlay_stat_set(overlay_stat & stat); +} +void overlay_xor(uint16_t stat) +{ + overlay_stat_set(overlay_stat ^ stat); +} + +void overlay_debug(void) +{ + debug_hex16(overlay_stat); debug("("); debug_dec(overlay_get_layer()); debug(")"); +} + +action_t layer_switch_get_action(key_t key) +{ + action_t action; + action.code = ACTION_TRANSPARENT; + + /* overlay: top layer first */ + for (int8_t i = 15; i >= 0; i--) { + if (overlay_stat & (1<<i)) { + action = action_for_key(i | OVERLAY_BIT, key); + if (action.code != ACTION_TRANSPARENT) { + return action; + } + } + } + + /* keymap: top layer first */ + for (int8_t i = 15; i >= 0; i--) { + if (keymap_stat & (1<<i)) { + action = action_for_key(i, key); + if (action.code != ACTION_TRANSPARENT) { + return action; + } + } + } + + /* default layer */ + action = action_for_key(default_layer, key); + return action; +} |