diff options
Diffstat (limited to 'quantum/process_keycode')
| -rw-r--r-- | quantum/process_keycode/process_rgb.c | 2 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicode_common.c | 118 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicode_common.h | 2 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicodemap.c | 3 |
4 files changed, 74 insertions, 51 deletions
diff --git a/quantum/process_keycode/process_rgb.c b/quantum/process_keycode/process_rgb.c index 627e5986f..21164b8f9 100644 --- a/quantum/process_keycode/process_rgb.c +++ b/quantum/process_keycode/process_rgb.c | |||
| @@ -56,7 +56,7 @@ bool process_rgb(const uint16_t keycode, const keyrecord_t *record) { | |||
| 56 | // Split keyboards need to trigger on key-up for edge-case issue | 56 | // Split keyboards need to trigger on key-up for edge-case issue |
| 57 | if (!record->event.pressed) { | 57 | if (!record->event.pressed) { |
| 58 | #endif | 58 | #endif |
| 59 | uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)); | 59 | uint8_t shifted = get_mods() & MOD_MASK_SHIFT; |
| 60 | switch (keycode) { | 60 | switch (keycode) { |
| 61 | case RGB_TOG: | 61 | case RGB_TOG: |
| 62 | rgblight_toggle(); | 62 | rgblight_toggle(); |
diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index 48ce3961a..fb5021501 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c | |||
| @@ -24,8 +24,8 @@ uint8_t unicode_saved_mods; | |||
| 24 | 24 | ||
| 25 | #if UNICODE_SELECTED_MODES != -1 | 25 | #if UNICODE_SELECTED_MODES != -1 |
| 26 | static uint8_t selected[] = {UNICODE_SELECTED_MODES}; | 26 | static uint8_t selected[] = {UNICODE_SELECTED_MODES}; |
| 27 | static uint8_t selected_count = sizeof selected / sizeof *selected; | 27 | static int8_t selected_count = sizeof selected / sizeof *selected; |
| 28 | static uint8_t selected_index; | 28 | static int8_t selected_index; |
| 29 | #endif | 29 | #endif |
| 30 | 30 | ||
| 31 | void unicode_input_mode_init(void) { | 31 | void unicode_input_mode_init(void) { |
| @@ -33,7 +33,7 @@ void unicode_input_mode_init(void) { | |||
| 33 | #if UNICODE_SELECTED_MODES != -1 | 33 | #if UNICODE_SELECTED_MODES != -1 |
| 34 | # if UNICODE_CYCLE_PERSIST | 34 | # if UNICODE_CYCLE_PERSIST |
| 35 | // Find input_mode in selected modes | 35 | // Find input_mode in selected modes |
| 36 | uint8_t i; | 36 | int8_t i; |
| 37 | for (i = 0; i < selected_count; i++) { | 37 | for (i = 0; i < selected_count; i++) { |
| 38 | if (selected[i] == unicode_config.input_mode) { | 38 | if (selected[i] == unicode_config.input_mode) { |
| 39 | selected_index = i; | 39 | selected_index = i; |
| @@ -60,9 +60,12 @@ void set_unicode_input_mode(uint8_t mode) { | |||
| 60 | dprintf("Unicode input mode set to: %u\n", unicode_config.input_mode); | 60 | dprintf("Unicode input mode set to: %u\n", unicode_config.input_mode); |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | void cycle_unicode_input_mode(uint8_t offset) { | 63 | void cycle_unicode_input_mode(int8_t offset) { |
| 64 | #if UNICODE_SELECTED_MODES != -1 | 64 | #if UNICODE_SELECTED_MODES != -1 |
| 65 | selected_index = (selected_index + offset) % selected_count; | 65 | selected_index = (selected_index + offset) % selected_count; |
| 66 | if (selected_index < 0) { | ||
| 67 | selected_index += selected_count; | ||
| 68 | } | ||
| 66 | unicode_config.input_mode = selected[selected_index]; | 69 | unicode_config.input_mode = selected[selected_index]; |
| 67 | # if UNICODE_CYCLE_PERSIST | 70 | # if UNICODE_CYCLE_PERSIST |
| 68 | persist_unicode_input_mode(); | 71 | persist_unicode_input_mode(); |
| @@ -168,6 +171,8 @@ void register_hex32(uint32_t hex) { | |||
| 168 | } | 171 | } |
| 169 | } | 172 | } |
| 170 | 173 | ||
| 174 | // clang-format off | ||
| 175 | |||
| 171 | void send_unicode_hex_string(const char *str) { | 176 | void send_unicode_hex_string(const char *str) { |
| 172 | if (!str) { | 177 | if (!str) { |
| 173 | return; | 178 | return; |
| @@ -175,12 +180,11 @@ void send_unicode_hex_string(const char *str) { | |||
| 175 | 180 | ||
| 176 | while (*str) { | 181 | while (*str) { |
| 177 | // Find the next code point (token) in the string | 182 | // Find the next code point (token) in the string |
| 178 | for (; *str == ' '; str++) | 183 | for (; *str == ' '; str++); // Skip leading spaces |
| 179 | ; | ||
| 180 | size_t n = strcspn(str, " "); // Length of the current token | 184 | size_t n = strcspn(str, " "); // Length of the current token |
| 181 | char code_point[n + 1]; | 185 | char code_point[n+1]; |
| 182 | strncpy(code_point, str, n); | 186 | strncpy(code_point, str, n); // Copy token into buffer |
| 183 | code_point[n] = '\0'; // Make sure it's null-terminated | 187 | code_point[n] = '\0'; // Make sure it's null-terminated |
| 184 | 188 | ||
| 185 | // Normalize the code point: make all hex digits lowercase | 189 | // Normalize the code point: make all hex digits lowercase |
| 186 | for (char *p = code_point; *p; p++) { | 190 | for (char *p = code_point; *p; p++) { |
| @@ -196,8 +200,10 @@ void send_unicode_hex_string(const char *str) { | |||
| 196 | } | 200 | } |
| 197 | } | 201 | } |
| 198 | 202 | ||
| 203 | // clang-format on | ||
| 204 | |||
| 199 | // Borrowed from https://nullprogram.com/blog/2017/10/06/ | 205 | // Borrowed from https://nullprogram.com/blog/2017/10/06/ |
| 200 | const char *decode_utf8(const char *str, int32_t *code_point) { | 206 | static const char *decode_utf8(const char *str, int32_t *code_point) { |
| 201 | const char *next; | 207 | const char *next; |
| 202 | 208 | ||
| 203 | if (str[0] < 0x80) { // U+0000-007F | 209 | if (str[0] < 0x80) { // U+0000-007F |
| @@ -231,7 +237,6 @@ void send_unicode_string(const char *str) { | |||
| 231 | } | 237 | } |
| 232 | 238 | ||
| 233 | int32_t code_point = 0; | 239 | int32_t code_point = 0; |
| 234 | |||
| 235 | while (*str) { | 240 | while (*str) { |
| 236 | str = decode_utf8(str, &code_point); | 241 | str = decode_utf8(str, &code_point); |
| 237 | 242 | ||
| @@ -243,53 +248,70 @@ void send_unicode_string(const char *str) { | |||
| 243 | } | 248 | } |
| 244 | } | 249 | } |
| 245 | 250 | ||
| 251 | // clang-format off | ||
| 252 | |||
| 253 | static void audio_helper(void) { | ||
| 254 | #ifdef AUDIO_ENABLE | ||
| 255 | switch (get_unicode_input_mode()) { | ||
| 256 | # ifdef UNICODE_SONG_MAC | ||
| 257 | static float song_mac[][2] = UNICODE_SONG_MAC; | ||
| 258 | case UC_MAC: | ||
| 259 | PLAY_SONG(song_mac); | ||
| 260 | break; | ||
| 261 | # endif | ||
| 262 | # ifdef UNICODE_SONG_LNX | ||
| 263 | static float song_lnx[][2] = UNICODE_SONG_LNX; | ||
| 264 | case UC_LNX: | ||
| 265 | PLAY_SONG(song_lnx); | ||
| 266 | break; | ||
| 267 | # endif | ||
| 268 | # ifdef UNICODE_SONG_WIN | ||
| 269 | static float song_win[][2] = UNICODE_SONG_WIN; | ||
| 270 | case UC_WIN: | ||
| 271 | PLAY_SONG(song_win); | ||
| 272 | break; | ||
| 273 | # endif | ||
| 274 | # ifdef UNICODE_SONG_BSD | ||
| 275 | static float song_bsd[][2] = UNICODE_SONG_BSD; | ||
| 276 | case UC_BSD: | ||
| 277 | PLAY_SONG(song_bsd); | ||
| 278 | break; | ||
| 279 | # endif | ||
| 280 | # ifdef UNICODE_SONG_WINC | ||
| 281 | static float song_winc[][2] = UNICODE_SONG_WINC; | ||
| 282 | case UC_WINC: | ||
| 283 | PLAY_SONG(song_winc); | ||
| 284 | break; | ||
| 285 | # endif | ||
| 286 | } | ||
| 287 | #endif | ||
| 288 | } | ||
| 289 | |||
| 290 | // clang-format on | ||
| 291 | |||
| 246 | bool process_unicode_common(uint16_t keycode, keyrecord_t *record) { | 292 | bool process_unicode_common(uint16_t keycode, keyrecord_t *record) { |
| 247 | if (record->event.pressed) { | 293 | if (record->event.pressed) { |
| 294 | bool shifted = get_mods() & MOD_MASK_SHIFT; | ||
| 248 | switch (keycode) { | 295 | switch (keycode) { |
| 249 | case UNICODE_MODE_FORWARD: | 296 | case UNICODE_MODE_FORWARD: |
| 250 | cycle_unicode_input_mode(+1); | 297 | cycle_unicode_input_mode(shifted ? -1 : +1); |
| 298 | audio_helper(); | ||
| 251 | break; | 299 | break; |
| 252 | case UNICODE_MODE_REVERSE: | 300 | case UNICODE_MODE_REVERSE: |
| 253 | cycle_unicode_input_mode(-1); | 301 | cycle_unicode_input_mode(shifted ? +1 : -1); |
| 302 | audio_helper(); | ||
| 254 | break; | 303 | break; |
| 255 | 304 | ||
| 256 | case UNICODE_MODE_MAC: | 305 | case UNICODE_MODE_MAC ... UNICODE_MODE_WINC: { |
| 257 | set_unicode_input_mode(UC_MAC); | 306 | // Keycodes and input modes follow the same ordering |
| 258 | #if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_MAC) | 307 | uint8_t delta = keycode - UNICODE_MODE_MAC; |
| 259 | static float song_mac[][2] = UNICODE_SONG_MAC; | 308 | set_unicode_input_mode(UC_MAC + delta); |
| 260 | PLAY_SONG(song_mac); | 309 | audio_helper(); |
| 261 | #endif | ||
| 262 | break; | ||
| 263 | case UNICODE_MODE_LNX: | ||
| 264 | set_unicode_input_mode(UC_LNX); | ||
| 265 | #if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_LNX) | ||
| 266 | static float song_lnx[][2] = UNICODE_SONG_LNX; | ||
| 267 | PLAY_SONG(song_lnx); | ||
| 268 | #endif | ||
| 269 | break; | ||
| 270 | case UNICODE_MODE_WIN: | ||
| 271 | set_unicode_input_mode(UC_WIN); | ||
| 272 | #if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_WIN) | ||
| 273 | static float song_win[][2] = UNICODE_SONG_WIN; | ||
| 274 | PLAY_SONG(song_win); | ||
| 275 | #endif | ||
| 276 | break; | ||
| 277 | case UNICODE_MODE_BSD: | ||
| 278 | set_unicode_input_mode(UC_BSD); | ||
| 279 | #if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_BSD) | ||
| 280 | static float song_bsd[][2] = UNICODE_SONG_BSD; | ||
| 281 | PLAY_SONG(song_bsd); | ||
| 282 | #endif | ||
| 283 | break; | ||
| 284 | case UNICODE_MODE_WINC: | ||
| 285 | set_unicode_input_mode(UC_WINC); | ||
| 286 | #if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_WINC) | ||
| 287 | static float song_winc[][2] = UNICODE_SONG_WINC; | ||
| 288 | PLAY_SONG(song_winc); | ||
| 289 | #endif | ||
| 290 | break; | 310 | break; |
| 311 | } | ||
| 291 | } | 312 | } |
| 292 | } | 313 | } |
| 314 | |||
| 293 | #if defined(UNICODE_ENABLE) | 315 | #if defined(UNICODE_ENABLE) |
| 294 | return process_unicode(keycode, record); | 316 | return process_unicode(keycode, record); |
| 295 | #elif defined(UNICODEMAP_ENABLE) | 317 | #elif defined(UNICODEMAP_ENABLE) |
diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h index 5421c28c7..4579fde8d 100644 --- a/quantum/process_keycode/process_unicode_common.h +++ b/quantum/process_keycode/process_unicode_common.h | |||
| @@ -80,7 +80,7 @@ extern uint8_t unicode_saved_mods; | |||
| 80 | void unicode_input_mode_init(void); | 80 | void unicode_input_mode_init(void); |
| 81 | uint8_t get_unicode_input_mode(void); | 81 | uint8_t get_unicode_input_mode(void); |
| 82 | void set_unicode_input_mode(uint8_t mode); | 82 | void set_unicode_input_mode(uint8_t mode); |
| 83 | void cycle_unicode_input_mode(uint8_t offset); | 83 | void cycle_unicode_input_mode(int8_t offset); |
| 84 | void persist_unicode_input_mode(void); | 84 | void persist_unicode_input_mode(void); |
| 85 | 85 | ||
| 86 | void unicode_input_start(void); | 86 | void unicode_input_start(void); |
diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c index 5445cde12..2f402a2fd 100644 --- a/quantum/process_keycode/process_unicodemap.c +++ b/quantum/process_keycode/process_unicodemap.c | |||
| @@ -21,7 +21,8 @@ __attribute__((weak)) uint16_t unicodemap_index(uint16_t keycode) { | |||
| 21 | // Keycode is a pair: extract index based on Shift / Caps Lock state | 21 | // Keycode is a pair: extract index based on Shift / Caps Lock state |
| 22 | uint16_t index = keycode - QK_UNICODEMAP_PAIR; | 22 | uint16_t index = keycode - QK_UNICODEMAP_PAIR; |
| 23 | 23 | ||
| 24 | bool shift = unicode_saved_mods & MOD_MASK_SHIFT, caps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK); | 24 | bool shift = unicode_saved_mods & MOD_MASK_SHIFT; |
| 25 | bool caps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK); | ||
| 25 | if (shift ^ caps) { | 26 | if (shift ^ caps) { |
| 26 | index >>= 7; | 27 | index >>= 7; |
| 27 | } | 28 | } |
