diff options
Diffstat (limited to 'common/layer_switch.c')
| -rw-r--r-- | common/layer_switch.c | 122 |
1 files changed, 67 insertions, 55 deletions
diff --git a/common/layer_switch.c b/common/layer_switch.c index 359e6b9d8..9905741f4 100644 --- a/common/layer_switch.c +++ b/common/layer_switch.c | |||
| @@ -7,94 +7,103 @@ | |||
| 7 | 7 | ||
| 8 | 8 | ||
| 9 | /* | 9 | /* |
| 10 | * Default Layer (0-15) | 10 | * Default Layer State |
| 11 | */ | 11 | */ |
| 12 | uint8_t default_layer = 0; | 12 | uint32_t default_layer_state = 0; |
| 13 | 13 | ||
| 14 | void default_layer_set(uint8_t layer) | 14 | static void default_layer_state_set(uint32_t state) |
| 15 | { | 15 | { |
| 16 | debug("default_layer_set: "); | 16 | debug("default_layer_state: "); |
| 17 | debug_dec(default_layer); debug(" to "); | 17 | default_layer_debug(); debug(" to "); |
| 18 | 18 | default_layer_state = state; | |
| 19 | default_layer = layer; | 19 | default_layer_debug(); debug("\n"); |
| 20 | |||
| 21 | debug_dec(default_layer); debug("\n"); | ||
| 22 | |||
| 23 | clear_keyboard_but_mods(); // To avoid stuck keys | 20 | clear_keyboard_but_mods(); // To avoid stuck keys |
| 24 | } | 21 | } |
| 25 | 22 | ||
| 26 | 23 | void default_layer_debug(void) | |
| 27 | #ifndef NO_ACTION_LAYER | ||
| 28 | /* | ||
| 29 | * Keymap Layer (0-15) | ||
| 30 | */ | ||
| 31 | uint16_t keymap_stat = 0; | ||
| 32 | |||
| 33 | /* return highest layer whose state is on */ | ||
| 34 | uint8_t keymap_get_layer(void) | ||
| 35 | { | 24 | { |
| 36 | return biton16(keymap_stat); | 25 | debug_hex32(default_layer_state); |
| 26 | debug("("); debug_dec(biton32(default_layer_state)); debug(")"); | ||
| 37 | } | 27 | } |
| 38 | 28 | ||
| 39 | static void keymap_stat_set(uint16_t stat) | 29 | void default_layer_set(uint8_t layer) |
| 40 | { | 30 | { |
| 41 | debug("keymap: "); | 31 | default_layer_state_set(1UL<<layer); |
| 42 | keymap_debug(); debug(" to "); | 32 | } |
| 43 | 33 | ||
| 44 | keymap_stat = stat; | 34 | #ifndef NO_ACTION_LAYER |
| 35 | void default_layer_or(uint32_t state) | ||
| 36 | { | ||
| 37 | default_layer_state_set(default_layer_state | state); | ||
| 38 | } | ||
| 39 | void default_layer_and(uint32_t state) | ||
| 40 | { | ||
| 41 | default_layer_state_set(default_layer_state & state); | ||
| 42 | } | ||
| 43 | void default_layer_xor(uint32_t state) | ||
| 44 | { | ||
| 45 | default_layer_state_set(default_layer_state ^ state); | ||
| 46 | } | ||
| 47 | #endif | ||
| 45 | 48 | ||
| 46 | keymap_debug(); debug("\n"); | ||
| 47 | 49 | ||
| 48 | clear_keyboard_but_mods(); // To avoid stuck keys | 50 | #ifndef NO_ACTION_LAYER |
| 49 | } | 51 | /* |
| 52 | * Keymap Layer State | ||
| 53 | */ | ||
| 54 | uint32_t layer_state = 0; | ||
| 50 | 55 | ||
| 51 | void keymap_clear(void) | 56 | static void layer_state_set(uint32_t state) |
| 52 | { | 57 | { |
| 53 | keymap_stat_set(0); | 58 | debug("layer_state: "); |
| 59 | layer_debug(); debug(" to "); | ||
| 60 | layer_state = state; | ||
| 61 | layer_debug(); debug("\n"); | ||
| 62 | clear_keyboard_but_mods(); // To avoid stuck keys | ||
| 54 | } | 63 | } |
| 55 | 64 | ||
| 56 | 65 | void layer_clear(void) | |
| 57 | void keymap_set(uint16_t stat) | ||
| 58 | { | 66 | { |
| 59 | keymap_stat_set(stat); | 67 | layer_state_set(0); |
| 60 | } | 68 | } |
| 61 | 69 | ||
| 62 | void keymap_move(uint8_t layer) | 70 | void layer_move(uint8_t layer) |
| 63 | { | 71 | { |
| 64 | keymap_stat_set(1<<layer); | 72 | layer_state_set(1UL<<layer); |
| 65 | } | 73 | } |
| 66 | 74 | ||
| 67 | void keymap_on(uint8_t layer) | 75 | void layer_on(uint8_t layer) |
| 68 | { | 76 | { |
| 69 | keymap_stat_set(keymap_stat | (1<<layer)); | 77 | layer_state_set(layer_state | (1UL<<layer)); |
| 70 | } | 78 | } |
| 71 | 79 | ||
| 72 | void keymap_off(uint8_t layer) | 80 | void layer_off(uint8_t layer) |
| 73 | { | 81 | { |
| 74 | keymap_stat_set(keymap_stat & ~(1<<layer)); | 82 | layer_state_set(layer_state & ~(1UL<<layer)); |
| 75 | } | 83 | } |
| 76 | 84 | ||
| 77 | void keymap_invert(uint8_t layer) | 85 | void layer_invert(uint8_t layer) |
| 78 | { | 86 | { |
| 79 | keymap_stat_set(keymap_stat ^ (1<<layer)); | 87 | layer_state_set(layer_state ^ (1UL<<layer)); |
| 80 | } | 88 | } |
| 81 | 89 | ||
| 82 | void keymap_or(uint16_t stat) | 90 | void layer_or(uint32_t state) |
| 83 | { | 91 | { |
| 84 | keymap_stat_set(keymap_stat | stat); | 92 | layer_state_set(layer_state | state); |
| 85 | } | 93 | } |
| 86 | void keymap_and(uint16_t stat) | 94 | void layer_and(uint32_t state) |
| 87 | { | 95 | { |
| 88 | keymap_stat_set(keymap_stat & stat); | 96 | layer_state_set(layer_state & state); |
| 89 | } | 97 | } |
| 90 | void keymap_xor(uint16_t stat) | 98 | void layer_xor(uint32_t state) |
| 91 | { | 99 | { |
| 92 | keymap_stat_set(keymap_stat ^ stat); | 100 | layer_state_set(layer_state ^ state); |
| 93 | } | 101 | } |
| 94 | 102 | ||
| 95 | void keymap_debug(void) | 103 | void layer_debug(void) |
| 96 | { | 104 | { |
| 97 | debug_hex16(keymap_stat); debug("("); debug_dec(keymap_get_layer()); debug(")"); | 105 | debug_hex32(layer_state); |
| 106 | debug("("); debug_dec(biton32(layer_state)); debug(")"); | ||
| 98 | } | 107 | } |
| 99 | #endif | 108 | #endif |
| 100 | 109 | ||
| @@ -106,18 +115,21 @@ action_t layer_switch_get_action(key_t key) | |||
| 106 | action.code = ACTION_TRANSPARENT; | 115 | action.code = ACTION_TRANSPARENT; |
| 107 | 116 | ||
| 108 | #ifndef NO_ACTION_LAYER | 117 | #ifndef NO_ACTION_LAYER |
| 109 | /* keymap: top layer first */ | 118 | uint32_t layers = layer_state | default_layer_state; |
| 110 | for (int8_t i = 15; i >= 0; i--) { | 119 | /* check top layer first */ |
| 111 | if (keymap_stat & (1<<i)) { | 120 | for (int8_t i = 31; i >= 0; i--) { |
| 121 | if (layers & (1UL<<i)) { | ||
| 112 | action = action_for_key(i, key); | 122 | action = action_for_key(i, key); |
| 113 | if (action.code != ACTION_TRANSPARENT) { | 123 | if (action.code != ACTION_TRANSPARENT) { |
| 114 | return action; | 124 | return action; |
| 115 | } | 125 | } |
| 116 | } | 126 | } |
| 117 | } | 127 | } |
| 118 | #endif | 128 | /* fall back to layer 0 */ |
| 119 | 129 | action = action_for_key(0, key); | |
| 120 | /* default layer */ | 130 | return action; |
| 121 | action = action_for_key(default_layer, key); | 131 | #else |
| 132 | action = action_for_key(biton32(default_layer_state), key); | ||
| 122 | return action; | 133 | return action; |
| 134 | #endif | ||
| 123 | } | 135 | } |
