summaryrefslogtreecommitdiff
path: root/quantum
diff options
context:
space:
mode:
Diffstat (limited to 'quantum')
-rw-r--r--quantum/action_layer.c10
-rw-r--r--quantum/action_layer.h21
-rw-r--r--quantum/keycodes.h6
-rw-r--r--quantum/process_keycode/process_tri_layer.c30
-rw-r--r--quantum/process_keycode/process_tri_layer.h16
-rw-r--r--quantum/quantum.c13
-rw-r--r--quantum/quantum.h7
-rw-r--r--quantum/tri_layer.c39
-rw-r--r--quantum/tri_layer.h59
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) {
349action_t layer_switch_get_action(keypos_t key) { 349action_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
353layer_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
359void 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);
113void layer_xor(layer_state_t state); 113void layer_xor(layer_state_t state);
114layer_state_t layer_state_set_user(layer_state_t state); 114layer_state_t layer_state_set_user(layer_state_t state);
115layer_state_t layer_state_set_kb(layer_state_t state); 115layer_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 */
124void 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 */
134layer_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
8bool 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 */
16bool 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
446layer_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
452void 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
244void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); 244# include "tri_layer.h"
245layer_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
247void set_single_persistent_default_layer(uint8_t default_layer); 248void 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
7static uint8_t tri_layer_lower_layer = TRI_LAYER_LOWER_LAYER;
8static uint8_t tri_layer_upper_layer = TRI_LAYER_UPPER_LAYER;
9static uint8_t tri_layer_adjust_layer = TRI_LAYER_ADJUST_LAYER;
10
11void set_tri_layer_lower_layer(uint8_t layer) {
12 tri_layer_lower_layer = layer;
13}
14
15void set_tri_layer_upper_layer(uint8_t layer) {
16 tri_layer_upper_layer = layer;
17}
18
19void set_tri_layer_adjust_layer(uint8_t layer) {
20 tri_layer_adjust_layer = layer;
21}
22
23void 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
29uint8_t get_tri_layer_lower_layer(void) {
30 return tri_layer_lower_layer;
31}
32
33uint8_t get_tri_layer_upper_layer(void) {
34 return tri_layer_upper_layer;
35}
36
37uint8_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 */
21void set_tri_layer_lower_layer(uint8_t layer);
22/**
23 * @brief Set the tri layer upper layer index
24 *
25 * @param layer
26 */
27void set_tri_layer_upper_layer(uint8_t layer);
28/**
29 * @brief Set the tri layer adjust layer index
30 *
31 * @param layer
32 */
33void 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 */
41void 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 */
47uint8_t get_tri_layer_lower_layer(void);
48/**
49 * @brief Get the tri layer upper layer index
50 *
51 * @return uint8_t
52 */
53uint8_t get_tri_layer_upper_layer(void);
54/**
55 * @brief Get the tri layer adjust layer index
56 *
57 * @return uint8_t
58 */
59uint8_t get_tri_layer_adjust_layer(void);