summaryrefslogtreecommitdiff
path: root/quantum/dynamic_keymap.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/dynamic_keymap.c')
-rw-r--r--quantum/dynamic_keymap.c81
1 files changed, 55 insertions, 26 deletions
diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c
index 01be9806e4..c406be4585 100644
--- a/quantum/dynamic_keymap.c
+++ b/quantum/dynamic_keymap.c
@@ -153,7 +153,7 @@ void dynamic_keymap_reset(void) {
for (int row = 0; row < MATRIX_ROWS; row++) {
for (int column = 0; column < MATRIX_COLS; column++) {
if (layer < keymap_layer_count()) {
- dynamic_keymap_set_keycode(layer, row, column, pgm_read_word(&keymaps[layer][row][column]));
+ dynamic_keymap_set_keycode(layer, row, column, keycode_at_keymap_location_raw(layer, row, column));
} else {
dynamic_keymap_set_keycode(layer, row, column, KC_TRANSPARENT);
}
@@ -162,8 +162,8 @@ void dynamic_keymap_reset(void) {
#ifdef ENCODER_MAP_ENABLE
for (int encoder = 0; encoder < NUM_ENCODERS; encoder++) {
if (layer < encodermap_layer_count()) {
- dynamic_keymap_set_encoder(layer, encoder, true, pgm_read_word(&encoder_map[layer][encoder][0]));
- dynamic_keymap_set_encoder(layer, encoder, false, pgm_read_word(&encoder_map[layer][encoder][1]));
+ dynamic_keymap_set_encoder(layer, encoder, true, keycode_at_encodermap_location_raw(layer, encoder, true));
+ dynamic_keymap_set_encoder(layer, encoder, false, keycode_at_encodermap_location_raw(layer, encoder, false));
} else {
dynamic_keymap_set_encoder(layer, encoder, true, KC_TRANSPARENT);
dynamic_keymap_set_encoder(layer, encoder, false, KC_TRANSPARENT);
@@ -201,20 +201,21 @@ void dynamic_keymap_set_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
}
}
-// This overrides the one in quantum/keymap_common.c
-uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) {
- if (layer < DYNAMIC_KEYMAP_LAYER_COUNT && key.row < MATRIX_ROWS && key.col < MATRIX_COLS) {
- return dynamic_keymap_get_keycode(layer, key.row, key.col);
+uint16_t keycode_at_keymap_location(uint8_t layer_num, uint8_t row, uint8_t column) {
+ if (layer_num < DYNAMIC_KEYMAP_LAYER_COUNT && row < MATRIX_ROWS && column < MATRIX_COLS) {
+ return dynamic_keymap_get_keycode(layer_num, row, column);
}
+ return KC_NO;
+}
+
#ifdef ENCODER_MAP_ENABLE
- else if (layer < DYNAMIC_KEYMAP_LAYER_COUNT && key.row == KEYLOC_ENCODER_CW && key.col < NUM_ENCODERS) {
- return dynamic_keymap_get_encoder(layer, key.col, true);
- } else if (layer < DYNAMIC_KEYMAP_LAYER_COUNT && key.row == KEYLOC_ENCODER_CCW && key.col < NUM_ENCODERS) {
- return dynamic_keymap_get_encoder(layer, key.col, false);
+uint16_t keycode_at_encodermap_location(uint8_t layer_num, uint8_t encoder_idx, bool clockwise) {
+ if (layer_num < DYNAMIC_KEYMAP_LAYER_COUNT && encoder_idx < NUM_ENCODERS) {
+ return dynamic_keymap_get_encoder(layer_num, encoder_idx, clockwise);
}
-#endif // ENCODER_MAP_ENABLE
return KC_NO;
}
+#endif // ENCODER_MAP_ENABLE
uint8_t dynamic_keymap_macro_get_count(void) {
return DYNAMIC_KEYMAP_MACRO_COUNT;
@@ -278,9 +279,8 @@ void dynamic_keymap_macro_send(uint8_t id) {
p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
while (id > 0) {
- // If we are past the end of the buffer, then the buffer
- // contents are garbage, i.e. there were not DYNAMIC_KEYMAP_MACRO_COUNT
- // nulls in the buffer.
+ // If we are past the end of the buffer, then there is
+ // no Nth macro in the buffer.
if (p == end) {
return;
}
@@ -290,9 +290,8 @@ void dynamic_keymap_macro_send(uint8_t id) {
++p;
}
- // Send the macro string one or three chars at a time
- // by making temporary 1 or 3 char strings
- char data[4] = {0, 0, 0, 0};
+ // Send the macro string by making a temporary string.
+ char data[8] = {0};
// We already checked there was a null at the end of
// the buffer, so this cannot go past the end
while (1) {
@@ -302,14 +301,44 @@ void dynamic_keymap_macro_send(uint8_t id) {
if (data[0] == 0) {
break;
}
- // If the char is magic (tap, down, up),
- // add the next char (key to use) and send a 3 char string.
- if (data[0] == SS_TAP_CODE || data[0] == SS_DOWN_CODE || data[0] == SS_UP_CODE) {
- data[1] = data[0];
- data[0] = SS_QMK_PREFIX;
- data[2] = eeprom_read_byte(p++);
- if (data[2] == 0) {
- break;
+ if (data[0] == SS_QMK_PREFIX) {
+ // Get the code
+ data[1] = eeprom_read_byte(p++);
+ // Unexpected null, abort.
+ if (data[1] == 0) {
+ return;
+ }
+ if (data[1] == SS_TAP_CODE || data[1] == SS_DOWN_CODE || data[1] == SS_UP_CODE) {
+ // Get the keycode
+ data[2] = eeprom_read_byte(p++);
+ // Unexpected null, abort.
+ if (data[2] == 0) {
+ return;
+ }
+ // Null terminate
+ data[3] = 0;
+ } else if (data[1] == SS_DELAY_CODE) {
+ // Get the number and '|'
+ // At most this is 4 digits plus '|'
+ uint8_t i = 2;
+ while (1) {
+ data[i] = eeprom_read_byte(p++);
+ // Unexpected null, abort
+ if (data[i] == 0) {
+ return;
+ }
+ // Found '|', send it
+ if (data[i] == '|') {
+ data[i + 1] = 0;
+ break;
+ }
+ // If haven't found '|' by i==6 then
+ // number too big, abort
+ if (i == 6) {
+ return;
+ }
+ ++i;
+ }
}
}
send_string_with_delay(data, DYNAMIC_KEYMAP_MACRO_DELAY);