Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Backports:SLE-15-SP4:Update
fcitx-unikey
fix_the_shift_key_bug_in_chromium.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File fix_the_shift_key_bug_in_chromium.patch of Package fcitx-unikey
From 3b9bc74096a8df2344ccc9cfa6217a8ebac5f5e3 Mon Sep 17 00:00:00 2001 From: Weng Xuetian <wengxt@gmail.com> Date: Thu, 12 Nov 2020 20:51:11 -0800 Subject: [PATCH] Fix #24 Use a different method to detect Shift + Shift hotkey. --- src/unikey-im.cpp | 114 +++++++++++++++++++++++++++++----------------- src/unikey-im.h | 1 + 2 files changed, 72 insertions(+), 43 deletions(-) diff --git a/src/unikey-im.cpp b/src/unikey-im.cpp index 5f3b158..e7c277f 100644 --- a/src/unikey-im.cpp +++ b/src/unikey-im.cpp @@ -23,6 +23,7 @@ #include <fcitx/ime.h> #include <fcitx/hook.h> #include <fcitx/instance.h> +#include <fcitx/keys.h> #include <fcitx-config/xdg.h> #include <fcitx-utils/log.h> #include <errno.h> @@ -40,6 +41,7 @@ static void* FcitxUnikeyCreate(FcitxInstance* instance); static void FcitxUnikeyDestroy(void* arg); static INPUT_RETURN_VALUE FcitxUnikeyDoInput(void* arg, FcitxKeySym sym, unsigned int state); +static INPUT_RETURN_VALUE FcitxUnikeyDoReleaseInput(void* arg, FcitxKeySym sym, unsigned int state); static boolean FcitxUnikeyInit(void* arg); static void FcitxUnikeyReset(void* arg); static void FcitxUnikeyResetUI(void* arg); @@ -89,6 +91,45 @@ static const unsigned char WordAutoCommit[] = 'P', 'Q', 'R', 'S', 'T', 'V', 'X', 'Z' }; +static void FcitxUnikeySyncState(FcitxUnikey* unikey, FcitxKeySym sym) { + // process result of ukengine + if (UnikeyBackspaces > 0) + { + if (unikey->preeditstr->length() <= (unsigned int)UnikeyBackspaces) + { + unikey->preeditstr->clear(); + } + else + { + FcitxUnikeyEraseChars(unikey, UnikeyBackspaces); + } + } + + if (UnikeyBufChars > 0) + { + if (unikey->config.oc == UKCONV_XUTF8) + { + unikey->preeditstr->append((const char*)UnikeyBuf, UnikeyBufChars); + } + else + { + unsigned char buf[CONVERT_BUF_SIZE + 1]; + int bufSize = CONVERT_BUF_SIZE; + + latinToUtf(buf, UnikeyBuf, UnikeyBufChars, &bufSize); + unikey->preeditstr->append((const char*)buf, CONVERT_BUF_SIZE - bufSize); + } + } + else if (sym != FcitxKey_Shift_L && sym != FcitxKey_Shift_R) // if ukengine not process + { + int n; + char s[7] = {0, 0, 0, 0, 0, 0, 0}; + n = fcitx_ucs4_to_utf8((unsigned int)sym, s); // convert ucs4 to utf8 char + unikey->preeditstr->append(s, n); + } + // end process result of ukengine +} + void* FcitxUnikeyCreate(FcitxInstance* instance) { FcitxUnikey* unikey = (FcitxUnikey*) fcitx_utils_malloc0(sizeof(FcitxUnikey)); @@ -106,6 +147,7 @@ void* FcitxUnikeyCreate(FcitxInstance* instance) iface.Init = FcitxUnikeyInit; iface.ResetIM = FcitxUnikeyReset; iface.DoInput = FcitxUnikeyDoInput; + iface.DoReleaseInput = FcitxUnikeyDoReleaseInput; iface.ReloadConfig = ReloadConfigFcitxUnikey; iface.Save = FcitxUnikeySave; @@ -154,6 +196,7 @@ void FcitxUnikeyReset(void* arg) UnikeyResetBuf(); unikey->preeditstr->clear(); FcitxUnikeyUpdatePreedit(unikey); + unikey->lastShiftPressed = FcitxKey_None; } void FcitxUnikeyCommit(FcitxUnikey* unikey) @@ -188,8 +231,32 @@ INPUT_RETURN_VALUE FcitxUnikeyDoInput(void* arg, FcitxKeySym sym, unsigned int s return tmp; } +INPUT_RETURN_VALUE FcitxUnikeyDoReleaseInput(void* arg, FcitxKeySym sym, unsigned int state) +{ + FcitxUnikey* unikey = (FcitxUnikey*) arg; + if (FcitxHotkeyIsHotKey(sym, state, FCITX_LSHIFT) || FcitxHotkeyIsHotKey(sym, state, FCITX_RSHIFT)) { + unikey->lastShiftPressed = FcitxKey_None; + } + + return IRV_TO_PROCESS; +} + INPUT_RETURN_VALUE FcitxUnikeyDoInputPreedit(FcitxUnikey* unikey, FcitxKeySym sym, unsigned int state) { + if (FcitxHotkeyIsHotKey(sym, state, FCITX_LSHIFT) || FcitxHotkeyIsHotKey(sym, state, FCITX_RSHIFT)) { + if (unikey->lastShiftPressed == FcitxKey_None) { + unikey->lastShiftPressed = sym; + } else if (unikey->lastShiftPressed != sym) { + UnikeyRestoreKeyStrokes(); + FcitxUnikeySyncState(unikey, sym); + FcitxUnikeyUpdatePreedit(unikey); + unikey->lastShiftPressed = FcitxKey_None; + return IRV_DISPLAY_MESSAGE; + } + } else { + // We pressed something else, reset the state. + unikey->lastShiftPressed = FcitxKey_None; + } if (state & FcitxKeyState_Ctrl || state & FcitxKeyState_Alt // alternate mask @@ -210,8 +277,7 @@ INPUT_RETURN_VALUE FcitxUnikeyDoInputPreedit(FcitxUnikey* unikey, FcitxKeySym sy return IRV_TO_PROCESS; } else if ((sym >= FcitxKey_Caps_Lock && sym <= FcitxKey_Hyper_R) - || (!(state & FcitxKeyState_Shift) && (sym == FcitxKey_Shift_L || sym == FcitxKey_Shift_R)) // when press one shift key - ) + || sym == FcitxKey_Shift_L || sym == FcitxKey_Shift_R) { return IRV_TO_PROCESS; } @@ -268,8 +334,7 @@ INPUT_RETURN_VALUE FcitxUnikeyDoInputPreedit(FcitxUnikey* unikey, FcitxKeySym sy } // capture ascii printable char - else if ((sym >= FcitxKey_space && sym <=FcitxKey_asciitilde) - || sym == FcitxKey_Shift_L || sym == FcitxKey_Shift_R) // sure this have FcitxKey_SHIFT_MASK + else if (sym >= FcitxKey_space && sym <=FcitxKey_asciitilde) { unsigned int i = 0; @@ -314,9 +379,7 @@ INPUT_RETURN_VALUE FcitxUnikeyDoInputPreedit(FcitxUnikey* unikey, FcitxKeySym sy // shift + space, shift + shift event if ((unikey->last_key_with_shift == false && state & FcitxKeyState_Shift - && sym == FcitxKey_space && !UnikeyAtWordBeginning()) - || (sym == FcitxKey_Shift_L || sym == FcitxKey_Shift_R) // (&& state & FcitxKey_SHIFT_MASK), sure this have FcitxKey_SHIFT_MASK - ) + && sym == FcitxKey_space && !UnikeyAtWordBeginning())) { UnikeyRestoreKeyStrokes(); } // end shift + space, shift + shift event @@ -327,42 +390,7 @@ INPUT_RETURN_VALUE FcitxUnikeyDoInputPreedit(FcitxUnikey* unikey, FcitxKeySym sy } // end process sym - // process result of ukengine - if (UnikeyBackspaces > 0) - { - if (unikey->preeditstr->length() <= (unsigned int)UnikeyBackspaces) - { - unikey->preeditstr->clear(); - } - else - { - FcitxUnikeyEraseChars(unikey, UnikeyBackspaces); - } - } - - if (UnikeyBufChars > 0) - { - if (unikey->config.oc == UKCONV_XUTF8) - { - unikey->preeditstr->append((const char*)UnikeyBuf, UnikeyBufChars); - } - else - { - unsigned char buf[CONVERT_BUF_SIZE + 1]; - int bufSize = CONVERT_BUF_SIZE; - - latinToUtf(buf, UnikeyBuf, UnikeyBufChars, &bufSize); - unikey->preeditstr->append((const char*)buf, CONVERT_BUF_SIZE - bufSize); - } - } - else if (sym != FcitxKey_Shift_L && sym != FcitxKey_Shift_R) // if ukengine not process - { - int n; - char s[7] = {0, 0, 0, 0, 0, 0, 0}; - n = fcitx_ucs4_to_utf8((unsigned int)sym, s); // convert ucs4 to utf8 char - unikey->preeditstr->append(s, n); - } - // end process result of ukengine + FcitxUnikeySyncState(unikey, sym); // commit string: if need if (unikey->preeditstr->length() > 0) diff --git a/src/unikey-im.h b/src/unikey-im.h index f884307..d08b150 100644 --- a/src/unikey-im.h +++ b/src/unikey-im.h @@ -35,6 +35,7 @@ struct FcitxUnikey FcitxInstance* owner; bool auto_commit; bool last_key_with_shift; + FcitxKeySym lastShiftPressed; FcitxUIMenu imMenu; FcitxUIMenu ocMenu; };
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor