diff options
| author | Pablo MartÃnez <58857054+elpekenin@users.noreply.github.com> | 2023-07-07 16:13:15 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-08 00:13:15 +1000 |
| commit | 55295ed3dc5000d4c9937602624060c168753434 (patch) | |
| tree | b82dcdd23e7363233644d407a72477c3d1ccbc74 /quantum/process_keycode | |
| parent | 21263438e52f756ddc5a004d044fd3e5a47d73a7 (diff) | |
[Enhancement] More info on `apply_autocorrect` (#21056)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Diffstat (limited to 'quantum/process_keycode')
| -rw-r--r-- | quantum/process_keycode/process_autocorrect.c | 55 | ||||
| -rw-r--r-- | quantum/process_keycode/process_autocorrect.h | 3 |
2 files changed, 54 insertions, 4 deletions
diff --git a/quantum/process_keycode/process_autocorrect.c b/quantum/process_keycode/process_autocorrect.c index 7c9cb814e5..cc1f19e4f9 100644 --- a/quantum/process_keycode/process_autocorrect.c +++ b/quantum/process_keycode/process_autocorrect.c | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | // Copyright 2021 Google LLC | 1 | // Copyright 2021 Google LLC |
| 2 | // Copyright 2021 @filterpaper | 2 | // Copyright 2021 @filterpaper |
| 3 | // Copyright 2023 Pablo Martinez (@elpekenin) <elpekenin@elpekenin.dev> | ||
| 3 | // SPDX-License-Identifier: Apache-2.0 | 4 | // SPDX-License-Identifier: Apache-2.0 |
| 4 | // Original source: https://getreuer.info/posts/keyboards/autocorrection | 5 | // Original source: https://getreuer.info/posts/keyboards/autocorrection |
| 5 | 6 | ||
| @@ -174,10 +175,12 @@ bool process_autocorrect_default_handler(uint16_t *keycode, keyrecord_t *record, | |||
| 174 | * | 175 | * |
| 175 | * @param backspaces number of characters to remove | 176 | * @param backspaces number of characters to remove |
| 176 | * @param str pointer to PROGMEM string to replace mistyped seletion with | 177 | * @param str pointer to PROGMEM string to replace mistyped seletion with |
| 178 | * @param typo the wrong string that triggered a correction | ||
| 179 | * @param correct what it would become after the changes | ||
| 177 | * @return true apply correction | 180 | * @return true apply correction |
| 178 | * @return false user handled replacement | 181 | * @return false user handled replacement |
| 179 | */ | 182 | */ |
| 180 | __attribute__((weak)) bool apply_autocorrect(uint8_t backspaces, const char *str) { | 183 | __attribute__((weak)) bool apply_autocorrect(uint8_t backspaces, const char *str, char *typo, char *correct) { |
| 181 | return true; | 184 | return true; |
| 182 | } | 185 | } |
| 183 | 186 | ||
| @@ -301,11 +304,57 @@ bool process_autocorrect(uint16_t keycode, keyrecord_t *record) { | |||
| 301 | 304 | ||
| 302 | if (code & 128) { // A typo was found! Apply autocorrect. | 305 | if (code & 128) { // A typo was found! Apply autocorrect. |
| 303 | const uint8_t backspaces = (code & 63) + !record->event.pressed; | 306 | const uint8_t backspaces = (code & 63) + !record->event.pressed; |
| 304 | if (apply_autocorrect(backspaces, (char const *)(autocorrect_data + state + 1))) { | 307 | const char * changes = (const char *)(autocorrect_data + state + 1); |
| 308 | |||
| 309 | /* Gather info about the typo'd word | ||
| 310 | * | ||
| 311 | * Since buffer may contain several words, delimited by spaces, we | ||
| 312 | * iterate from the end to find the start and length of the typo | ||
| 313 | */ | ||
| 314 | char typo[AUTOCORRECT_MAX_LENGTH + 1] = {0}; // extra char for null terminator | ||
| 315 | |||
| 316 | uint8_t typo_len = 0; | ||
| 317 | uint8_t typo_start = 0; | ||
| 318 | bool space_last = typo_buffer[typo_buffer_size - 1] == KC_SPC; | ||
| 319 | for (uint8_t i = typo_buffer_size; i > 0; --i) { | ||
| 320 | // stop counting after finding space (unless it is the last thing) | ||
| 321 | if (typo_buffer[i - 1] == KC_SPC && i != typo_buffer_size) { | ||
| 322 | typo_start = i; | ||
| 323 | break; | ||
| 324 | } | ||
| 325 | |||
| 326 | ++typo_len; | ||
| 327 | } | ||
| 328 | |||
| 329 | // when detecting 'typo:', reduce the length of the string by one | ||
| 330 | if (space_last) { | ||
| 331 | --typo_len; | ||
| 332 | } | ||
| 333 | |||
| 334 | // convert buffer of keycodes into a string | ||
| 335 | for (uint8_t i = 0; i < typo_len; ++i) { | ||
| 336 | typo[i] = typo_buffer[typo_start + i] - KC_A + 'a'; | ||
| 337 | } | ||
| 338 | |||
| 339 | /* Gather the corrected word | ||
| 340 | * | ||
| 341 | * A) Correction of 'typo:' -- Code takes into account | ||
| 342 | * an extra backspace to delete the space (which we dont copy) | ||
| 343 | * for this reason the offset is correct to "skip" the null terminator | ||
| 344 | * | ||
| 345 | * B) When correcting 'typo' -- Need extra offset for terminator | ||
| 346 | */ | ||
| 347 | char correct[AUTOCORRECT_MAX_LENGTH + 10] = {0}; // let's hope this is big enough | ||
| 348 | |||
| 349 | uint8_t offset = space_last ? backspaces : backspaces + 1; | ||
| 350 | strcpy(correct, typo); | ||
| 351 | strcpy_P(correct + typo_len - offset, changes); | ||
| 352 | |||
| 353 | if (apply_autocorrect(backspaces, changes, typo, correct)) { | ||
| 305 | for (uint8_t i = 0; i < backspaces; ++i) { | 354 | for (uint8_t i = 0; i < backspaces; ++i) { |
| 306 | tap_code(KC_BSPC); | 355 | tap_code(KC_BSPC); |
| 307 | } | 356 | } |
| 308 | send_string_P((char const *)(autocorrect_data + state + 1)); | 357 | send_string_P(changes); |
| 309 | } | 358 | } |
| 310 | 359 | ||
| 311 | if (keycode == KC_SPC) { | 360 | if (keycode == KC_SPC) { |
diff --git a/quantum/process_keycode/process_autocorrect.h b/quantum/process_keycode/process_autocorrect.h index 00dacbf958..9cc7d46a8b 100644 --- a/quantum/process_keycode/process_autocorrect.h +++ b/quantum/process_keycode/process_autocorrect.h | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | // Copyright 2021 Google LLC | 1 | // Copyright 2021 Google LLC |
| 2 | // Copyright 2021 @filterpaper | 2 | // Copyright 2021 @filterpaper |
| 3 | // Copyright 2023 Pablo Martinez (@elpekenin) <elpekenin@elpekenin.dev> | ||
| 3 | // SPDX-License-Identifier: Apache-2.0 | 4 | // SPDX-License-Identifier: Apache-2.0 |
| 4 | // Original source: https://getreuer.info/posts/keyboards/autocorrection | 5 | // Original source: https://getreuer.info/posts/keyboards/autocorrection |
| 5 | 6 | ||
| @@ -10,7 +11,7 @@ | |||
| 10 | bool process_autocorrect(uint16_t keycode, keyrecord_t *record); | 11 | bool process_autocorrect(uint16_t keycode, keyrecord_t *record); |
| 11 | bool process_autocorrect_user(uint16_t *keycode, keyrecord_t *record, uint8_t *typo_buffer_size, uint8_t *mods); | 12 | bool process_autocorrect_user(uint16_t *keycode, keyrecord_t *record, uint8_t *typo_buffer_size, uint8_t *mods); |
| 12 | bool process_autocorrect_default_handler(uint16_t *keycode, keyrecord_t *record, uint8_t *typo_buffer_size, uint8_t *mods); | 13 | bool process_autocorrect_default_handler(uint16_t *keycode, keyrecord_t *record, uint8_t *typo_buffer_size, uint8_t *mods); |
| 13 | bool apply_autocorrect(uint8_t backspaces, const char *str); | 14 | bool apply_autocorrect(uint8_t backspaces, const char *str, char *typo, char *correct); |
| 14 | 15 | ||
| 15 | bool autocorrect_is_enabled(void); | 16 | bool autocorrect_is_enabled(void); |
| 16 | void autocorrect_enable(void); | 17 | void autocorrect_enable(void); |
