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 */