Browse Source

Add unicode mode change callbacks (#18235)

Joshua Diamond 2 years ago
parent
commit
e4bf832368

+ 11 - 0
docs/feature_unicode.md

@@ -206,6 +206,17 @@ The functions for starting and finishing Unicode input on your platform can be o
 
 
 You can find the default implementations of these functions in [`process_unicode_common.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_unicode_common.c).
 You can find the default implementations of these functions in [`process_unicode_common.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_unicode_common.c).
 
 
+### Input Mode Callbacks
+
+There are callbacks functions available that are called whenever the unicode input mode changes. The new input mode is passed to the function.
+
+|Callback                                           |Description                                          |
+|---------------------------------------------------|-----------------------------------------------------|
+| `unicode_input_mode_set_kb(uint8_t input_mode)`   | Callback for unicode input mode set, for keyboard.  |
+| `unicode_input_mode_set_user(uint8_t input_mode)` | Callback for unicode input mode set, for users.     |
+
+This feature can be used, for instance, to implement LED indicators for the current unicode input mode.
+
 ### Input Key Configuration
 ### Input Key Configuration
 
 
 You can customize the keys used to trigger Unicode input for macOS, Linux and WinCompose by adding corresponding defines to your `config.h`. The default values match the platforms' default settings, so you shouldn't need to change this unless Unicode input isn't working, or you want to use a different key (e.g. in order to free up left or right Alt).
 You can customize the keys used to trigger Unicode input for macOS, Linux and WinCompose by adding corresponding defines to your `config.h`. The default values match the platforms' default settings, so you shouldn't need to change this unless Unicode input isn't working, or you want to use a different key (e.g. in order to free up left or right Alt).

+ 17 - 0
quantum/process_keycode/process_unicode_common.c

@@ -29,6 +29,20 @@ static int8_t  selected_count = ARRAY_SIZE(selected);
 static int8_t  selected_index;
 static int8_t  selected_index;
 #endif
 #endif
 
 
+/** \brief Uunicode input mode set at user level
+ *
+ * Run user code on unicode input mode change
+ */
+__attribute__((weak)) void unicode_input_mode_set_user(uint8_t input_mode) {}
+
+/** \brief unicode input mode set at keyboard level
+ *
+ *  Run keyboard code on unicode input mode change
+ */
+__attribute__((weak)) void unicode_input_mode_set_kb(uint8_t input_mode) {
+    unicode_input_mode_set_user(input_mode);
+}
+
 void unicode_input_mode_init(void) {
 void unicode_input_mode_init(void) {
     unicode_config.raw = eeprom_read_byte(EECONFIG_UNICODEMODE);
     unicode_config.raw = eeprom_read_byte(EECONFIG_UNICODEMODE);
 #if UNICODE_SELECTED_MODES != -1
 #if UNICODE_SELECTED_MODES != -1
@@ -50,6 +64,7 @@ void unicode_input_mode_init(void) {
     unicode_config.input_mode = selected[selected_index = 0];
     unicode_config.input_mode = selected[selected_index = 0];
 #    endif
 #    endif
 #endif
 #endif
+    unicode_input_mode_set_kb(unicode_config.input_mode);
     dprintf("Unicode input mode init to: %u\n", unicode_config.input_mode);
     dprintf("Unicode input mode init to: %u\n", unicode_config.input_mode);
 }
 }
 
 
@@ -60,6 +75,7 @@ uint8_t get_unicode_input_mode(void) {
 void set_unicode_input_mode(uint8_t mode) {
 void set_unicode_input_mode(uint8_t mode) {
     unicode_config.input_mode = mode;
     unicode_config.input_mode = mode;
     persist_unicode_input_mode();
     persist_unicode_input_mode();
+    unicode_input_mode_set_kb(mode);
     dprintf("Unicode input mode set to: %u\n", unicode_config.input_mode);
     dprintf("Unicode input mode set to: %u\n", unicode_config.input_mode);
 }
 }
 
 
@@ -73,6 +89,7 @@ void cycle_unicode_input_mode(int8_t offset) {
 #    if UNICODE_CYCLE_PERSIST
 #    if UNICODE_CYCLE_PERSIST
     persist_unicode_input_mode();
     persist_unicode_input_mode();
 #    endif
 #    endif
+    unicode_input_mode_set_kb(unicode_config.input_mode);
     dprintf("Unicode input mode cycle to: %u\n", unicode_config.input_mode);
     dprintf("Unicode input mode cycle to: %u\n", unicode_config.input_mode);
 #endif
 #endif
 }
 }

+ 3 - 0
quantum/process_keycode/process_unicode_common.h

@@ -87,6 +87,9 @@ void unicode_input_start(void);
 void unicode_input_finish(void);
 void unicode_input_finish(void);
 void unicode_input_cancel(void);
 void unicode_input_cancel(void);
 
 
+void unicode_input_mode_set_user(uint8_t input_mode);
+void unicode_input_mode_set_kb(uint8_t input_mode);
+
 void register_hex(uint16_t hex);
 void register_hex(uint16_t hex);
 void register_hex32(uint32_t hex);
 void register_hex32(uint32_t hex);
 void register_unicode(uint32_t code_point);
 void register_unicode(uint32_t code_point);

+ 11 - 20
users/spidey3/layer_rgb.c

@@ -112,8 +112,7 @@ void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) {
     }
     }
 }
 }
 
 
