diff options
Diffstat (limited to 'quantum')
| -rw-r--r-- | quantum/action_layer.c | 10 | ||||
| -rw-r--r-- | quantum/action_layer.h | 21 | ||||
| -rw-r--r-- | quantum/keycodes.h | 6 | ||||
| -rw-r--r-- | quantum/process_keycode/process_tri_layer.c | 30 | ||||
| -rw-r--r-- | quantum/process_keycode/process_tri_layer.h | 16 | ||||
| -rw-r--r-- | quantum/quantum.c | 13 | ||||
| -rw-r--r-- | quantum/quantum.h | 7 | ||||
| -rw-r--r-- | quantum/tri_layer.c | 39 | ||||
| -rw-r--r-- | quantum/tri_layer.h | 59 |
9 files changed, 187 insertions, 14 deletions
diff --git a/quantum/action_layer.c b/quantum/action_layer.c index 74e8137920..35f494df8f 100644 --- a/quantum/action_layer.c +++ b/quantum/action_layer.c | |||
| @@ -349,3 +349,13 @@ uint8_t layer_switch_get_layer(keypos_t key) { | |||
| 349 | action_t layer_switch_get_action(keypos_t key) { | 349 | action_t layer_switch_get_action(keypos_t key) { |
| 350 | return action_for_key(layer_switch_get_layer(key), key); | 350 | return action_for_key(layer_switch_get_layer(key), key); |
| 351 | } | 351 | } |
| 352 | |||
| 353 | layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) { | ||
| 354 | layer_state_t mask12 = ((layer_state_t)1 << layer1) | ((layer_state_t)1 << layer2); | ||
| 355 | layer_state_t mask3 = (layer_state_t)1 << layer3; | ||
| 356 | return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3); | ||
| 357 | } | ||
| 358 | |||
| 359 | void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) { | ||
| 360 | layer_state_set(update_tri_layer_state(layer_state, layer1, layer2, layer3)); | ||
| 361 | } | ||
diff --git a/quantum/action_layer.h b/quantum/action_layer.h index 3fe2726529..ff783bb3e7 100644 --- a/quantum/action_layer.h +++ b/quantum/action_layer.h | |||
| @@ -113,6 +113,25 @@ void layer_and(layer_state_t state); | |||
| 113 | void layer_xor(layer_state_t state); | 113 | void layer_xor(layer_state_t state); |
| 114 | layer_state_t layer_state_set_user(layer_state_t state); | 114 | layer_state_t layer_state_set_user(layer_state_t state); |
| 115 | layer_state_t layer_state_set_kb(layer_state_t state); | 115 | layer_state_t layer_state_set_kb(layer_state_t state); |
| 116 | |||
| 117 | /** | ||
| 118 | * @brief Applies the tri layer to global layer state. Not be used in layer_state_set_(kb|user) functions. | ||
| 119 | * | ||
| 120 | * @param layer1 First layer to check for tri layer | ||
| 121 | * @param layer2 Second layer to check for tri layer | ||
| 122 | * @param layer3 Layer to activate if both other layers are enabled | ||
| 123 | */ | ||
| 124 | void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); | ||
| 125 | /** | ||
| 126 | * @brief Applies the tri layer behavior to supplied layer bitmask, without using layer functions. | ||
| 127 | * | ||
| 128 | * @param state Original layer bitmask to check and modify | ||
| 129 | * @param layer1 First layer to check for tri layer | ||
| 130 | * @param layer2 Second layer to check for tri layer | ||
| 131 | * @param layer3 Layer to activate if both other layers are enabled | ||
| 132 | * @return layer_state_t returns a modified layer bitmask with tri layer modifications applied | ||
| 133 | */ | ||
| 134 | layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3); | ||
| 116 | #else | 135 | #else |
| 117 | # define layer_state 0 | 136 | # define layer_state 0 |
| 118 | 137 | ||
| @@ -131,6 +150,8 @@ layer_state_t layer_state_set_kb(layer_state_t state); | |||
| 131 | # define layer_xor(state) (void)state | 150 | # define layer_xor(state) (void)state |
| 132 | # define layer_state_set_kb(state) (void)state | 151 | # define layer_state_set_kb(state) (void)state |
| 133 | # define layer_state_set_user(state) (void)state | 152 | # define layer_state_set_user(state) (void)state |
| 153 | # define update_tri_layer(layer1, layer2, layer3) | ||
| 154 | # define update_tri_layer_state(state, layer1, layer2, layer3) (void)state | ||
| 134 | #endif | 155 | #endif |
| 135 | 156 | ||
| 136 | /* pressed actions cache */ | 157 | /* pressed actions cache */ |
diff --git a/quantum/keycodes.h b/quantum/keycodes.h index f24ccf01b8..4fa4306ed6 100644 --- a/quantum/keycodes.h +++ b/quantum/keycodes.h | |||
| @@ -717,6 +717,8 @@ enum qk_keycode_defines { | |||
| 717 | QK_AUTOCORRECT_ON = 0x7C74, | 717 | QK_AUTOCORRECT_ON = 0x7C74, |
| 718 | QK_AUTOCORRECT_OFF = 0x7C75, | 718 | QK_AUTOCORRECT_OFF = 0x7C75, |
| 719 | QK_AUTOCORRECT_TOGGLE = 0x7C76, | 719 | QK_AUTOCORRECT_TOGGLE = 0x7C76, |
| 720 | QK_TRI_LAYER_LOWER = 0x7C77, | ||
| 721 | QK_TRI_LAYER_UPPER = 0x7C78, | ||
| 720 | SAFE_RANGE = 0x7E00, | 722 | SAFE_RANGE = 0x7E00, |
| 721 | 723 | ||
| 722 | // Alias | 724 | // Alias |
| @@ -1282,6 +1284,8 @@ enum qk_keycode_defines { | |||
| 1282 | AC_ON = QK_AUTOCORRECT_ON, | 1284 | AC_ON = QK_AUTOCORRECT_ON, |
| 1283 | AC_OFF = QK_AUTOCORRECT_OFF, | 1285 | AC_OFF = QK_AUTOCORRECT_OFF, |
| 1284 | AC_TOGG = QK_AUTOCORRECT_TOGGLE, | 1286 | AC_TOGG = QK_AUTOCORRECT_TOGGLE, |
| 1287 | TL_LOWR = QK_TRI_LAYER_LOWER, | ||
| 1288 | TL_UPPR = QK_TRI_LAYER_UPPER, | ||
| 1285 | }; | 1289 | }; |
| 1286 | 1290 | ||
| 1287 | // Range Helpers | 1291 | // Range Helpers |
| @@ -1333,4 +1337,4 @@ enum qk_keycode_defines { | |||
| 1333 | #define IS_MACRO_KEYCODE(code) ((code) >= QK_MACRO_0 && (code) <= QK_MACRO_31) | 1337 | #define IS_MACRO_KEYCODE(code) ((code) >= QK_MACRO_0 && (code) <= QK_MACRO_31) |
| 1334 | #define IS_BACKLIGHT_KEYCODE(code) ((code) >= QK_BACKLIGHT_ON && (code) <= QK_BACKLIGHT_TOGGLE_BREATHING) | 1338 | #define IS_BACKLIGHT_KEYCODE(code) ((code) >= QK_BACKLIGHT_ON && (code) <= QK_BACKLIGHT_TOGGLE_BREATHING) |
| 1335 | #define IS_RGB_KEYCODE(code) ((code) >= RGB_TOG && (code) <= RGB_MODE_TWINKLE) | 1339 | #define IS_RGB_KEYCODE(code) ((code) >= RGB_TOG && (code) <= RGB_MODE_TWINKLE) |
| 1336 | #define IS_QUANTUM_KEYCODE(code) ((code) >= QK_BOOTLOADER && (code) <= QK_AUTOCORRECT_TOGGLE) | 1340 | #define IS_QUANTUM_KEYCODE(code) ((code) >= QK_BOOTLOADER && (code) <= QK_TRI_LAYER_UPPER) |
diff --git a/quantum/process_keycode/process_tri_layer.c b/quantum/process_keycode/process_tri_layer.c new file mode 100644 index 0000000000..1e681b9a1c --- /dev/null +++ b/quantum/process_keycode/process_tri_layer.c | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | // Copyright 2023 QMK | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "process_tri_layer.h" | ||
| 5 | #include "tri_layer.h" | ||
| 6 | #include "action_layer.h" | ||
| 7 | |||
| 8 | bool process_tri_layer(uint16_t keycode, keyrecord_t *record) { | ||
| 9 | switch (keycode) { | ||
| 10 | case QK_TRI_LAYER_LOWER: | ||
| 11 | if (record->event.pressed) { | ||
| 12 | layer_on(get_tri_layer_lower_layer()); | ||
| 13 | update_tri_layer(get_tri_layer_lower_layer(), get_tri_layer_upper_layer(), get_tri_layer_adjust_layer()); | ||
| 14 | } else { | ||
| 15 | layer_off(get_tri_layer_lower_layer()); | ||
| 16 | update_tri_layer(get_tri_layer_lower_layer(), get_tri_layer_upper_layer(), get_tri_layer_adjust_layer()); | ||
| 17 | } | ||
| 18 | return false; | ||
| 19 | case QK_TRI_LAYER_UPPER: | ||
| 20 | if (record->event.pressed) { | ||
| 21 | layer_on(get_tri_layer_upper_layer()); | ||
| 22 | update_tri_layer(get_tri_layer_lower_layer(), get_tri_layer_upper_layer(), get_tri_layer_adjust_layer()); | ||
| 23 | } else { | ||
| 24 | layer_off(get_tri_layer_upper_layer()); | ||
| 25 | update_tri_layer(get_tri_layer_lower_layer(), get_tri_layer_upper_layer(), get_tri_layer_adjust_layer()); | ||
| 26 | } | ||
| 27 | return false; | ||
| 28 | } | ||
| 29 | return true; | ||
| 30 | } | ||
diff --git a/quantum/process_keycode/process_tri_layer.h b/quantum/process_keycode/process_tri_layer.h new file mode 100644 index 0000000000..9c4e3df1c2 --- /dev/null +++ b/quantum/process_keycode/process_tri_layer.h | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | // Copyright 2023 QMK | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include "action.h" | ||
| 7 | |||
| 8 | /** | ||
| 9 | * @brief Handles tri layer behavior | ||
| 10 | * | ||
| 11 | * @param keycode the keycode | ||
| 12 | * @param record the key record structure | ||
| 13 | * @return true continue handling keycodes | ||
| 14 | * @return false stop handling keycodes | ||
| 15 | */ | ||
| 16 | bool process_tri_layer(uint16_t keycode, keyrecord_t *record); | ||
diff --git a/quantum/quantum.c b/quantum/quantum.c index 5554ecab32..0587f215fe 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c | |||
| @@ -343,6 +343,9 @@ bool process_record_quantum(keyrecord_t *record) { | |||
| 343 | #ifdef AUTOCORRECT_ENABLE | 343 | #ifdef AUTOCORRECT_ENABLE |
| 344 | process_autocorrect(keycode, record) && | 344 | process_autocorrect(keycode, record) && |
| 345 | #endif | 345 | #endif |
| 346 | #ifdef TRI_LAYER_ENABLE | ||
| 347 | process_tri_layer(keycode, record) && | ||
| 348 | #endif | ||
| 346 | true)) { | 349 | true)) { |
| 347 | return false; | 350 | return false; |
| 348 | } | 351 | } |
| @@ -443,16 +446,6 @@ void set_single_persistent_default_layer(uint8_t default_layer) { | |||
| 443 | default_layer_set((layer_state_t)1 << default_layer); | 446 | default_layer_set((layer_state_t)1 << default_layer); |
| 444 | } | 447 | } |
| 445 | 448 | ||
| 446 | layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) { | ||
| 447 | layer_state_t mask12 = ((layer_state_t)1 << layer1) | ((layer_state_t)1 << layer2); | ||
| 448 | layer_state_t mask3 = (layer_state_t)1 << layer3; | ||
| 449 | return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3); | ||
| 450 | } | ||
| 451 | |||
| 452 | void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) { | ||
| 453 | layer_state_set(update_tri_layer_state(layer_state, layer1, layer2, layer3)); | ||
| 454 | } | ||
| 455 | |||
| 456 | //------------------------------------------------------------------------------ | 449 | //------------------------------------------------------------------------------ |
| 457 | // Override these functions in your keymap file to play different tunes on | 450 | // Override these functions in your keymap file to play different tunes on |
| 458 | // different events such as startup and bootloader jump | 451 | // different events such as startup and bootloader jump |
diff --git a/quantum/quantum.h b/quantum/quantum.h index 615ec2382c..708d325a32 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h | |||
| @@ -240,9 +240,10 @@ extern layer_state_t layer_state; | |||
| 240 | # include "process_autocorrect.h" | 240 | # include "process_autocorrect.h" |
| 241 | #endif | 241 | #endif |
| 242 | 242 | ||
| 243 | // For tri-layer | 243 | #ifdef TRI_LAYER_ENABLE |
| 244 | void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); | 244 | # include "tri_layer.h" |
| 245 | layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3); | 245 | # include "process_tri_layer.h" |
| 246 | #endif | ||
| 246 | 247 | ||
| 247 | void set_single_persistent_default_layer(uint8_t default_layer); | 248 | void set_single_persistent_default_layer(uint8_t default_layer); |
| 248 | 249 | ||
diff --git a/quantum/tri_layer.c b/quantum/tri_layer.c new file mode 100644 index 0000000000..a5e3f8cb47 --- /dev/null +++ b/quantum/tri_layer.c | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | // Copyright 2023 QMK | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "tri_layer.h" | ||
| 5 | #include <stdint.h> | ||
| 6 | |||
| 7 | static uint8_t tri_layer_lower_layer = TRI_LAYER_LOWER_LAYER; | ||
| 8 | static uint8_t tri_layer_upper_layer = TRI_LAYER_UPPER_LAYER; | ||
| 9 | static uint8_t tri_layer_adjust_layer = TRI_LAYER_ADJUST_LAYER; | ||
| 10 | |||
| 11 | void set_tri_layer_lower_layer(uint8_t layer) { | ||
| 12 | tri_layer_lower_layer = layer; | ||
| 13 | } | ||
| 14 | |||
| 15 | void set_tri_layer_upper_layer(uint8_t layer) { | ||
| 16 | tri_layer_upper_layer = layer; | ||
| 17 | } | ||
| 18 | |||
| 19 | void set_tri_layer_adjust_layer(uint8_t layer) { | ||
| 20 | tri_layer_adjust_layer = layer; | ||
| 21 | } | ||
| 22 | |||
| 23 | void set_tri_layer_layers(uint8_t lower, uint8_t raise, uint8_t adjust) { | ||
| 24 | tri_layer_lower_layer = lower; | ||
| 25 | tri_layer_upper_layer = raise; | ||
| 26 | tri_layer_adjust_layer = adjust; | ||
| 27 | } | ||
| 28 | |||
| 29 | uint8_t get_tri_layer_lower_layer(void) { | ||
| 30 | return tri_layer_lower_layer; | ||
| 31 | } | ||
| 32 | |||
| 33 | uint8_t get_tri_layer_upper_layer(void) { | ||
| 34 | return tri_layer_upper_layer; | ||
| 35 | } | ||
| 36 | |||
| 37 | uint8_t get_tri_layer_adjust_layer(void) { | ||
| 38 | return tri_layer_adjust_layer; | ||
| 39 | } | ||
diff --git a/quantum/tri_layer.h b/quantum/tri_layer.h new file mode 100644 index 0000000000..3341ebffb2 --- /dev/null +++ b/quantum/tri_layer.h | |||
| @@ -0,0 +1,59 @@ | |||
| 1 | // Copyright 2023 QMK | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include <stdint.h> | ||
| 5 | |||
| 6 | #ifndef TRI_LAYER_LOWER_LAYER | ||
| 7 | # define TRI_LAYER_LOWER_LAYER 1 | ||
| 8 | #endif | ||
| 9 | #ifndef TRI_LAYER_UPPER_LAYER | ||
| 10 | # define TRI_LAYER_UPPER_LAYER 2 | ||
| 11 | #endif | ||
| 12 | #ifndef TRI_LAYER_ADJUST_LAYER | ||
| 13 | # define TRI_LAYER_ADJUST_LAYER 3 | ||
| 14 | #endif | ||
| 15 | |||
| 16 | /** | ||
| 17 | * @brief Set the tri layer lower layer index | ||
| 18 | * | ||
| 19 | * @param layer | ||
| 20 | */ | ||
| 21 | void set_tri_layer_lower_layer(uint8_t layer); | ||
| 22 | /** | ||
| 23 | * @brief Set the tri layer upper layer index | ||
| 24 | * | ||
| 25 | * @param layer | ||
| 26 | */ | ||
| 27 | void set_tri_layer_upper_layer(uint8_t layer); | ||
| 28 | /** | ||
| 29 | * @brief Set the tri layer adjust layer index | ||
| 30 | * | ||
| 31 | * @param layer | ||
| 32 | */ | ||
| 33 | void set_tri_layer_adjust_layer(uint8_t layer); | ||
| 34 | /** | ||
| 35 | * @brief Set the tri layer indices | ||
| 36 | * | ||
| 37 | * @param lower | ||
| 38 | * @param upper | ||
| 39 | * @param adjust | ||
| 40 | */ | ||
| 41 | void set_tri_layer_layers(uint8_t lower, uint8_t upper, uint8_t adjust); | ||
| 42 | /** | ||
| 43 | * @brief Get the tri layer lower layer index | ||
| 44 | * | ||
| 45 | * @return uint8_t | ||
| 46 | */ | ||
| 47 | uint8_t get_tri_layer_lower_layer(void); | ||
| 48 | /** | ||
| 49 | * @brief Get the tri layer upper layer index | ||
| 50 | * | ||
| 51 | * @return uint8_t | ||
| 52 | */ | ||
| 53 | uint8_t get_tri_layer_upper_layer(void); | ||
| 54 | /** | ||
| 55 | * @brief Get the tri layer adjust layer index | ||
| 56 | * | ||
| 57 | * @return uint8_t | ||
| 58 | */ | ||
| 59 | uint8_t get_tri_layer_adjust_layer(void); | ||
