From a9f98311bff1205b4d94f45d84f9fcd6b9169121 Mon Sep 17 00:00:00 2001 From: Kan-Ru Chen Date: Mon, 7 Oct 2024 22:27:56 +0900 Subject: [PATCH 1/2] fix: only restore ChiEng mode from capslock state if capslock is the toggle key --- src/ibus-chewing-engine.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ibus-chewing-engine.c b/src/ibus-chewing-engine.c index 621231c..cba73f0 100644 --- a/src/ibus-chewing-engine.c +++ b/src/ibus-chewing-engine.c @@ -512,7 +512,7 @@ static void ibus_chewing_engine_init(IBusChewingEngine *self) { void ibus_chewing_engine_restore_mode(IBusChewingEngine *self) { g_return_if_fail(self != NULL); g_return_if_fail(IBUS_IS_CHEWING_ENGINE(self)); - { + if (ibus_chewing_engine_get_chinese_english_toggle_key(self) == 'c') { IBUS_CHEWING_LOG(DEBUG, "restore_mode() statusFlags=%x", self->statusFlags); GdkDisplay *display = gdk_display_get_default(); From 23bb3895985209e45654642be86e884bc24b9f10 Mon Sep 17 00:00:00 2001 From: Kan-Ru Chen Date: Mon, 7 Oct 2024 22:29:22 +0900 Subject: [PATCH 2/2] fix: always process capslock key to allow toggle ChiEng mode --- src/IBusChewingPreEdit-private.h | 49 +++++++++++++++----------------- src/IBusChewingPreEdit.c | 3 +- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/IBusChewingPreEdit-private.h b/src/IBusChewingPreEdit-private.h index dffd1c3..aef2275 100644 --- a/src/IBusChewingPreEdit-private.h +++ b/src/IBusChewingPreEdit-private.h @@ -34,7 +34,7 @@ #define bpmf_check ibus_chewing_bopomofo_check(self->context) #define table_is_showing ibus_chewing_pre_edit_has_flag(self, FLAG_TABLE_SHOW) -#define is_capslock (umaskedMod == IBUS_LOCK_MASK) +#define is_capslock (unmaskedMod & IBUS_LOCK_MASK) #define is_shift_only (maskedMod == IBUS_SHIFT_MASK) #define is_shift (unmaskedMod & IBUS_SHIFT_MASK) #define is_ctrl_only (maskedMod == IBUS_CONTROL_MASK) @@ -42,7 +42,7 @@ /*== Event processing ==*/ /* We only recognize the combination of shift, control and alt */ -#define modifiers_mask(unmaskedMod) \ +#define modifiers_mask(unmaskedMod) \ unmaskedMod &(IBUS_SHIFT_MASK | IBUS_CONTROL_MASK | IBUS_MOD1_MASK) /** @@ -53,39 +53,36 @@ * allowed. allowed=IBUS_SHIFT_MASK means both keysym without modifier or shift * are allowed. */ -#define filter_modifiers(allowed) \ - KeyModifiers maskedMod = modifiers_mask(unmaskedMod); \ - if ((maskedMod) & (~(allowed))) { \ - return EVENT_RESPONSE_IGNORE; \ +#define filter_modifiers(allowed) \ + KeyModifiers maskedMod = modifiers_mask(unmaskedMod); \ + if ((maskedMod) & (~(allowed))) { \ + return EVENT_RESPONSE_IGNORE; \ } -#define absorb_when_release \ - if (event_is_released(unmaskedMod)) { \ - return EVENT_RESPONSE_ABSORB; \ +#define absorb_when_release \ + if (event_is_released(unmaskedMod)) { \ + return EVENT_RESPONSE_ABSORB; \ } -#define ignore_when_release \ - if (event_is_released(unmaskedMod)) { \ - return EVENT_RESPONSE_IGNORE; \ +#define ignore_when_release \ + if (event_is_released(unmaskedMod)) { \ + return EVENT_RESPONSE_IGNORE; \ } -#define ignore_when_buffer_is_empty \ - if (buffer_is_empty) { \ - return EVENT_RESPONSE_IGNORE; \ +#define ignore_when_buffer_is_empty \ + if (buffer_is_empty) { \ + return EVENT_RESPONSE_IGNORE; \ } -#define ignore_when_buffer_is_empty_and_table_not_showing \ - if (buffer_is_empty && !table_is_showing) { \ - return EVENT_RESPONSE_IGNORE; \ +#define ignore_when_buffer_is_empty_and_table_not_showing \ + if (buffer_is_empty && !table_is_showing) { \ + return EVENT_RESPONSE_IGNORE; \ } #define event_is_released(unmaskedMod) ((unmaskedMod & IBUS_RELEASE_MASK) != 0) -#define event_process_or_ignore(cond) \ - (cond) ? EVENT_RESPONSE_PROCESS : EVENT_RESPONSE_IGNORE +#define event_process_or_ignore(cond) (cond) ? EVENT_RESPONSE_PROCESS : EVENT_RESPONSE_IGNORE -#define handle_log(funcName) \ - IBUS_CHEWING_LOG(INFO, "* self_handle_%s(-,%x(%s),%x(%s))", funcName, \ - kSym, key_sym_get_name(kSym), unmaskedMod, \ - modifiers_to_string(unmaskedMod)); +#define handle_log(funcName) \ + IBUS_CHEWING_LOG(INFO, "* self_handle_%s(-,%x(%s),%x(%s))", funcName, kSym, \ + key_sym_get_name(kSym), unmaskedMod, modifiers_to_string(unmaskedMod)); -KSym self_key_sym_fix(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod); +KSym self_key_sym_fix(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod); EventResponse self_handle_key_sym_default(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod); diff --git a/src/IBusChewingPreEdit.c b/src/IBusChewingPreEdit.c index 60672b5..646af7f 100644 --- a/src/IBusChewingPreEdit.c +++ b/src/IBusChewingPreEdit.c @@ -336,7 +336,7 @@ EventResponse self_handle_num_keypad(IBusChewingPreEdit *self, KSym kSym, } EventResponse self_handle_caps_lock(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { - filter_modifiers(0); + filter_modifiers(IBUS_LOCK_MASK); IBusChewingEngine *engine = IBUS_CHEWING_ENGINE(self->engine); gchar toggleChinese = ibus_chewing_engine_get_chinese_english_toggle_key(engine); @@ -781,6 +781,7 @@ gboolean ibus_chewing_pre_edit_process_key(IBusChewingPreEdit *self, KSym kSym, if (!is_full_shape && !is_chinese && !(kSym == IBUS_KEY_space && unmaskedMod == IBUS_SHIFT_MASK) && + !(kSym == IBUS_KEY_Caps_Lock && is_capslock) && !is_shift_toggle(self->keyLast, kSym, unmaskedMod)) { /* Users treat English Sub-mode as IM Disabled, * So key strokes should be passed to client directly. Github 144.