-void do_rgb_unicode(void) {
-    uint8_t uc_mode = get_unicode_input_mode();
+void do_rgb_unicode(uint8_t uc_mode) {
     for (uint8_t i = 0; i < UC__COUNT; i++) {
     for (uint8_t i = 0; i < UC__COUNT; i++) {
         bool is_on = i == uc_mode;
         bool is_on = i == uc_mode;
         rgblight_set_layer_state(UNICODE_OFFSET + i, is_on);
         rgblight_set_layer_state(UNICODE_OFFSET + i, is_on);
@@ -123,7 +122,7 @@ void do_rgb_unicode(void) {
 void do_rgb_all(void) {
 void do_rgb_all(void) {
     do_rgb_layers(default_layer_state, LAYER_BASE_DEFAULT, LAYER_BASE_REGULAR);
     do_rgb_layers(default_layer_state, LAYER_BASE_DEFAULT, LAYER_BASE_REGULAR);
     do_rgb_layers(layer_state, LAYER_BASE_REGULAR, LAYER_BASE_END);
     do_rgb_layers(layer_state, LAYER_BASE_REGULAR, LAYER_BASE_END);
-    do_rgb_unicode();
+    do_rgb_unicode(get_unicode_input_mode());
     rgblight_set_layer_state(MISC_OFFSET + 0, spi_gflock);
     rgblight_set_layer_state(MISC_OFFSET + 0, spi_gflock);
     rgblight_set_layer_state(MISC_OFFSET + 1, spi_replace_mode != SPI_NORMAL);
     rgblight_set_layer_state(MISC_OFFSET + 1, spi_replace_mode != SPI_NORMAL);
 }
 }
@@ -148,7 +147,7 @@ extern rgblight_status_t rgblight_status;
 #    define STARTUP_ANIMATION_CYCLE_STEP 2
 #    define STARTUP_ANIMATION_CYCLE_STEP 2
 #    define STARTUP_ANIMATION_RAMP_TO_STEPS 70
 #    define STARTUP_ANIMATION_RAMP_TO_STEPS 70
 #    define STARTUP_ANIMATION_STEP_TIME 10
 #    define STARTUP_ANIMATION_STEP_TIME 10
-#    define STARTUP_ANIMATION_INITIAL_DELAY 0  // milliseconds, must be < 255 * STEP_TIME
+#    define STARTUP_ANIMATION_INITIAL_DELAY 0 // milliseconds, must be < 255 * STEP_TIME
 
 
 // clang-format off
 // clang-format off
 typedef enum {
 typedef enum {
@@ -382,6 +381,13 @@ bool led_update_user_rgb(led_t led_state) {
     return true;
     return true;
 }
 }
 
 
+#if defined(UNICODE_COMMON_ENABLE)
+void unicode_input_mode_set_user_rgb(uint8_t input_mode) {
+    rgb_layer_ack(ACK_MEH);
+    do_rgb_unicode(input_mode);
+}
+#endif
+
 void rgb_layer_ack_yn(bool yn) { rgb_layer_ack(yn ? ACK_YES : ACK_NO); }
 void rgb_layer_ack_yn(bool yn) { rgb_layer_ack(yn ? ACK_YES : ACK_NO); }
 
 
 void rgb_layer_ack(layer_ack_t n) {
 void rgb_layer_ack(layer_ack_t n) {
@@ -458,7 +464,7 @@ void post_process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
             break;
             break;
 
 
         case RGB_TOG:
         case RGB_TOG:
-            // Hack - we only get called on the press for RGB_TOG, 
+            // Hack - we only get called on the press for RGB_TOG,
             // but the flag is only flipped on the release...
             // but the flag is only flipped on the release...
             rgb_layer_ack_yn(!rgblight_config.enable);
             rgb_layer_ack_yn(!rgblight_config.enable);
             break;
             break;
@@ -476,20 +482,5 @@ void post_process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
             rgb_layer_ack_yn(keymap_config.nkro);
             rgb_layer_ack_yn(keymap_config.nkro);
             break;
             break;
 #endif
 #endif
-
-#if defined(UNICODE_COMMON_ENABLE)
-        case UC_M_MA:
-        case UC_M_LN:
-        case UC_M_WI:
-        case UC_M_BS:
-        case UC_M_WC:
-        case UC_M_EM:
-
-        case UC_MOD:
-        case UC_RMOD:
-            rgb_layer_ack(ACK_MEH);
-            do_rgb_unicode();
-            break;
-#endif
     }
     }
 }
 }

+ 13 - 5
users/spidey3/spidey3.c

@@ -98,14 +98,14 @@ bool process_record_glyph_replacement(uint16_t keycode, keyrecord_t *record, uin
                     clear_oneshot_mods();
                     clear_oneshot_mods();
 #endif
 #endif
 
 
-                    bool caps = host_keyboard_led_state().caps_lock;
+                    bool     caps = host_keyboard_led_state().caps_lock;
                     uint32_t base = ((shifted == caps) ? baseAlphaLower : baseAlphaUpper);
                     uint32_t base = ((shifted == caps) ? baseAlphaLower : baseAlphaUpper);
                     _register(base + (keycode - KC_A));
                     _register(base + (keycode - KC_A));
                     set_mods(temp_mod);
                     set_mods(temp_mod);
                 }
                 }
                 return false;
                 return false;
             case KC_0:
             case KC_0:
-                if (shifted) {  // skip shifted numbers, so that we can still use symbols etc.
+                if (shifted) { // skip shifted numbers, so that we can still use symbols etc.
                     return true;
                     return true;
                 }
                 }
                 if (record->event.pressed) {
                 if (record->event.pressed) {
@@ -113,7 +113,7 @@ bool process_record_glyph_replacement(uint16_t keycode, keyrecord_t *record, uin
                 }
                 }
                 return false;
                 return false;
             case KC_1 ... KC_9:
             case KC_1 ... KC_9:
-                if (shifted) {  // skip shifted numbers, so that we can still use symbols etc.
+                if (shifted) { // skip shifted numbers, so that we can still use symbols etc.
                     return true;
                     return true;
                 }
                 }
                 if (record->event.pressed) {
                 if (record->event.pressed) {
@@ -122,7 +122,7 @@ bool process_record_glyph_replacement(uint16_t keycode, keyrecord_t *record, uin
                 return false;
                 return false;
             case KC_SPACE:
             case KC_SPACE:
                 if (record->event.pressed) {
                 if (record->event.pressed) {
-                    _register(spaceGlyph);  // em space
+                    _register(spaceGlyph); // em space
                 }
                 }
                 return false;
                 return false;
         }
         }
@@ -338,7 +338,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
                     set_mods(mods);
                     set_mods(mods);
                     return false;
                     return false;
                 }
                 }
-            } else {  // on release of KC_BSPC
+            } else { // on release of KC_BSPC
                 // In case KC_DEL is still being sent even after the release of KC_BSPC
                 // In case KC_DEL is still being sent even after the release of KC_BSPC
                 if (delkey_registered) {
                 if (delkey_registered) {
                     unregister_code(KC_DEL);
                     unregister_code(KC_DEL);
@@ -387,3 +387,11 @@ bool led_update_user(led_t led_state) {
     return true;
     return true;
 #endif
 #endif
 }
 }
+
+#if defined(UNICODE_COMMON_ENABLE)
+void unicode_input_mode_set_user(uint8_t input_mode) {
+#    ifdef RGBLIGHT_ENABLE
+    unicode_input_mode_set_user_rgb(input_mode);
+#    endif
+}
+#endif

+ 8 - 3
users/spidey3/spidey3.h

@@ -17,9 +17,9 @@ enum userspace_layers {
 };
 };
 
 
 enum custom_keycodes {
 enum custom_keycodes {
-    CH_CPNL = SAFE_RANGE,  // AL Control Panel
-    CH_ASST,               // AL Context-aware Desktop Assistant
-    CH_SUSP,               // Suspend
+    CH_CPNL = SAFE_RANGE, // AL Control Panel
+    CH_ASST,              // AL Context-aware Desktop Assistant
+    CH_SUSP,              // Suspend
 
 
     SPI_NORMAL,
     SPI_NORMAL,
     SPI_WIDE,
     SPI_WIDE,
@@ -65,6 +65,11 @@ void          rgb_layer_ack(layer_ack_t n);
 void          rgb_layer_ack_yn(bool yn);
 void          rgb_layer_ack_yn(bool yn);
 void          clear_rgb_layers(void);
 void          clear_rgb_layers(void);
 void          shutdown_user_rgb(void);
 void          shutdown_user_rgb(void);
+
+#    if defined(UNICODE_COMMON_ENABLE)
+void unicode_input_mode_set_user_rgb(uint8_t input_mode);
+#    endif
+
 #endif
 #endif
 
 
 #ifdef UNICODEMAP_ENABLE
 #ifdef UNICODEMAP_ENABLE