From f0c328051795f63ba2f7ffaca9701c01bda7d744 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 18 Aug 2021 19:26:45 +0200 Subject: [PATCH] fix(linux): Fix lost context after pressing K_SHIFT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes typing `n>` with sil_ipa keyboard which no longer output the expected `ŋ` because pressing the shift key reset the context. For modifier key presses we now exit `KMX_ProcessEvent::ProcessEvent` early. This change also removes a redundant line from engine.c. Clearing the context happens in `reset_context()` again if necessary. Fixes #5591. --- .../core/desktop/src/kmx/kmx_processevent.cpp | 8 +++++--- .../desktop/tests/unit/kmx/013 - deadkeys.kmn | 10 +++++----- .../desktop/tests/unit/kmx/013 - deadkeys.kmx | Bin 484 -> 496 bytes .../desktop/tests/unit/kmx/031 - caps lock.kmn | 12 ++++++++++-- .../desktop/tests/unit/kmx/031 - caps lock.kmx | Bin 740 -> 876 bytes linux/ibus-keyman/src/engine.c | 1 - 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/common/core/desktop/src/kmx/kmx_processevent.cpp b/common/core/desktop/src/kmx/kmx_processevent.cpp index 9e1b04849a..a1f0ce3139 100644 --- a/common/core/desktop/src/kmx/kmx_processevent.cpp +++ b/common/core/desktop/src/kmx/kmx_processevent.cpp @@ -119,7 +119,10 @@ KMX_BOOL KMX_ProcessEvent::ProcessEvent( break; case KM_KBP_VKEY_SHIFT: KeyShiftPress(modifiers, isKeyDown); - break; + return TRUE; + case KM_KBP_VKEY_CONTROL: + case KM_KBP_VKEY_ALT: + return TRUE; } if (!isKeyDown) { @@ -293,7 +296,6 @@ KMX_BOOL KMX_ProcessEvent::ProcessGroup(LPGROUP gp, KMX_BOOL *pOutputKeystroke) m_actions.QueueAction(QIT_BACK, BK_DEADKEY); // side effect: also removes last char from context pdeletecontext = m_context.Buf(1); } - } else { // I4024 // I4128 // I4287 // I4290 DebugLog(" ... IsLegacy = FALSE; IsTIP = TRUE"); // I4128 m_actions.QueueAction(QIT_INVALIDATECONTEXT, 0); @@ -313,7 +315,7 @@ KMX_BOOL KMX_ProcessEvent::ProcessGroup(LPGROUP gp, KMX_BOOL *pOutputKeystroke) PostString(gp->dpNoMatch, m_keyboard.Keyboard, NULL, pOutputKeystroke); if(m_debug_items) { m_debug_items->push_nomatch_exit(m_actions.Length(), gp); - } + } } else if (m_state.charCode != 0 && m_state.charCode != 0xFFFF && gp->fUsingKeys) { diff --git a/common/core/desktop/tests/unit/kmx/013 - deadkeys.kmn b/common/core/desktop/tests/unit/kmx/013 - deadkeys.kmn index 63327da053..3416755a07 100644 --- a/common/core/desktop/tests/unit/kmx/013 - deadkeys.kmn +++ b/common/core/desktop/tests/unit/kmx/013 - deadkeys.kmn @@ -1,14 +1,14 @@ c Description: Tests a simple deadkey rule in Unicode -c keys: [SHIFT K_6][K_A] -c expected: \u00E2 -c context: +c keys: [SHIFT K_6][K_A][SHIFT K_6][K_SHIFT][K_A][SHIFT K_6][RALT K_B][K_A][SHIFT K_6][K_CAPS][K_A] +c expected: pass.pass.pass.pass. +c context: store(&VERSION) '9.0' begin unicode > use(main) -group(main) using keys +group(main) using keys + '^' > deadkey(1) -dk(1) + 'a' > U+00E2 +dk(1) + [K_A] > 'pass.' diff --git a/common/core/desktop/tests/unit/kmx/013 - deadkeys.kmx b/common/core/desktop/tests/unit/kmx/013 - deadkeys.kmx index f093590e0608474db7471ff98ec81fa3a448d5c6..738f057e0928d7bf963e73261b661f9bc50a0871 100644 GIT binary patch delta 259 zcmaFD{DGOrJ0c{Qfs=tDZGWD^L>`Iy4n_us|3JWi1U>-8KtL3TnSksCKw1olIe=^y zAQlI*C4e*+5OV<8N?z*byko2aDI`7s delta 247 zcmeys{DhguJ0c{Qfs=tDS+~${B9BCU3nK%=e;{B$0#ATqARr1Nfb0c8N(_kEfNUlp z76 'pass.' + 'B' > 'fail.' + +c Caps is on. The virtual key should match. ++ [SHIFT K_C] > 'fail.' ++ [K_C] > 'pass.' + +c Caps was pressed and released, so Caps is now off. The virtual key should still match. ++ [SHIFT K_D] > 'fail.' ++ [K_D] > 'pass.' diff --git a/common/core/desktop/tests/unit/kmx/031 - caps lock.kmx b/common/core/desktop/tests/unit/kmx/031 - caps lock.kmx index e317f13349c7e2582fea5f7b1cd91b59e30820a3..27533f5a2acecd1bd5e60d07f6c6c9fe2be8758b 100644 GIT binary patch delta 330 zcmXYsu}Z^G7)HO`iy|e43Q}#M1w|Z02Wuy%*mf(FLOVE!priN>d4s Ucy*2N?2<5XC*cjo>~X%66=94hDgXcg delta 241 zcmaFE_JozkJ0c{Qfs28GA*Aa4L>?WcCrlfyTo@U-Cf75{)<-ZgFr)ynAyA$dh#8z1 z7}9|JBB&T2NX(Iep#;cp0AgbxR|F&m1WiDG9}pV>*#aQ!#K15C$e#lh69kC?_09wG zR{=4Q$si8IAg~6=-@(LS4YH3x3M|CHunQ=742Tnfd@-ol2_XLp5GMiol2Ea0K>j19 V$-kK7Cck6io6N;51EeiLYygP>A(j9D diff --git a/linux/ibus-keyman/src/engine.c b/linux/ibus-keyman/src/engine.c index bbb0ac2dfd..0d895543e4 100644 --- a/linux/ibus-keyman/src/engine.c +++ b/linux/ibus-keyman/src/engine.c @@ -754,7 +754,6 @@ static gboolean process_emit_keystroke_action(IBusKeymanEngine *keyman) { static gboolean process_invalidate_context_action(IBusEngine *engine) { IBusKeymanEngine *keyman = (IBusKeymanEngine *)engine; - km_kbp_context_clear(km_kbp_state_context(keyman->state)); reset_context(engine); return TRUE; }