Add unicode mode change callbacks (#18235)

This commit is contained in:
Joshua Diamond 2022-08-31 19:39:16 -04:00 committed by GitHub
parent b9effc94db
commit e4bf832368
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 63 additions and 28 deletions

View File

@ -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).

View File

@ -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
} }

View File

@ -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);

View File

@ -112,8 +112,7 @@ void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) {
} }
} }
void do_rgb_unicode(void) { void do_rgb_unicode(uint8_t uc_mode) {
uint8_t uc_mode = get_unicode_input_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
} }
} }

View File

@ -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

View File

@ -17,9 +17,9 @@ enum userspace_layers {
}; };
enum custom_keycodes { enum custom_keycodes {
CH_CPNL = SAFE_RANGE, // AL Control Panel CH_CPNL = SAFE_RANGE, // AL Control Panel
CH_ASST, // AL Context-aware Desktop Assistant CH_ASST, // AL Context-aware Desktop Assistant
CH_SUSP, // Suspend 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