diff --git a/common_features.mk b/common_features.mk index 702e262892..6bfc91d277 100644 --- a/common_features.mk +++ b/common_features.mk @@ -476,6 +476,11 @@ ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes) SRC += $(QUANTUM_DIR)/dynamic_keymap.c endif +ifeq ($(strip $(QMK_SETTINGS)), yes) + SRC += $(QUANTUM_DIR)/qmk_settings.c + OPT_DEFS += -DQMK_SETTINGS +endif + ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes) OPT_DEFS += -DDIP_SWITCH_ENABLE SRC += $(QUANTUM_DIR)/dip_switch.c diff --git a/quantum/process_keycode/process_grave_esc.c b/quantum/process_keycode/process_grave_esc.c index 41c50f5cb8..05a352c80c 100644 --- a/quantum/process_keycode/process_grave_esc.c +++ b/quantum/process_keycode/process_grave_esc.c @@ -14,6 +14,7 @@ * along with this program. If not, see . */ #include "process_grave_esc.h" +#include "qmk_settings.h" /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise. * Used to ensure that the correct keycode is released if the key is released. @@ -25,35 +26,35 @@ bool process_grave_esc(uint16_t keycode, keyrecord_t *record) { const uint8_t mods = get_mods(); uint8_t shifted = mods & MOD_MASK_SG; -#ifdef GRAVE_ESC_ALT_OVERRIDE +if (QS_grave_esc_alt_override) { // if ALT is pressed, ESC is always sent // this is handy for the cmd+opt+esc shortcut on macOS, among other things. if (mods & MOD_MASK_ALT) { shifted = 0; } -#endif +} -#ifdef GRAVE_ESC_CTRL_OVERRIDE +if (QS_grave_esc_ctrl_override) { // if CTRL is pressed, ESC is always sent // this is handy for the ctrl+shift+esc shortcut on windows, among other things. if (mods & MOD_MASK_CTRL) { shifted = 0; } -#endif +} -#ifdef GRAVE_ESC_GUI_OVERRIDE +if (QS_grave_esc_gui_override) { // if GUI is pressed, ESC is always sent if (mods & MOD_MASK_GUI) { shifted = 0; } -#endif +} -#ifdef GRAVE_ESC_SHIFT_OVERRIDE +if (QS_grave_esc_shift_override) { // if SHIFT is pressed, ESC is always sent if (mods & MOD_MASK_SHIFT) { shifted = 0; } -#endif +} if (record->event.pressed) { grave_esc_was_shifted = shifted; diff --git a/quantum/qmk_settings.c b/quantum/qmk_settings.c new file mode 100644 index 0000000000..d63a54a8c5 --- /dev/null +++ b/quantum/qmk_settings.c @@ -0,0 +1,36 @@ +#include "qmk_settings.h" + +#include +#include "progmem.h" +#include + +qmk_settings_t QS; + +#define DECLARE_SETTING(id, field) { .qsid=id, .ptr=&QS.field, .sz=sizeof(QS.field) } + +static const qmk_settings_proto_t protos[] PROGMEM = { + DECLARE_SETTING(1, grave_esc_override), +}; + +static const qmk_settings_proto_t *find_setting(uint16_t qsid) { + for (size_t i = 0; i < sizeof(protos)/sizeof(*protos); ++i) + if (pgm_read_word(&protos[i].qsid) == qsid) + return &protos[i]; + return NULL; +} + +int qmk_settings_get(uint16_t qsid, void *setting, size_t maxsz) { + const qmk_settings_proto_t *proto = find_setting(qsid); + if (!proto || pgm_read_word(&proto->sz) > maxsz) + return -1; + memcpy(setting, pgm_read_ptr(&proto->ptr), pgm_read_word(&proto->sz)); + return 0; +} + +int qmk_settings_set(uint16_t qsid, const void *setting, size_t maxsz) { + const qmk_settings_proto_t *proto = find_setting(qsid); + if (!proto || pgm_read_word(&proto->sz) > maxsz) + return -1; + memcpy(pgm_read_ptr(&proto->ptr), setting, pgm_read_word(&proto->sz)); + return 0; +} diff --git a/quantum/qmk_settings.h b/quantum/qmk_settings.h new file mode 100644 index 0000000000..e117a3b856 --- /dev/null +++ b/quantum/qmk_settings.h @@ -0,0 +1,71 @@ +#pragma once + +#include +#include + +/* take qmk config macros and set up helper variables for default settings */ + +/* ========================================================================== */ +/* Grave escape */ +/* ========================================================================== */ +#ifdef GRAVE_ESC_ALT_OVERRIDE +#define GRAVE_ESC_ALT_OVERRIDE_Defined 1 +#else +#define GRAVE_ESC_ALT_OVERRIDE_Defined 0 +#endif + +#ifdef GRAVE_ESC_CTRL_OVERRIDE +#define GRAVE_ESC_CTRL_OVERRIDE_Defined 1 +#else +#define GRAVE_ESC_CTRL_OVERRIDE_Defined 0 +#endif + +#ifdef GRAVE_ESC_GUI_OVERRIDE +#define GRAVE_ESC_GUI_OVERRIDE_Defined 1 +#else +#define GRAVE_ESC_GUI_OVERRIDE_Defined 0 +#endif + +#ifdef GRAVE_ESC_SHIFT_OVERRIDE +#define GRAVE_ESC_SHIFT_OVERRIDE_Defined 1 +#else +#define GRAVE_ESC_SHIFT_OVERRIDE_Defined 0 +#endif + +#ifdef QMK_SETTINGS +/* dynamic settings framework is enabled */ + +/* actual settings - stored in RAM and backed by EEPROM */ +typedef struct { + uint8_t grave_esc_override; +} qmk_settings_t; + +/* setting prototype - describes how to get/set settings, stored in flash */ +typedef struct { + uint16_t qsid; + uint16_t sz; + void *ptr; +} qmk_settings_proto_t; + +int qmk_settings_get(uint16_t qsid, void *setting, size_t maxsz); +int qmk_settings_set(uint16_t qsid, const void *setting, size_t maxsz); + +extern qmk_settings_t QS; + +/* Grave escape */ +#define QS_grave_esc_alt_override (QS.grave_esc_override & 1) +#define QS_grave_esc_ctrl_override (QS.grave_esc_override & 2) +#define QS_grave_esc_gui_override (QS.grave_esc_override & 4) +#define QS_grave_esc_shift_override (QS.grave_esc_override & 8) + +#else +/* dynamic settings framework is disabled => hardcode the settings and let the compiler optimize extra branches out */ + + +/* Grave escape */ +#define QS_grave_esc_alt_override GRAVE_ESC_ALT_OVERRIDE_Defined +#define QS_grave_esc_ctrl_override GRAVE_ESC_CTRL_OVERRIDE_Defined +#define QS_grave_esc_gui_override GRAVE_ESC_GUI_OVERRIDE_Defined +#define QS_grave_esc_shift_override GRAVE_ESC_SHIFT_OVERRIDE_Defined + +#endif \ No newline at end of file diff --git a/quantum/vial.c b/quantum/vial.c index d47fe1c549..4a23e7511d 100644 --- a/quantum/vial.c +++ b/quantum/vial.c @@ -50,6 +50,10 @@ _Static_assert(sizeof(vial_unlock_combo_rows) == sizeof(vial_unlock_combo_cols), #define VIAL_ENCODER_KEYCODE_DELAY 10 #endif +#ifdef QMK_SETTINGS +#include "qmk_settings.h" +#endif + void vial_handle_cmd(uint8_t *msg, uint8_t length) { /* All packets must be fixed 32 bytes */ if (length != VIAL_RAW_EPSIZE) @@ -160,6 +164,21 @@ void vial_handle_cmd(uint8_t *msg, uint8_t length) { #endif break; } + case vial_qmk_settings_query: { + break; + } + case vial_qmk_settings_get: { + uint16_t qsid = msg[2] | (msg[3] << 8); + msg[0] = qmk_settings_get(qsid, &msg[1], length - 1); + + break; + } + case vial_qmk_settings_set: { + uint16_t qsid = msg[2] | (msg[3] << 8); + msg[0] = qmk_settings_set(qsid, &msg[4], length - 4); + + break; + } } } diff --git a/quantum/vial.h b/quantum/vial.h index 197918765f..d4b5f24c18 100644 --- a/quantum/vial.h +++ b/quantum/vial.h @@ -40,6 +40,9 @@ enum { vial_unlock_start = 0x06, vial_unlock_poll = 0x07, vial_lock = 0x08, + vial_qmk_settings_query = 0x09, + vial_qmk_settings_get = 0x0A, + vial_qmk_settings_set = 0x0B, }; /* Fake encoder position in keyboard matrix, can't use 255 as that is immediately rejected by IS_NOEVENT */