Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add unicode mode change callbacks #18235

Merged
merged 3 commits into from
Aug 31, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions docs/feature_unicode.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

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

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).
Expand Down
17 changes: 17 additions & 0 deletions quantum/process_keycode/process_unicode_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,20 @@ static int8_t selected_count = ARRAY_SIZE(selected);
static int8_t selected_index;
#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) {
unicode_config.raw = eeprom_read_byte(EECONFIG_UNICODEMODE);
#if UNICODE_SELECTED_MODES != -1
Expand All @@ -50,6 +64,7 @@ void unicode_input_mode_init(void) {
unicode_config.input_mode = selected[selected_index = 0];
# endif
#endif
unicode_input_mode_set_kb(unicode_config.input_mode);
dprintf("Unicode input mode init to: %u\n", unicode_config.input_mode);
}

Expand All @@ -60,6 +75,7 @@ uint8_t get_unicode_input_mode(void) {
void set_unicode_input_mode(uint8_t mode) {
unicode_config.input_mode = mode;
persist_unicode_input_mode();
unicode_input_mode_set_kb(mode);
dprintf("Unicode input mode set to: %u\n", unicode_config.input_mode);
}

Expand All @@ -73,6 +89,7 @@ void cycle_unicode_input_mode(int8_t offset) {
# if UNICODE_CYCLE_PERSIST
persist_unicode_input_mode();
# endif
unicode_input_mode_set_kb(unicode_config.input_mode);
dprintf("Unicode input mode cycle to: %u\n", unicode_config.input_mode);
#endif
}
Expand Down
3 changes: 3 additions & 0 deletions quantum/process_keycode/process_unicode_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ void unicode_input_start(void);
void unicode_input_finish(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_hex32(uint32_t hex);
void register_unicode(uint32_t code_point);
Expand Down
31 changes: 11 additions & 20 deletions users/spidey3/layer_rgb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++) {
bool is_on = i == uc_mode;
rgblight_set_layer_state(UNICODE_OFFSET + i, is_on);
Expand All @@ -123,7 +122,7 @@ void do_rgb_unicode(void) {
void do_rgb_all(void) {
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_unicode();
do_rgb_unicode(get_unicode_input_mode());
rgblight_set_layer_state(MISC_OFFSET + 0, spi_gflock);
rgblight_set_layer_state(MISC_OFFSET + 1, spi_replace_mode != SPI_NORMAL);
}
Expand All @@ -148,7 +147,7 @@ extern rgblight_status_t rgblight_status;
# define STARTUP_ANIMATION_CYCLE_STEP 2
# define STARTUP_ANIMATION_RAMP_TO_STEPS 70
# 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
typedef enum {
Expand Down Expand Up @@ -382,6 +381,13 @@ bool led_update_user_rgb(led_t led_state) {
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(layer_ack_t n) {
Expand Down Expand Up @@ -458,7 +464,7 @@ void post_process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
break;

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...
rgb_layer_ack_yn(!rgblight_config.enable);
break;
Expand All @@ -476,20 +482,5 @@ void post_process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
rgb_layer_ack_yn(keymap_config.nkro);
break;
#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
}
}
18 changes: 13 additions & 5 deletions users/spidey3/spidey3.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,22 +98,22 @@ bool process_record_glyph_replacement(uint16_t keycode, keyrecord_t *record, uin
clear_oneshot_mods();
#endif

bool caps = host_keyboard_led_state().caps_lock;
bool caps = host_keyboard_led_state().caps_lock;
uint32_t base = ((shifted == caps) ? baseAlphaLower : baseAlphaUpper);
_register(base + (keycode - KC_A));
set_mods(temp_mod);
}
return false;
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;
}
if (record->event.pressed) {
_register(zeroGlyph);
}
return false;
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;
}
if (record->event.pressed) {
Expand All @@ -122,7 +122,7 @@ bool process_record_glyph_replacement(uint16_t keycode, keyrecord_t *record, uin
return false;
case KC_SPACE:
if (record->event.pressed) {
_register(spaceGlyph); // em space
_register(spaceGlyph); // em space
}
return false;
}
Expand Down Expand Up @@ -338,7 +338,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
set_mods(mods);
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
if (delkey_registered) {
unregister_code(KC_DEL);
Expand Down Expand Up @@ -387,3 +387,11 @@ bool led_update_user(led_t led_state) {
return true;
#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
11 changes: 8 additions & 3 deletions users/spidey3/spidey3.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ enum userspace_layers {
};

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_WIDE,
Expand Down Expand Up @@ -65,6 +65,11 @@ void rgb_layer_ack(layer_ack_t n);
void rgb_layer_ack_yn(bool yn);
void clear_rgb_layers(void);
void shutdown_user_rgb(void);

# if defined(UNICODE_COMMON_ENABLE)
void unicode_input_mode_set_user_rgb(uint8_t input_mode);
# endif

#endif

#ifdef UNICODEMAP_ENABLE
Expand Down