aboutsummaryrefslogtreecommitdiff
path: root/quantum
diff options
context:
space:
mode:
Diffstat (limited to 'quantum')
-rw-r--r--quantum/action.c2
-rw-r--r--quantum/audio/audio.c27
-rw-r--r--quantum/audio/audio.h6
-rw-r--r--quantum/color.c2
-rw-r--r--quantum/color.h4
-rw-r--r--quantum/eeconfig.c6
-rw-r--r--quantum/eeconfig.h64
-rw-r--r--quantum/keyboard.c4
-rw-r--r--quantum/keycodes.h20
-rw-r--r--quantum/keymap_extras/keymap_czech_mac_ansi.h162
-rw-r--r--quantum/keymap_extras/keymap_czech_mac_iso.h162
-rw-r--r--quantum/keymap_extras/sendstring_czech_mac_ansi.h120
-rw-r--r--quantum/keymap_extras/sendstring_czech_mac_iso.h120
-rw-r--r--quantum/led_matrix/led_matrix.c2
-rw-r--r--quantum/led_matrix/led_matrix.h2
-rw-r--r--quantum/led_matrix/led_matrix_drivers.c8
-rw-r--r--quantum/led_matrix/led_matrix_drivers.h2
-rw-r--r--quantum/main.c35
-rw-r--r--quantum/pointing_device/pointing_device_auto_mouse.c20
-rw-r--r--quantum/pointing_device/pointing_device_auto_mouse.h4
-rw-r--r--quantum/process_keycode/process_backlight.c30
-rw-r--r--quantum/process_keycode/process_led_matrix.c47
-rw-r--r--quantum/process_keycode/process_led_matrix.h10
-rw-r--r--quantum/quantum.c11
-rw-r--r--quantum/quantum_keycodes_legacy.h53
-rw-r--r--quantum/rgb_matrix/rgb_matrix.c2
-rw-r--r--quantum/rgb_matrix/rgb_matrix.h2
-rw-r--r--quantum/rgb_matrix/rgb_matrix_drivers.c11
-rw-r--r--quantum/rgb_matrix/rgb_matrix_drivers.h2
-rw-r--r--quantum/rgblight/rgblight.c38
-rw-r--r--quantum/rgblight/rgblight.h7
-rw-r--r--quantum/rgblight/rgblight_drivers.c2
-rw-r--r--quantum/rgblight/rgblight_drivers.h1
-rw-r--r--quantum/split_common/transactions.c5
-rw-r--r--quantum/split_common/transport.h1
35 files changed, 827 insertions, 167 deletions
diff --git a/quantum/action.c b/quantum/action.c
index 8dae32b2cb..74ef55e5eb 100644
--- a/quantum/action.c
+++ b/quantum/action.c
@@ -658,7 +658,6 @@ void process_action(keyrecord_t *record, action_t action) {
layer_off(action.layer_tap.val);
break;
} else if (tap_count < ONESHOT_TAP_TOGGLE) {
- layer_on(action.layer_tap.val);
set_oneshot_layer(action.layer_tap.val, ONESHOT_START);
}
} else {
@@ -671,7 +670,6 @@ void process_action(keyrecord_t *record, action_t action) {
}
# else
if (event.pressed) {
- layer_on(action.layer_tap.val);
set_oneshot_layer(action.layer_tap.val, ONESHOT_START);
} else {
clear_oneshot_layer_state(ONESHOT_PRESSED);
diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c
index c1a1500493..b2611c5f09 100644
--- a/quantum/audio/audio.c
+++ b/quantum/audio/audio.c
@@ -20,6 +20,7 @@
#include "debug.h"
#include "wait.h"
#include "util.h"
+#include "gpio.h"
/* audio system:
*
@@ -121,6 +122,32 @@ static bool audio_initialized = false;
static bool audio_driver_stopped = true;
audio_config_t audio_config;
+#ifndef AUDIO_POWER_CONTROL_PIN_ON_STATE
+# define AUDIO_POWER_CONTROL_PIN_ON_STATE 1
+#endif
+
+void audio_driver_initialize(void) {
+#ifdef AUDIO_POWER_CONTROL_PIN
+ gpio_set_pin_output_push_pull(AUDIO_POWER_CONTROL_PIN);
+ gpio_write_pin(AUDIO_POWER_CONTROL_PIN, !AUDIO_POWER_CONTROL_PIN_ON_STATE);
+#endif
+ audio_driver_initialize_impl();
+}
+
+void audio_driver_stop(void) {
+ audio_driver_stop_impl();
+#ifdef AUDIO_POWER_CONTROL_PIN
+ gpio_write_pin(AUDIO_POWER_CONTROL_PIN, !AUDIO_POWER_CONTROL_PIN_ON_STATE);
+#endif
+}
+
+void audio_driver_start(void) {
+#ifdef AUDIO_POWER_CONTROL_PIN
+ gpio_write_pin(AUDIO_POWER_CONTROL_PIN, AUDIO_POWER_CONTROL_PIN_ON_STATE);
+#endif
+ audio_driver_start_impl();
+}
+
void eeconfig_update_audio_current(void) {
eeconfig_update_audio(audio_config.raw);
}
diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h
index eb0bedc6f9..054331d6f3 100644
--- a/quantum/audio/audio.h
+++ b/quantum/audio/audio.h
@@ -215,9 +215,9 @@ void audio_startup(void);
// hardware interface
// implementation in the driver_avr/arm_* respective parts
-void audio_driver_initialize(void);
-void audio_driver_start(void);
-void audio_driver_stop(void);
+void audio_driver_initialize_impl(void);
+void audio_driver_start_impl(void);
+void audio_driver_stop_impl(void);
/**
* @brief get the number of currently active tones
diff --git a/quantum/color.c b/quantum/color.c
index 395383f428..96d548a33c 100644
--- a/quantum/color.c
+++ b/quantum/color.c
@@ -109,7 +109,7 @@ RGB hsv_to_rgb_nocie(HSV hsv) {
return hsv_to_rgb_impl(hsv, false);
}
-#ifdef RGBW
+#ifdef WS2812_RGBW
void convert_rgb_to_rgbw(rgb_led_t *led) {
// Determine lowest value in all three colors, put that into
// the white channel and then shift all colors by that amount
diff --git a/quantum/color.h b/quantum/color.h
index 00a3bfb3f8..b6a9dd0641 100644
--- a/quantum/color.h
+++ b/quantum/color.h
@@ -96,7 +96,7 @@ typedef struct PACKED rgb_led_t {
uint8_t g;
uint8_t r;
#endif
-#ifdef RGBW
+#ifdef WS2812_RGBW
uint8_t w;
#endif
} rgb_led_t;
@@ -111,6 +111,6 @@ typedef struct PACKED HSV {
RGB hsv_to_rgb(HSV hsv);
RGB hsv_to_rgb_nocie(HSV hsv);
-#ifdef RGBW
+#ifdef WS2812_RGBW
void convert_rgb_to_rgbw(rgb_led_t *led);
#endif
diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c
index 2d2180b4b4..40690d6a97 100644
--- a/quantum/eeconfig.c
+++ b/quantum/eeconfig.c
@@ -19,6 +19,8 @@ void via_eeprom_set_valid(bool valid);
void eeconfig_init_via(void);
#endif
+_Static_assert((intptr_t)EECONFIG_HANDEDNESS == 14, "EEPROM handedness offset is incorrect");
+
/** \brief eeconfig enable
*
* FIXME: needs doc
@@ -57,11 +59,9 @@ void eeconfig_init_quantum(void) {
eeprom_update_byte(EECONFIG_AUDIO, 0);
eeprom_update_dword(EECONFIG_RGBLIGHT, 0);
eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, 0);
- eeprom_update_byte(EECONFIG_UNUSED, 0);
eeprom_update_byte(EECONFIG_UNICODEMODE, 0);
eeprom_update_byte(EECONFIG_STENOMODE, 0);
- uint64_t dummy = 0;
- eeprom_update_block(&dummy, EECONFIG_RGB_MATRIX, sizeof(uint64_t));
+ eeprom_write_qword(EECONFIG_RGB_MATRIX, 0);
eeprom_update_dword(EECONFIG_HAPTIC, 0);
#if defined(HAPTIC_ENABLE)
haptic_reset();
diff --git a/quantum/eeconfig.h b/quantum/eeconfig.h
index d7cce166bd..fa0dd799d1 100644
--- a/quantum/eeconfig.h
+++ b/quantum/eeconfig.h
@@ -19,37 +19,57 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdint.h>
#include <stdbool.h>
+#include <stddef.h> // offsetof
#include "eeprom.h"
+#include "util.h"
#ifndef EECONFIG_MAGIC_NUMBER
-# define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE6 // When changing, decrement this value to avoid future re-init issues
+# define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE5 // When changing, decrement this value to avoid future re-init issues
#endif
#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF
+// Dummy struct only used to calculate offsets
+typedef struct PACKED {
+ uint16_t magic;
+ uint8_t debug;
+ uint8_t default_layer;
+ uint16_t keymap;
+ uint8_t backlight;
+ uint8_t audio;
+ uint32_t rgblight;
+ uint8_t unicode;
+ uint8_t steno;
+ uint8_t handedness;
+ uint32_t keyboard;
+ uint32_t user;
+ union { // Mutually exclusive
+ uint32_t led_matrix;
+ uint64_t rgb_matrix;
+ };
+ uint32_t haptic;
+ uint8_t rgblight_ext;
+} eeprom_core_t;
+
/* EEPROM parameter address */
-#define EECONFIG_MAGIC (uint16_t *)0
-#define EECONFIG_DEBUG (uint8_t *)2
-#define EECONFIG_DEFAULT_LAYER (uint8_t *)3
-#define EECONFIG_KEYMAP (uint16_t *)4
-#define EECONFIG_BACKLIGHT (uint8_t *)6
-#define EECONFIG_AUDIO (uint8_t *)7
-#define EECONFIG_RGBLIGHT (uint32_t *)8
-#define EECONFIG_UNICODEMODE (uint8_t *)12
-#define EECONFIG_STENOMODE (uint8_t *)13
-// EEHANDS for two handed boards
-#define EECONFIG_HANDEDNESS (uint8_t *)14
-#define EECONFIG_KEYBOARD (uint32_t *)15
-#define EECONFIG_USER (uint32_t *)19
-#define EECONFIG_UNUSED (uint8_t *)23
-// Mutually exclusive
-#define EECONFIG_LED_MATRIX (uint32_t *)24
-#define EECONFIG_RGB_MATRIX (uint64_t *)24
-
-#define EECONFIG_HAPTIC (uint32_t *)32
-#define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)36
+#define EECONFIG_MAGIC (uint16_t *)(offsetof(eeprom_core_t, magic))
+#define EECONFIG_DEBUG (uint8_t *)(offsetof(eeprom_core_t, debug))
+#define EECONFIG_DEFAULT_LAYER (uint8_t *)(offsetof(eeprom_core_t, default_layer))
+#define EECONFIG_KEYMAP (uint16_t *)(offsetof(eeprom_core_t, keymap))
+#define EECONFIG_BACKLIGHT (uint8_t *)(offsetof(eeprom_core_t, backlight))
+#define EECONFIG_AUDIO (uint8_t *)(offsetof(eeprom_core_t, audio))
+#define EECONFIG_RGBLIGHT (uint32_t *)(offsetof(eeprom_core_t, rgblight))
+#define EECONFIG_UNICODEMODE (uint8_t *)(offsetof(eeprom_core_t, unicode))
+#define EECONFIG_STENOMODE (uint8_t *)(offsetof(eeprom_core_t, steno))
+#define EECONFIG_HANDEDNESS (uint8_t *)(offsetof(eeprom_core_t, handedness))
+#define EECONFIG_KEYBOARD (uint32_t *)(offsetof(eeprom_core_t, keyboard))
+#define EECONFIG_USER (uint32_t *)(offsetof(eeprom_core_t, user))
+#define EECONFIG_LED_MATRIX (uint32_t *)(offsetof(eeprom_core_t, led_matrix))
+#define EECONFIG_RGB_MATRIX (uint64_t *)(offsetof(eeprom_core_t, rgb_matrix))
+#define EECONFIG_HAPTIC (uint32_t *)(offsetof(eeprom_core_t, haptic))
+#define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)(offsetof(eeprom_core_t, rgblight_ext))
// Size of EEPROM being used for core data storage
-#define EECONFIG_BASE_SIZE 37
+#define EECONFIG_BASE_SIZE ((uint8_t)sizeof(eeprom_core_t))
// Size of EEPROM dedicated to keyboard- and user-specific data
#ifndef EECONFIG_KB_DATA_SIZE
diff --git a/quantum/keyboard.c b/quantum/keyboard.c
index 5aaa4b452f..df1dc1c3ee 100644
--- a/quantum/keyboard.c
+++ b/quantum/keyboard.c
@@ -500,10 +500,10 @@ void keyboard_init(void) {
*/
void switch_events(uint8_t row, uint8_t col, bool pressed) {
#if defined(LED_MATRIX_ENABLE)
- process_led_matrix(row, col, pressed);
+ led_matrix_handle_key_event(row, col, pressed);
#endif
#if defined(RGB_MATRIX_ENABLE)
- process_rgb_matrix(row, col, pressed);
+ rgb_matrix_handle_key_event(row, col, pressed);
#endif
}
diff --git a/quantum/keycodes.h b/quantum/keycodes.h
index 69d62b5731..da1012cf12 100644
--- a/quantum/keycodes.h
+++ b/quantum/keycodes.h
@@ -627,6 +627,15 @@ enum qk_keycode_defines {
QK_BACKLIGHT_UP = 0x7804,
QK_BACKLIGHT_STEP = 0x7805,
QK_BACKLIGHT_TOGGLE_BREATHING = 0x7806,
+ QK_LED_MATRIX_ON = 0x7810,
+ QK_LED_MATRIX_OFF = 0x7811,
+ QK_LED_MATRIX_TOGGLE = 0x7812,
+ QK_LED_MATRIX_MODE_NEXT = 0x7813,
+ QK_LED_MATRIX_MODE_PREVIOUS = 0x7814,
+ QK_LED_MATRIX_BRIGHTNESS_UP = 0x7815,
+ QK_LED_MATRIX_BRIGHTNESS_DOWN = 0x7816,
+ QK_LED_MATRIX_SPEED_UP = 0x7817,
+ QK_LED_MATRIX_SPEED_DOWN = 0x7818,
RGB_TOG = 0x7820,
RGB_MODE_FORWARD = 0x7821,
RGB_MODE_REVERSE = 0x7822,
@@ -1281,6 +1290,15 @@ enum qk_keycode_defines {
BL_UP = QK_BACKLIGHT_UP,
BL_STEP = QK_BACKLIGHT_STEP,
BL_BRTG = QK_BACKLIGHT_TOGGLE_BREATHING,
+ LM_ON = QK_LED_MATRIX_ON,
+ LM_OFF = QK_LED_MATRIX_OFF,
+ LM_TOGG = QK_LED_MATRIX_TOGGLE,
+ LM_NEXT = QK_LED_MATRIX_MODE_NEXT,
+ LM_PREV = QK_LED_MATRIX_MODE_PREVIOUS,
+ LM_BRIU = QK_LED_MATRIX_BRIGHTNESS_UP,
+ LM_BRID = QK_LED_MATRIX_BRIGHTNESS_DOWN,
+ LM_SPDU = QK_LED_MATRIX_SPEED_UP,
+ LM_SPDD = QK_LED_MATRIX_SPEED_DOWN,
RGB_MOD = RGB_MODE_FORWARD,
RGB_RMOD = RGB_MODE_REVERSE,
RGB_M_P = RGB_MODE_PLAIN,
@@ -1416,6 +1434,7 @@ enum qk_keycode_defines {
#define IS_STENO_KEYCODE(code) ((code) >= QK_STENO_BOLT && (code) <= QK_STENO_COMB_MAX)
#define IS_MACRO_KEYCODE(code) ((code) >= QK_MACRO_0 && (code) <= QK_MACRO_31)
#define IS_BACKLIGHT_KEYCODE(code) ((code) >= QK_BACKLIGHT_ON && (code) <= QK_BACKLIGHT_TOGGLE_BREATHING)
+#define IS_LED_MATRIX_KEYCODE(code) ((code) >= QK_LED_MATRIX_ON && (code) <= QK_LED_MATRIX_SPEED_DOWN)
#define IS_RGB_KEYCODE(code) ((code) >= RGB_TOG && (code) <= RGB_MODE_TWINKLE)
#define IS_QUANTUM_KEYCODE(code) ((code) >= QK_BOOTLOADER && (code) <= QK_ALT_REPEAT_KEY)
#define IS_KB_KEYCODE(code) ((code) >= QK_KB_0 && (code) <= QK_KB_31)
@@ -1438,6 +1457,7 @@ enum qk_keycode_defines {
#define STENO_KEYCODE_RANGE QK_STENO_BOLT ... QK_STENO_COMB_MAX
#define MACRO_KEYCODE_RANGE QK_MACRO_0 ... QK_MACRO_31
#define BACKLIGHT_KEYCODE_RANGE QK_BACKLIGHT_ON ... QK_BACKLIGHT_TOGGLE_BREATHING
+#define LED_MATRIX_KEYCODE_RANGE QK_LED_MATRIX_ON ... QK_LED_MATRIX_SPEED_DOWN
#define RGB_KEYCODE_RANGE RGB_TOG ... RGB_MODE_TWINKLE
#define QUANTUM_KEYCODE_RANGE QK_BOOTLOADER ... QK_ALT_REPEAT_KEY
#define KB_KEYCODE_RANGE QK_KB_0 ... QK_KB_31
diff --git a/quantum/keymap_extras/keymap_czech_mac_ansi.h b/quantum/keymap_extras/keymap_czech_mac_ansi.h
new file mode 100644
index 0000000000..ac2f078d98
--- /dev/null
+++ b/quantum/keymap_extras/keymap_czech_mac_ansi.h
@@ -0,0 +1,162 @@
+// Copyright 2024 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*******************************************************************************
+ 88888888888 888 d8b .d888 d8b 888 d8b
+ 888 888 Y8P d88P" Y8P 888 Y8P
+ 888 888 888 888
+ 888 88888b. 888 .d8888b 888888 888 888 .d88b. 888 .d8888b
+ 888 888 "88b 888 88K 888 888 888 d8P Y8b 888 88K
+ 888 888 888 888 "Y8888b. 888 888 888 88888888 888 "Y8888b.
+ 888 888 888 888 X88 888 888 888 Y8b. 888 X88
+ 888 888 888 888 88888P' 888 888 888 "Y8888 888 88888P'
+ 888 888
+ 888 888
+ 888 888
+ .d88b. .d88b. 88888b. .d88b. 888d888 8888b. 888888 .d88b. .d88888
+ d88P"88b d8P Y8b 888 "88b d8P Y8b 888P" "88b 888 d8P Y8b d88" 888
+ 888 888 88888888 888 888 88888888 888 .d888888 888 88888888 888 888
+ Y88b 888 Y8b. 888 888 Y8b. 888 888 888 Y88b. Y8b. Y88b 888
+ "Y88888 "Y8888 888 888 "Y8888 888 "Y888888 "Y888 "Y8888 "Y88888
+ 888
+ Y8b d88P
+ "Y88P"
+*******************************************************************************/
+
+#pragma once
+#include "keycodes.h"
+// clang-format off
+
+// Aliases
+#define CZ_BSLS KC_GRV // (backslash)
+#define CZ_PLUS KC_1 // +
+#define CZ_ECAR KC_2 // ě
+#define CZ_SCAR KC_3 // š
+#define CZ_CCAR KC_4 // č
+#define CZ_RCAR KC_5 // ř
+#define CZ_ZCAR KC_6 // ž
+#define CZ_YACU KC_7 // ý
+#define CZ_AACU KC_8 // á
+#define CZ_IACU KC_9 // í
+#define CZ_EACU KC_0 // é
+#define CZ_EQL KC_MINS // =
+#define CZ_ACUT KC_EQL // ' (dead)
+#define CZ_Q KC_Q // Q
+#define CZ_W KC_W // W
+#define CZ_E KC_E // E
+#define CZ_R KC_R // R
+#define CZ_T KC_T // T
+#define CZ_Z KC_Y // Z
+#define CZ_U KC_U // U
+#define CZ_I KC_I // I
+#define CZ_O KC_O // O
+#define CZ_P KC_P // P
+#define CZ_UACU KC_LBRC // ú
+#define CZ_RPRN KC_RBRC // )
+#define CZ_DIAE KC_NUHS // ¨ (dead)
+#define CZ_A KC_A // A
+#define CZ_S KC_S // S
+#define CZ_D KC_D // D
+#define CZ_F KC_F // F
+#define CZ_G KC_G // G
+#define CZ_H KC_H // H
+#define CZ_J KC_J // J
+#define CZ_K KC_K // K
+#define CZ_L KC_L // L
+#define CZ_URNG KC_SCLN // ů
+#define CZ_SECT KC_QUOT // §
+#define CZ_Y KC_Z // Y
+#define CZ_X KC_X // X
+#define CZ_C KC_C // C
+#define CZ_V KC_V // V
+#define CZ_B KC_B // B
+#define CZ_N KC_N // N
+#define CZ_M KC_M // M
+#define CZ_COMM KC_COMM // ,
+#define CZ_DOT KC_DOT // .
+#define CZ_MINS KC_SLSH // -
+#define CZ_PIPE S(CZ_BSLS) // |
+#define CZ_1 S(CZ_PLUS) // 1
+#define CZ_2 S(CZ_ECAR) // 2
+#define CZ_3 S(CZ_SCAR) // 3
+#define CZ_4 S(CZ_CCAR) // 4
+#define CZ_5 S(CZ_RCAR) // 5
+#define CZ_6 S(CZ_ZCAR) // 6
+#define CZ_7 S(CZ_YACU) // 7
+#define CZ_8 S(CZ_AACU) // 8
+#define CZ_9 S(CZ_IACU) // 9
+#define CZ_0 S(CZ_EACU) // 0
+#define CZ_PERC S(CZ_EQL) // %
+#define CZ_CARN S(CZ_ACUT) // ˇ (dead)
+#define CZ_SLSH S(CZ_UACU) // /
+#define CZ_LPRN S(CZ_RPRN) // (
+#define CZ_GRV S(CZ_DIAE) // `
+#define CZ_DQUO S(CZ_URNG) // "
+#define CZ_EXLM S(CZ_SECT) // !
+#define CZ_QUES S(CZ_COMM) // ?
+#define CZ_COLN S(CZ_DOT) // :
+#define CZ_UNDS S(CZ_MINS) // _
+#define CZ_AT A(CZ_ECAR) // @
+#define CZ_HASH A(CZ_SCAR) // #
+#define CZ_DLR A(CZ_CCAR) // $
+#define CZ_TILD A(CZ_RCAR) // ~
+#define CZ_CIRC A(CZ_ZCAR) // ^
+#define CZ_AMPR A(CZ_YACU) // &
+#define CZ_ASTR A(CZ_AACU) // *
+#define CZ_LCBR A(CZ_IACU) // {
+#define CZ_RCBR A(CZ_EACU) // }
+#define CZ_RNGA A(CZ_EQL) // ° (dead)
+#define CZ_DCIR A(CZ_ACUT) // ^ (dead)
+#define CZ_LEDT A(CZ_W) // ė
+#define CZ_LEOG A(CZ_E) // ę
+#define CZ_EURO A(CZ_R) // €
+#define CZ_LZDT A(CZ_Z) // ż
+#define CZ_LBRC A(CZ_UACU) // [
+#define CZ_RBRC A(CZ_RPRN) // ]
+#define CZ_LAOG A(CZ_A) // ą
+#define CZ_SS A(CZ_S) // ß
+#define CZ_PDIF A(CZ_D) // ∂
+#define CZ_LSQU A(CZ_H) // ‘
+#define CZ_RSQU A(CZ_J) // ’
+#define CZ_LLST A(CZ_L) // ł
+#define CZ_SCLN A(CZ_URNG) // ;
+#define CZ_QUOT A(CZ_SECT) // '
+#define CZ_SLQU A(CZ_N) // ‚
+#define CZ_LABK A(CZ_COMM) // <
+#define CZ_RABK A(CZ_DOT) // >
+#define CZ_NDSH A(CZ_MINS) // –
+#define CZ_NOT S(A(CZ_1)) // ¬
+#define CZ_BULT S(A(CZ_2)) // •
+#define CZ_NEQL S(A(CZ_3)) // ≠
+#define CZ_PND S(A(CZ_4)) // £
+#define CZ_LOZN S(A(CZ_5)) // ◊
+#define CZ_DAGG S(A(CZ_6)) // †
+#define CZ_PARA S(A(CZ_7)) // ¶
+#define CZ_DIV S(A(CZ_8)) // ÷
+#define CZ_LDAQ S(A(CZ_9)) // «
+#define CZ_RDAQ S(A(CZ_0)) // »
+#define CZ_DCOM S(A(CZ_EQL)) // , (dead)
+#define CZ_DHPN S(A(CZ_ACUT)) // - (dead)
+#define CZ_CEDT S(A(CZ_W)) // Ė
+#define CZ_CEOG S(A(CZ_E)) // Ę
+#define CZ_REGD S(A(CZ_R)) // ®
+#define CZ_TM S(A(CZ_T)) // ™
+#define CZ_CZDT S(A(CZ_Z)) // Ż
+#define CZ_LSAQ S(A(CZ_UACU)) // ‹
+#define CZ_RSAQ S(A(CZ_RPRN)) // ›
+#define CZ_DDQT S(A(CZ_DIAE)) // " (dead)
+#define CZ_CAOG S(A(CZ_A)) // Ą
+#define CZ_NARS S(A(CZ_S)) // ∑
+#define CZ_INCR S(A(CZ_D)) // ∆
+#define CZ_LDQU S(A(CZ_H)) // “
+#define CZ_RDQU S(A(CZ_J)) // ”
+#define CZ_CLST S(A(CZ_L)) // Ł
+#define CZ_ELLP S(A(CZ_URNG)) // …
+#define CZ_DTIL S(A(CZ_SECT)) // ~ (dead)
+#define CZ_COPY S(A(CZ_C)) // ©
+#define CZ_SQRT S(A(CZ_V)) // √
+#define CZ_DLQU S(A(CZ_N)) // „
+#define CZ_LEQL S(A(CZ_COMM)) // ≤
+#define CZ_GEQL S(A(CZ_DOT)) // ≥
+#define CZ_MDSH S(A(CZ_MINS)) // —
+
diff --git a/quantum/keymap_extras/keymap_czech_mac_iso.h b/quantum/keymap_extras/keymap_czech_mac_iso.h
new file mode 100644
index 0000000000..4b56e15df1
--- /dev/null
+++ b/quantum/keymap_extras/keymap_czech_mac_iso.h
@@ -0,0 +1,162 @@
+// Copyright 2024 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*******************************************************************************
+ 88888888888 888 d8b .d888 d8b 888 d8b
+ 888 888 Y8P d88P" Y8P 888 Y8P
+ 888 888 888 888
+ 888 88888b. 888 .d8888b 888888 888 888 .d88b. 888 .d8888b
+ 888 888 "88b 888 88K 888 888 888 d8P Y8b 888 88K
+ 888 888 888 888 "Y8888b. 888 888 888 88888888 888 "Y8888b.
+ 888 888 888 888 X88 888 888 888 Y8b. 888 X88
+ 888 888 888 888 88888P' 888 888 888 "Y8888 888 88888P'
+ 888 888
+ 888 888
+ 888 888
+ .d88b. .d88b. 88888b. .d88b. 888d888 8888b. 888888 .d88b. .d88888
+ d88P"88b d8P Y8b 888 "88b d8P Y8b 888P" "88b 888 d8P Y8b d88" 888
+ 888 888 88888888 888 888 88888888 888 .d888888 888 88888888 888 888
+ Y88b 888 Y8b. 888 888 Y8b. 888 888 888 Y88b. Y8b. Y88b 888
+ "Y88888 "Y8888 888 888 "Y8888 888 "Y888888 "Y888 "Y8888 "Y88888
+ 888
+ Y8b d88P
+ "Y88P"
+*******************************************************************************/
+
+#pragma once
+#include "keycodes.h"
+// clang-format off
+
+// Aliases
+#define CZ_PLUS KC_1 // +
+#define CZ_ECAR KC_2 // ě
+#define CZ_SCAR KC_3 // š
+#define CZ_CCAR KC_4 // č
+#define CZ_RCAR KC_5 // ř
+#define CZ_ZCAR KC_6 // ž
+#define CZ_YACU KC_7 // ý
+#define CZ_AACU KC_8 // á
+#define CZ_IACU KC_9 // í
+#define CZ_EACU KC_0 // é
+#define CZ_EQL KC_MINS // =
+#define CZ_ACUT KC_EQL // ' (dead)
+#define CZ_Q KC_Q // Q
+#define CZ_W KC_W // W
+#define CZ_E KC_E // E
+#define CZ_R KC_R // R
+#define CZ_T KC_T // T
+#define CZ_Z KC_Y // Z
+#define CZ_U KC_U // U
+#define CZ_I KC_I // I
+#define CZ_O KC_O // O
+#define CZ_P KC_P // P
+#define CZ_UACU KC_LBRC // ú
+#define CZ_RPRN KC_RBRC // )
+#define CZ_A KC_A // A
+#define CZ_S KC_S // S
+#define CZ_D KC_D // D
+#define CZ_F KC_F // F
+#define CZ_G KC_G // G
+#define CZ_H KC_H // H
+#define CZ_J KC_J // J
+#define CZ_K KC_K // K
+#define CZ_L KC_L // L
+#define CZ_URNG KC_SCLN // ů
+#define CZ_SECT KC_QUOT // §
+#define CZ_DIAE KC_NUHS // ¨ (dead)
+#define CZ_BSLS KC_NUBS // (backslash)
+#define CZ_Y KC_Z // Y
+#define CZ_X KC_X // X
+#define CZ_C KC_C // C
+#define CZ_V KC_V // V
+#define CZ_B KC_B // B
+#define CZ_N KC_N // N
+#define CZ_M KC_M // M
+#define CZ_COMM KC_COMM // ,
+#define CZ_DOT KC_DOT // .
+#define CZ_MINS KC_SLSH // -
+#define CZ_1 S(CZ_PLUS) // 1
+#define CZ_2 S(CZ_ECAR) // 2
+#define CZ_3 S(CZ_SCAR) // 3
+#define CZ_4 S(CZ_CCAR) // 4
+#define CZ_5 S(CZ_RCAR) // 5
+#define CZ_6 S(CZ_ZCAR) // 6
+#define CZ_7 S(CZ_YACU) // 7
+#define CZ_8 S(CZ_AACU) // 8
+#define CZ_9 S(CZ_IACU) // 9
+#define CZ_0 S(CZ_EACU) // 0
+#define CZ_PERC S(CZ_EQL) // %
+#define CZ_CARN S(CZ_ACUT) // ˇ (dead)
+#define CZ_SLSH S(CZ_UACU) // /
+#define CZ_LPRN S(CZ_RPRN) // (
+#define CZ_DQUO S(CZ_URNG) // "
+#define CZ_EXLM S(CZ_SECT) // !
+#define CZ_GRV S(CZ_DIAE) // `
+#define CZ_PIPE S(CZ_BSLS) // |
+#define CZ_QUES S(CZ_COMM) // ?
+#define CZ_COLN S(CZ_DOT) // :
+#define CZ_UNDS S(CZ_MINS) // _
+#define CZ_AT A(CZ_ECAR) // @
+#define CZ_HASH A(CZ_SCAR) // #
+#define CZ_DLR A(CZ_CCAR) // $
+#define CZ_TILD A(CZ_RCAR) // ~
+#define CZ_CIRC A(CZ_ZCAR) // ^
+#define CZ_AMPR A(CZ_YACU) // &
+#define CZ_ASTR A(CZ_AACU) // *
+#define CZ_LCBR A(CZ_IACU) // {
+#define CZ_RCBR A(CZ_EACU) // }
+#define CZ_RNGA A(CZ_EQL) // ° (dead)
+#define CZ_DCIR A(CZ_ACUT) // ^ (dead)
+#define CZ_LEDT A(CZ_W) // ė
+#define CZ_LEOG A(CZ_E) // ę
+#define CZ_EURO A(CZ_R) // €
+#define CZ_LZDT A(CZ_Z) // ż
+#define CZ_LBRC A(CZ_UACU) // [
+#define CZ_RBRC A(CZ_RPRN) // ]
+#define CZ_LAOG A(CZ_A) // ą
+#define CZ_SS A(CZ_S) // ß
+#define CZ_PDIF A(CZ_D) // ∂
+#define CZ_LSQU A(CZ_H) // ‘
+#define CZ_RSQU A(CZ_J) // ’
+#define CZ_LLST A(CZ_L) // ł
+#define CZ_SCLN A(CZ_URNG) // ;
+#define CZ_QUOT A(CZ_SECT) // '
+#define CZ_SLQU A(CZ_N) // ‚
+#define CZ_LABK A(CZ_COMM) // <
+#define CZ_RABK A(CZ_DOT) // >
+#define CZ_NDSH A(CZ_MINS) // –
+#define CZ_NOT S(A(CZ_1)) // ¬
+#define CZ_BULT S(A(CZ_2)) // •
+#define CZ_NEQL S(A(CZ_3)) // ≠
+#define CZ_PND S(A(CZ_4)) // £
+#define CZ_LOZN S(A(CZ_5)) // ◊
+#define CZ_DAGG S(A(CZ_6)) // †
+#define CZ_PARA S(A(CZ_7)) // ¶
+#define CZ_DIV S(A(CZ_8)) // ÷
+#define CZ_LDAQ S(A(CZ_9)) // «
+#define CZ_RDAQ S(A(CZ_0)) // »
+#define CZ_DCOM S(A(CZ_EQL)) // , (dead)
+#define CZ_DHPN S(A(CZ_ACUT)) // - (dead)
+#define CZ_CEDT S(A(CZ_W)) // Ė
+#define CZ_CEOG S(A(CZ_E)) // Ę
+#define CZ_REGD S(A(CZ_R)) // ®
+#define CZ_TM S(A(CZ_T)) // ™
+#define CZ_CZDT S(A(CZ_Z)) // Ż
+#define CZ_LSAQ S(A(CZ_UACU)) // ‹
+#define CZ_RSAQ S(A(CZ_RPRN)) // ›
+#define CZ_CAOG S(A(CZ_A)) // Ą
+#define CZ_NARS S(A(CZ_S)) // ∑
+#define CZ_INCR S(A(CZ_D)) // ∆
+#define CZ_LDQU S(A(CZ_H)) // “
+#define CZ_RDQU S(A(CZ_J)) // ”
+#define CZ_CLST S(A(CZ_L)) // Ł
+#define CZ_ELLP S(A(CZ_URNG)) // …
+#define CZ_DTIL S(A(CZ_SECT)) // ~ (dead)
+#define CZ_DDQT S(A(CZ_DIAE)) // " (dead)
+#define CZ_COPY S(A(CZ_C)) // ©
+#define CZ_SQRT S(A(CZ_V)) // √
+#define CZ_DLQU S(A(CZ_N)) // „
+#define CZ_LEQL S(A(CZ_COMM)) // ≤
+#define CZ_GEQL S(A(CZ_DOT)) // ≥
+#define CZ_MDSH S(A(CZ_MINS)) // —
+
diff --git a/quantum/keymap_extras/sendstring_czech_mac_ansi.h b/quantum/keymap_extras/sendstring_czech_mac_ansi.h
new file mode 100644
index 0000000000..a60faa3237
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_czech_mac_ansi.h
@@ -0,0 +1,120 @@
+/* Copyright 2024 Tabonx
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// Sendstring lookup tables for macOS Czech ANSI layouts
+
+#pragma once
+
+#include "keymap_czech_mac_ansi.h"
+#include "send_string.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 0, 0, 1, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 0, 1, 1),
+ KCLUT_ENTRY(0, 0, 1, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 0, 1, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 1, 0),
+};
+
+const uint8_t ascii_to_dead_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, CZ_SECT, CZ_URNG, CZ_SCAR, CZ_CCAR, CZ_EQL, CZ_YACU, CZ_SECT,
+ // ( ) * + , - . /
+ CZ_RPRN, CZ_RPRN, CZ_AACU, CZ_PLUS, CZ_COMM, CZ_MINS, CZ_DOT, CZ_UACU,
+ // 0 1 2 3 4 5 6 7
+ CZ_EACU, CZ_PLUS, CZ_ECAR, CZ_SCAR, CZ_CCAR, CZ_RCAR, CZ_ZCAR, CZ_YACU,
+ // 8 9 : ; < = > ?
+ CZ_AACU, CZ_IACU, CZ_DOT, CZ_URNG, CZ_COMM, CZ_EQL, CZ_DOT, CZ_COMM,
+ // @ A B C D E F G
+ CZ_ECAR, CZ_A, CZ_B, CZ_C, CZ_D, CZ_E, CZ_F, CZ_G,
+ // H I J K L M N O
+ CZ_H, CZ_I, CZ_J, CZ_K, CZ_L, CZ_M, CZ_N, CZ_O,
+ // P Q R S T U V W
+ CZ_P, CZ_Q, CZ_R, CZ_S, CZ_T, CZ_U, CZ_V, CZ_W,
+ // X Y Z [ \ ] ^ _
+ CZ_X, CZ_Y, CZ_Z, CZ_UACU, CZ_BSLS, CZ_RPRN, CZ_ZCAR, CZ_MINS,
+ // ` a b c d e f g
+ CZ_DIAE, CZ_A, CZ_B, CZ_C, CZ_D, CZ_E, CZ_F, CZ_G,
+ // h i j k l m n o
+ CZ_H, CZ_I, CZ_J, CZ_K, CZ_L, CZ_M, CZ_N, CZ_O,
+ // p q r s t u v w
+ CZ_P, CZ_Q, CZ_R, CZ_S, CZ_T, CZ_U, CZ_V, CZ_W,
+ // x y z { | } ~ DEL
+ CZ_X, CZ_Y, CZ_Z, CZ_IACU, CZ_BSLS, CZ_EACU, CZ_RCAR, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_czech_mac_iso.h b/quantum/keymap_extras/sendstring_czech_mac_iso.h
new file mode 100644
index 0000000000..9d47087da0
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_czech_mac_iso.h
@@ -0,0 +1,120 @@
+/* Copyright 2024 Tabonx
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// Sendstring lookup tables for macOS Czech ISO layouts
+
+#pragma once
+
+#include "keymap_czech_mac_iso.h"
+#include "send_string.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 0, 0, 1, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 0, 1, 1),
+ KCLUT_ENTRY(0, 0, 1, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 0, 1, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 1, 0),
+};
+
+const uint8_t ascii_to_dead_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, CZ_SECT, CZ_URNG, CZ_SCAR, CZ_CCAR, CZ_EQL, CZ_YACU, CZ_SECT,
+ // ( ) * + , - . /
+ CZ_RPRN, CZ_RPRN, CZ_AACU, CZ_PLUS, CZ_COMM, CZ_MINS, CZ_DOT, CZ_UACU,
+ // 0 1 2 3 4 5 6 7
+ CZ_EACU, CZ_PLUS, CZ_ECAR, CZ_SCAR, CZ_CCAR, CZ_RCAR, CZ_ZCAR, CZ_YACU,
+ // 8 9 : ; < = > ?
+ CZ_AACU, CZ_IACU, CZ_DOT, CZ_URNG, CZ_COMM, CZ_EQL, CZ_DOT, CZ_COMM,
+ // @ A B C D E F G
+ CZ_ECAR, CZ_A, CZ_B, CZ_C, CZ_D, CZ_E, CZ_F, CZ_G,
+ // H I J K L M N O
+ CZ_H, CZ_I, CZ_J, CZ_K, CZ_L, CZ_M, CZ_N, CZ_O,
+ // P Q R S T U V W
+ CZ_P, CZ_Q, CZ_R, CZ_S, CZ_T, CZ_U, CZ_V, CZ_W,
+ // X Y Z [ \ ] ^ _
+ CZ_X, CZ_Y, CZ_Z, CZ_UACU, CZ_BSLS, CZ_RPRN, CZ_ZCAR, CZ_MINS,
+ // ` a b c d e f g
+ CZ_DIAE, CZ_A, CZ_B, CZ_C, CZ_D, CZ_E, CZ_F, CZ_G,
+ // h i j k l m n o
+ CZ_H, CZ_I, CZ_J, CZ_K, CZ_L, CZ_M, CZ_N, CZ_O,
+ // p q r s t u v w
+ CZ_P, CZ_Q, CZ_R, CZ_S, CZ_T, CZ_U, CZ_V, CZ_W,
+ // x y z { | } ~ DEL
+ CZ_X, CZ_Y, CZ_Z, CZ_IACU, CZ_BSLS, CZ_EACU, CZ_RCAR, KC_DEL
+};
diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c
index c0fb4c810b..2ca62c6969 100644
--- a/quantum/led_matrix/led_matrix.c
+++ b/quantum/led_matrix/led_matrix.c
@@ -159,7 +159,7 @@ void led_matrix_set_value_all(uint8_t value) {
#endif
}
-void process_led_matrix(uint8_t row, uint8_t col, bool pressed) {
+void led_matrix_handle_key_event(uint8_t row, uint8_t col, bool pressed) {
#ifndef LED_MATRIX_SPLIT
if (!is_keyboard_master()) return;
#endif
diff --git a/quantum/led_matrix/led_matrix.h b/quantum/led_matrix/led_matrix.h
index 941d42aeca..9a13c3e52b 100644
--- a/quantum/led_matrix/led_matrix.h
+++ b/quantum/led_matrix/led_matrix.h
@@ -124,7 +124,7 @@ uint8_t led_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *l
void led_matrix_set_value(int index, uint8_t value);
void led_matrix_set_value_all(uint8_t value);
-void process_led_matrix(uint8_t row, uint8_t col, bool pressed);
+void led_matrix_handle_key_event(uint8_t row, uint8_t col, bool pressed);
void led_matrix_task(void);
diff --git a/quantum/led_matrix/led_matrix_drivers.c b/quantum/led_matrix/led_matrix_drivers.c
index 2e80bd0375..bd4852e939 100644
--- a/quantum/led_matrix/led_matrix_drivers.c
+++ b/quantum/led_matrix/led_matrix_drivers.c
@@ -33,6 +33,14 @@ const led_matrix_driver_t led_matrix_driver = {
.set_value_all = is31fl3218_set_value_all,
};
+#elif defined(LED_MATRIX_IS31FL3236)
+const led_matrix_driver_t led_matrix_driver = {
+ .init = is31fl3236_init_drivers,
+ .flush = is31fl3236_flush,
+ .set_value = is31fl3236_set_value,
+ .set_value_all = is31fl3236_set_value_all,
+};
+
#elif defined(LED_MATRIX_IS31FL3729)
const led_matrix_driver_t led_matrix_driver = {
.init = is31fl3729_init_drivers,
diff --git a/quantum/led_matrix/led_matrix_drivers.h b/quantum/led_matrix/led_matrix_drivers.h
index a961784a62..60354e4677 100644
--- a/quantum/led_matrix/led_matrix_drivers.h
+++ b/quantum/led_matrix/led_matrix_drivers.h
@@ -7,6 +7,8 @@
#if defined(LED_MATRIX_IS31FL3218)
# include "is31fl3218-mono.h"
+#elif defined(LED_MATRIX_IS31FL3236)
+# include "is31fl3236-mono.h"
#elif defined(LED_MATRIX_IS31FL3729)
# include "is31fl3729-mono.h"
#elif defined(LED_MATRIX_IS31FL3731)
diff --git a/quantum/main.c b/quantum/main.c
index 3b101c522c..3159c55850 100644
--- a/quantum/main.c
+++ b/quantum/main.c
@@ -25,22 +25,9 @@ void protocol_pre_task(void);
void protocol_post_task(void);
// Bodge as refactoring this area sucks....
-void protocol_init(void) __attribute__((weak));
-void protocol_init(void) {
- protocol_pre_init();
-
- keyboard_init();
-
- protocol_post_init();
-}
-
-void protocol_task(void) __attribute__((weak));
-void protocol_task(void) {
- protocol_pre_task();
-
+void protocol_keyboard_task(void) __attribute__((weak));
+void protocol_keyboard_task(void) {
keyboard_task();
-
- protocol_post_task();
}
/** \brief Main
@@ -53,11 +40,25 @@ int main(void) {
protocol_setup();
keyboard_setup();
- protocol_init();
+ protocol_pre_init();
+ keyboard_init();
+ protocol_post_init();
/* Main loop */
while (true) {
- protocol_task();
+ protocol_pre_task();
+ protocol_keyboard_task();
+ protocol_post_task();
+
+#ifdef RAW_ENABLE
+ void raw_hid_task(void);
+ raw_hid_task();
+#endif
+
+#ifdef CONSOLE_ENABLE
+ void console_task(void);
+ console_task();
+#endif
#ifdef QUANTUM_PAINTER_ENABLE
// Run Quantum Painter task
diff --git a/quantum/pointing_device/pointing_device_auto_mouse.c b/quantum/pointing_device/pointing_device_auto_mouse.c
index 1b11fffedb..d9f924e258 100644
--- a/quantum/pointing_device/pointing_device_auto_mouse.c
+++ b/quantum/pointing_device/pointing_device_auto_mouse.c
@@ -45,7 +45,7 @@ static inline bool layer_hold_check(void) {
}
/* check all layer activation criteria */
-static inline bool is_auto_mouse_active(void) {
+bool is_auto_mouse_active(void) {
return auto_mouse_context.status.is_activated || auto_mouse_context.status.mouse_key_tracker || layer_hold_check();
}
@@ -99,6 +99,15 @@ bool get_auto_mouse_toggle(void) {
}
/**
+ * @brief get key tracker value
+ *
+ * @return bool of current layer_toggled state
+ */
+int8_t get_auto_mouse_key_tracker(void) {
+ return auto_mouse_context.status.mouse_key_tracker;
+}
+
+/**
* @brief Reset auto mouse context
*
* Clear timers and status
@@ -164,6 +173,15 @@ void set_auto_mouse_debounce(uint8_t debounce) {
}
/**
+ * @brief Changes the timeout for the mouse auto layer to be disabled
+ *
+ * @param key_tracker
+ */
+void set_auto_mouse_key_tracker(int8_t key_tracker) {
+ auto_mouse_context.status.mouse_key_tracker = key_tracker;
+}
+
+/**
* @brief toggle mouse layer setting
*
* Change state of local layer_toggled bool meant to track when the mouse layer is toggled on by other means
diff --git a/quantum/pointing_device/pointing_device_auto_mouse.h b/quantum/pointing_device/pointing_device_auto_mouse.h
index 904f18b68e..a596c065a3 100644
--- a/quantum/pointing_device/pointing_device_auto_mouse.h
+++ b/quantum/pointing_device/pointing_device_auto_mouse.h
@@ -81,9 +81,11 @@ void set_auto_mouse_timeout(uint16_t timeout); // set l
uint16_t get_auto_mouse_timeout(void); // get layer timeout
void set_auto_mouse_debounce(uint8_t debounce); // set debounce
uint8_t get_auto_mouse_debounce(void); // get debounce
+void set_auto_mouse_key_tracker(int8_t key_tracker); // set key tracker
+int8_t get_auto_mouse_key_tracker(void); // get key tracker
void auto_mouse_layer_off(void); // disable target layer if appropriate (DO NOT USE in layer_state_set stack!!)
layer_state_t remove_auto_mouse_layer(layer_state_t state, bool force); // remove auto mouse target layer from state if appropriate (can be forced)
-
+bool is_auto_mouse_active(void); // check if target layer is active
/* ----------For custom pointing device activation----------------------------------------------------------- */
bool auto_mouse_activation(report_mouse_t mouse_report); // handles pointing device trigger conditions for target layer activation (overwritable)
diff --git a/quantum/process_keycode/process_backlight.c b/quantum/process_keycode/process_backlight.c
index c1596ec07d..dafe979760 100644
--- a/quantum/process_keycode/process_backlight.c
+++ b/quantum/process_keycode/process_backlight.c
@@ -15,36 +15,11 @@
*/
#include "process_backlight.h"
-
-#ifdef LED_MATRIX_ENABLE
-# include "led_matrix.h"
-#else
-# include "backlight.h"
-#endif
+#include "backlight.h"
bool process_backlight(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
switch (keycode) {
-#ifdef LED_MATRIX_ENABLE
- case QK_BACKLIGHT_ON:
- led_matrix_enable();
- return false;
- case QK_BACKLIGHT_OFF:
- led_matrix_disable();
- return false;
- case QK_BACKLIGHT_DOWN:
- led_matrix_decrease_val();
- return false;
- case QK_BACKLIGHT_UP:
- led_matrix_increase_val();
- return false;
- case QK_BACKLIGHT_TOGGLE:
- led_matrix_toggle();
- return false;
- case QK_BACKLIGHT_STEP:
- led_matrix_step();
- return false;
-#else
case QK_BACKLIGHT_ON:
backlight_level(BACKLIGHT_LEVELS);
return false;
@@ -63,11 +38,10 @@ bool process_backlight(uint16_t keycode, keyrecord_t *record) {
case QK_BACKLIGHT_STEP:
backlight_step();
return false;
-# ifdef BACKLIGHT_BREATHING
+#ifdef BACKLIGHT_BREATHING
case QK_BACKLIGHT_TOGGLE_BREATHING:
backlight_toggle_breathing();
return false;
-# endif
#endif
}
}
diff --git a/quantum/process_keycode/process_led_matrix.c b/quantum/process_keycode/process_led_matrix.c
new file mode 100644
index 0000000000..7f95bf1011
--- /dev/null
+++ b/quantum/process_keycode/process_led_matrix.c
@@ -0,0 +1,47 @@
+// Copyright 2024 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "process_led_matrix.h"
+#include "led_matrix.h"
+
+bool process_led_matrix(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ switch (keycode) {
+ case QK_BACKLIGHT_ON: // TODO: Remove backlight keycodes
+ case QK_LED_MATRIX_ON:
+ led_matrix_enable();
+ return false;
+ case QK_BACKLIGHT_OFF:
+ case QK_LED_MATRIX_OFF:
+ led_matrix_disable();
+ return false;
+ case QK_BACKLIGHT_TOGGLE:
+ case QK_LED_MATRIX_TOGGLE:
+ led_matrix_toggle();
+ return false;
+ case QK_BACKLIGHT_STEP:
+ case QK_LED_MATRIX_MODE_NEXT:
+ led_matrix_step();
+ return false;
+ case QK_LED_MATRIX_MODE_PREVIOUS:
+ led_matrix_step_reverse();
+ return false;
+ case QK_BACKLIGHT_UP:
+ case QK_LED_MATRIX_BRIGHTNESS_UP:
+ led_matrix_increase_val();
+ return false;
+ case QK_BACKLIGHT_DOWN:
+ case QK_LED_MATRIX_BRIGHTNESS_DOWN:
+ led_matrix_decrease_val();
+ return false;
+ case QK_LED_MATRIX_SPEED_UP:
+ led_matrix_increase_speed();
+ return false;
+ case QK_LED_MATRIX_SPEED_DOWN:
+ led_matrix_decrease_speed();
+ return false;
+ }
+ }
+
+ return true;
+}
diff --git a/quantum/process_keycode/process_led_matrix.h b/quantum/process_keycode/process_led_matrix.h
new file mode 100644
index 0000000000..407d04aa27
--- /dev/null
+++ b/quantum/process_keycode/process_led_matrix.h
@@ -0,0 +1,10 @@
+// Copyright 2024 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "action.h"
+
+bool process_led_matrix(uint16_t keycode, keyrecord_t *record);
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 6639dc2291..011f9d73e4 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -16,7 +16,7 @@
#include "quantum.h"
-#if defined(BACKLIGHT_ENABLE) || defined(LED_MATRIX_ENABLE)
+#ifdef BACKLIGHT_ENABLE
# include "process_backlight.h"
#endif
@@ -40,6 +40,10 @@
# include "process_leader.h"
#endif
+#ifdef LED_MATRIX_ENABLE
+# include "process_led_matrix.h"
+#endif
+
#ifdef MAGIC_ENABLE
# include "process_magic.h"
#endif
@@ -333,9 +337,12 @@ bool process_record_quantum(keyrecord_t *record) {
#ifdef AUDIO_ENABLE
process_audio(keycode, record) &&
#endif
-#if defined(BACKLIGHT_ENABLE) || defined(LED_MATRIX_ENABLE)
+#if defined(BACKLIGHT_ENABLE)
process_backlight(keycode, record) &&
#endif
+#if defined(LED_MATRIX_ENABLE)
+ process_led_matrix(keycode, record) &&
+#endif
#ifdef STENO_ENABLE
process_steno(keycode, record) &&
#endif
diff --git a/quantum/quantum_keycodes_legacy.h b/quantum/quantum_keycodes_legacy.h
index 260ac1c8a4..51ec77bae0 100644
--- a/quantum/quantum_keycodes_legacy.h
+++ b/quantum/quantum_keycodes_legacy.h
@@ -3,56 +3,3 @@
// clang-format off
// Deprecated Quantum keycodes
-#define SH_TG QK_SWAP_HANDS_TOGGLE
-#define SQ_TOG QK_SEQUENCER_TOGGLE
-
-#define MAGIC_SWAP_CONTROL_CAPSLOCK QK_MAGIC_SWAP_CONTROL_CAPS_LOCK
-#define MAGIC_UNSWAP_CONTROL_CAPSLOCK QK_MAGIC_UNSWAP_CONTROL_CAPS_LOCK
-#define MAGIC_TOGGLE_CONTROL_CAPSLOCK QK_MAGIC_TOGGLE_CONTROL_CAPS_LOCK
-#define MAGIC_UNCAPSLOCK_TO_CONTROL QK_MAGIC_CAPS_LOCK_AS_CONTROL_OFF
-#define MAGIC_CAPSLOCK_TO_CONTROL QK_MAGIC_CAPS_LOCK_AS_CONTROL_ON
-#define MAGIC_SWAP_LALT_LGUI QK_MAGIC_SWAP_LALT_LGUI
-#define MAGIC_UNSWAP_LALT_LGUI QK_MAGIC_UNSWAP_LALT_LGUI
-#define MAGIC_SWAP_RALT_RGUI QK_MAGIC_SWAP_RALT_RGUI
-#define MAGIC_UNSWAP_RALT_RGUI QK_MAGIC_UNSWAP_RALT_RGUI
-#define MAGIC_UNNO_GUI QK_MAGIC_GUI_ON
-#define MAGIC_NO_GUI QK_MAGIC_GUI_OFF
-#define MAGIC_TOGGLE_GUI QK_MAGIC_TOGGLE_GUI
-#define MAGIC_SWAP_GRAVE_ESC QK_MAGIC_SWAP_GRAVE_ESC
-#define MAGIC_UNSWAP_GRAVE_ESC QK_MAGIC_UNSWAP_GRAVE_ESC
-#define MAGIC_SWAP_BACKSLASH_BACKSPACE QK_MAGIC_SWAP_BACKSLASH_BACKSPACE
-#define MAGIC_UNSWAP_BACKSLASH_BACKSPACE QK_MAGIC_UNSWAP_BACKSLASH_BACKSPACE
-#define MAGIC_TOGGLE_BACKSLASH_BACKSPACE QK_MAGIC_TOGGLE_BACKSLASH_BACKSPACE
-#define MAGIC_HOST_NKRO QK_MAGIC_NKRO_ON
-#define MAGIC_UNHOST_NKRO QK_MAGIC_NKRO_OFF
-#define MAGIC_TOGGLE_NKRO QK_MAGIC_TOGGLE_NKRO
-#define MAGIC_SWAP_ALT_GUI QK_MAGIC_SWAP_ALT_GUI
-#define MAGIC_UNSWAP_ALT_GUI QK_MAGIC_UNSWAP_ALT_GUI
-#define MAGIC_TOGGLE_ALT_GUI QK_MAGIC_TOGGLE_ALT_GUI
-#define MAGIC_SWAP_LCTL_LGUI QK_MAGIC_SWAP_LCTL_LGUI
-#define MAGIC_UNSWAP_LCTL_LGUI QK_MAGIC_UNSWAP_LCTL_LGUI
-#define MAGIC_SWAP_RCTL_RGUI QK_MAGIC_SWAP_RCTL_RGUI
-#define MAGIC_UNSWAP_RCTL_RGUI QK_MAGIC_UNSWAP_RCTL_RGUI
-#define MAGIC_SWAP_CTL_GUI QK_MAGIC_SWAP_CTL_GUI
-#define MAGIC_UNSWAP_CTL_GUI QK_MAGIC_UNSWAP_CTL_GUI
-#define MAGIC_TOGGLE_CTL_GUI QK_MAGIC_TOGGLE_CTL_GUI
-#define MAGIC_EE_HANDS_LEFT QK_MAGIC_EE_HANDS_LEFT
-#define MAGIC_EE_HANDS_RIGHT QK_MAGIC_EE_HANDS_RIGHT
-#define MAGIC_SWAP_ESCAPE_CAPSLOCK QK_MAGIC_SWAP_ESCAPE_CAPS_LOCK
-#define MAGIC_UNSWAP_ESCAPE_CAPSLOCK QK_MAGIC_UNSWAP_ESCAPE_CAPS_LOCK
-#define MAGIC_TOGGLE_ESCAPE_CAPSLOCK QK_MAGIC_TOGGLE_ESCAPE_CAPS_LOCK
-
-#define LCG_SWP QK_MAGIC_SWAP_LCTL_LGUI
-#define LCG_NRM QK_MAGIC_UNSWAP_LCTL_LGUI
-#define RCG_SWP QK_MAGIC_SWAP_RCTL_RGUI
-#define RCG_NRM QK_MAGIC_UNSWAP_RCTL_RGUI
-#define LAG_SWP QK_MAGIC_SWAP_LALT_LGUI
-#define LAG_NRM QK_MAGIC_UNSWAP_LALT_LGUI
-#define RAG_SWP QK_MAGIC_SWAP_RALT_RGUI
-#define RAG_NRM QK_MAGIC_UNSWAP_RALT_RGUI
-#define GUI_ON QK_MAGIC_GUI_ON
-#define GUI_OFF QK_MAGIC_GUI_OFF
-#define GUI_TOG QK_MAGIC_TOGGLE_GUI
-
-#define X(i) UM(i)
-#define XP(i, j) UP(i, j)
diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c
index 655aca1867..aaba00b457 100644
--- a/quantum/rgb_matrix/rgb_matrix.c
+++ b/quantum/rgb_matrix/rgb_matrix.c
@@ -156,7 +156,7 @@ void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
#endif
}
-void process_rgb_matrix(uint8_t row, uint8_t col, bool pressed) {
+void rgb_matrix_handle_key_event(uint8_t row, uint8_t col, bool pressed) {
#ifndef RGB_MATRIX_SPLIT
if (!is_keyboard_master()) return;
#endif
diff --git a/quantum/rgb_matrix/rgb_matrix.h b/quantum/rgb_matrix/rgb_matrix.h
index f8a6845e02..ceb3185d1a 100644
--- a/quantum/rgb_matrix/rgb_matrix.h
+++ b/quantum/rgb_matrix/rgb_matrix.h
@@ -148,7 +148,7 @@ uint8_t rgb_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *l
void rgb_matrix_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
-void process_rgb_matrix(uint8_t row, uint8_t col, bool pressed);
+void rgb_matrix_handle_key_event(uint8_t row, uint8_t col, bool pressed);
void rgb_matrix_task(void);
diff --git a/quantum/rgb_matrix/rgb_matrix_drivers.c b/quantum/rgb_matrix/rgb_matrix_drivers.c
index 95d1e884f0..db3a2ef9e0 100644
--- a/quantum/rgb_matrix/rgb_matrix_drivers.c
+++ b/quantum/rgb_matrix/rgb_matrix_drivers.c
@@ -36,6 +36,14 @@ const rgb_matrix_driver_t rgb_matrix_driver = {
.set_color_all = is31fl3218_set_color_all,
};
+#elif defined(RGB_MATRIX_IS31FL3236)
+const rgb_matrix_driver_t rgb_matrix_driver = {
+ .init = is31fl3236_init_drivers,
+ .flush = is31fl3236_flush,
+ .set_color = is31fl3236_set_color,
+ .set_color_all = is31fl3236_set_color_all,
+};
+
#elif defined(RGB_MATRIX_IS31FL3729)
const rgb_matrix_driver_t rgb_matrix_driver = {
.init = is31fl3729_init_drivers,
@@ -143,6 +151,7 @@ rgb_led_t rgb_matrix_ws2812_array[WS2812_LED_COUNT];
bool ws2812_dirty = false;
static void init(void) {
+ ws2812_init();
ws2812_dirty = false;
}
@@ -176,7 +185,7 @@ static inline void setled(int i, uint8_t r, uint8_t g, uint8_t b) {
rgb_matrix_ws2812_array[i].r = r;
rgb_matrix_ws2812_array[i].g = g;
rgb_matrix_ws2812_array[i].b = b;
-# ifdef RGBW
+# ifdef WS2812_RGBW
convert_rgb_to_rgbw(&rgb_matrix_ws2812_array[i]);
# endif
}
diff --git a/quantum/rgb_matrix/rgb_matrix_drivers.h b/quantum/rgb_matrix/rgb_matrix_drivers.h
index a24cb03a18..1ea5f0817d 100644
--- a/quantum/rgb_matrix/rgb_matrix_drivers.h
+++ b/quantum/rgb_matrix/rgb_matrix_drivers.h
@@ -7,6 +7,8 @@
#if defined(RGB_MATRIX_AW20216S)
# include "aw20216s.h"
+#elif defined(RGB_MATRIX_IS31FL3236)
+# include "is31fl3236.h"
#elif defined(RGB_MATRIX_IS31FL3218)
# include "is31fl3218.h"
#elif defined(RGB_MATRIX_IS31FL3729)
diff --git a/quantum/rgblight/rgblight.c b/quantum/rgblight/rgblight.c
index 530cb04688..b0f2dfdc1d 100644
--- a/quantum/rgblight/rgblight.c
+++ b/quantum/rgblight/rgblight.c
@@ -145,6 +145,15 @@ __attribute__((weak)) RGB rgblight_hsv_to_rgb(HSV hsv) {
return hsv_to_rgb(hsv);
}
+void setrgb(uint8_t r, uint8_t g, uint8_t b, rgb_led_t *led1) {
+ led1->r = r;
+ led1->g = g;
+ led1->b = b;
+#ifdef WS2812_RGBW
+ led1->w = 0;
+#endif
+}
+
void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, rgb_led_t *led1) {
HSV hsv = {hue, sat, val};
RGB rgb = rgblight_hsv_to_rgb(hsv);
@@ -155,15 +164,6 @@ void sethsv(uint8_t hue, uint8_t sat, uint8_t val, rgb_led_t *led1) {
sethsv_raw(hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val, led1);
}
-void setrgb(uint8_t r, uint8_t g, uint8_t b, rgb_led_t *led1) {
- led1->r = r;
- led1->g = g;
- led1->b = b;
-#ifdef RGBW
- led1->w = 0;
-#endif
-}
-
void rgblight_check_config(void) {
/* Add some out of bound checks for RGB light config */
@@ -243,6 +243,8 @@ void rgblight_init(void) {
rgblight_timer_init(); // setup the timer
+ rgblight_driver.init();
+
if (rgblight_config.enable) {
rgblight_mode_noeeprom(rgblight_config.mode);
}
@@ -650,7 +652,7 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) {
led[i].r = r;
led[i].g = g;
led[i].b = b;
-#ifdef RGBW
+#ifdef WS2812_RGBW
led[i].w = 0;
#endif
}
@@ -665,7 +667,7 @@ void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index) {
led[index].r = r;
led[index].g = g;
led[index].b = b;
-#ifdef RGBW
+#ifdef WS2812_RGBW
led[index].w = 0;
#endif
rgblight_set();
@@ -702,7 +704,7 @@ void rgblight_setrgb_range(uint8_t r, uint8_t g, uint8_t b, uint8_t start, uint8
led[i].r = r;
led[i].g = g;
led[i].b = b;
-#ifdef RGBW
+#ifdef WS2812_RGBW
led[i].w = 0;
#endif
}
@@ -903,7 +905,7 @@ void rgblight_set(void) {
led[i].r = 0;
led[i].g = 0;
led[i].b = 0;
-#ifdef RGBW
+#ifdef WS2812_RGBW
led[i].w = 0;
#endif
}
@@ -931,7 +933,7 @@ void rgblight_set(void) {
start_led = led + rgblight_ranges.clipping_start_pos;
#endif
-#ifdef RGBW
+#ifdef WS2812_RGBW
for (uint8_t i = 0; i < num_leds; i++) {
convert_rgb_to_rgbw(&start_led[i]);
}
@@ -1261,7 +1263,7 @@ void rgblight_effect_snake(animation_status_t *anim) {
ledp->r = 0;
ledp->g = 0;
ledp->b = 0;
-# ifdef RGBW
+# ifdef WS2812_RGBW
ledp->w = 0;
# endif
for (j = 0; j < RGBLIGHT_EFFECT_SNAKE_LENGTH; j++) {
@@ -1321,7 +1323,7 @@ void rgblight_effect_knight(animation_status_t *anim) {
led[i].r = 0;
led[i].g = 0;
led[i].b = 0;
-# ifdef RGBW
+# ifdef WS2812_RGBW
led[i].w = 0;
# endif
}
@@ -1335,7 +1337,7 @@ void rgblight_effect_knight(animation_status_t *anim) {
led[cur].r = 0;
led[cur].g = 0;
led[cur].b = 0;
-# ifdef RGBW
+# ifdef WS2812_RGBW
led[cur].w = 0;
# endif
}
@@ -1566,4 +1568,4 @@ uint8_t rgblight_velocikey_match_speed(uint8_t minValue, uint8_t maxValue) {
return MAX(minValue, maxValue - (maxValue - minValue) * ((float)typing_speed / TYPING_SPEED_MAX_VALUE));
}
-#endif \ No newline at end of file
+#endif
diff --git a/quantum/rgblight/rgblight.h b/quantum/rgblight/rgblight.h
index 9e2b073776..0ed67ff6e3 100644
--- a/quantum/rgblight/rgblight.h
+++ b/quantum/rgblight/rgblight.h
@@ -240,8 +240,6 @@ void rgblight_unblink_all_but_layer(uint8_t layer);
#endif
-extern rgb_led_t led[RGBLIGHT_LED_COUNT];
-
extern const uint8_t RGBLED_BREATHING_INTERVALS[4] PROGMEM;
extern const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[3] PROGMEM;
extern const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[3] PROGMEM;
@@ -290,11 +288,6 @@ typedef struct _rgblight_ranges_t {
extern rgblight_ranges_t rgblight_ranges;
-/* === Utility Functions ===*/
-void sethsv(uint8_t hue, uint8_t sat, uint8_t val, rgb_led_t *led1);
-void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, rgb_led_t *led1); // without RGBLIGHT_LIMIT_VAL check
-void setrgb(uint8_t r, uint8_t g, uint8_t b, rgb_led_t *led1);
-
/* === Low level Functions === */
void rgblight_set(void);
void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds);
diff --git a/quantum/rgblight/rgblight_drivers.c b/quantum/rgblight/rgblight_drivers.c
index 45b60e1a5f..8902b8f842 100644
--- a/quantum/rgblight/rgblight_drivers.c
+++ b/quantum/rgblight/rgblight_drivers.c
@@ -7,6 +7,7 @@
# include "ws2812.h"
const rgblight_driver_t rgblight_driver = {
+ .init = ws2812_init,
.setleds = ws2812_setleds,
};
@@ -14,6 +15,7 @@ const rgblight_driver_t rgblight_driver = {
# include "apa102.h"
const rgblight_driver_t rgblight_driver = {
+ .init = apa102_init,
.setleds = apa102_setleds,
};
diff --git a/quantum/rgblight/rgblight_drivers.h b/quantum/rgblight/rgblight_drivers.h
index f7125a6f3d..af28b918e1 100644
--- a/quantum/rgblight/rgblight_drivers.h
+++ b/quantum/rgblight/rgblight_drivers.h
@@ -7,6 +7,7 @@
#include "color.h"
typedef struct {
+ void (*init)(void);
void (*setleds)(rgb_led_t *ledarray, uint16_t number_of_leds);
} rgblight_driver_t;
diff --git a/quantum/split_common/transactions.c b/quantum/split_common/transactions.c
index 33bc9e9f57..decf5e5ede 100644
--- a/quantum/split_common/transactions.c
+++ b/quantum/split_common/transactions.c
@@ -419,6 +419,10 @@ static bool mods_handlers_master(matrix_row_t master_matrix[], matrix_row_t slav
if (!mods_need_sync && new_mods.oneshot_mods != split_shmem->mods.oneshot_mods) {
mods_need_sync = true;
}
+ new_mods.oneshot_locked_mods = get_oneshot_locked_mods();
+ if (!mods_need_sync && new_mods.oneshot_locked_mods != split_shmem->mods.oneshot_locked_mods) {
+ mods_need_sync = true;
+ }
# endif // NO_ACTION_ONESHOT
bool okay = true;
@@ -442,6 +446,7 @@ static void mods_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave
set_weak_mods(mods.weak_mods);
# ifndef NO_ACTION_ONESHOT
set_oneshot_mods(mods.oneshot_mods);
+ set_oneshot_locked_mods(mods.oneshot_locked_mods);
# endif
}
diff --git a/quantum/split_common/transport.h b/quantum/split_common/transport.h
index 4f6b968fa8..fbd87ca312 100644
--- a/quantum/split_common/transport.h
+++ b/quantum/split_common/transport.h
@@ -101,6 +101,7 @@ typedef struct _split_mods_sync_t {
uint8_t weak_mods;
# ifndef NO_ACTION_ONESHOT
uint8_t oneshot_mods;
+ uint8_t oneshot_locked_mods;
# endif // NO_ACTION_ONESHOT
} split_mods_sync_t;
#endif // SPLIT_MODS_ENABLE