From 9b7bb069e63da378f2f301c3f0f5292d89361ce3 Mon Sep 17 00:00:00 2001 From: Weng Xuetian Date: Fri, 10 Jan 2025 15:38:28 -0800 Subject: [PATCH] Make key pad digit also work with unicode's direct mode. --- src/modules/unicode/unicode.cpp | 47 +++++++++++++++++++++++++++++---- test/testunicode.cpp | 7 ++++- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/modules/unicode/unicode.cpp b/src/modules/unicode/unicode.cpp index 04b84bb07..4cabf1c3b 100644 --- a/src/modules/unicode/unicode.cpp +++ b/src/modules/unicode/unicode.cpp @@ -5,18 +5,54 @@ * */ #include "unicode.h" +#include +#include +#include +#include +#include +#include +#include +#include #include +#include "fcitx-utils/capabilityflags.h" #include "fcitx-utils/charutils.h" #include "fcitx-utils/i18n.h" #include "fcitx-utils/inputbuffer.h" +#include "fcitx-utils/key.h" +#include "fcitx-utils/keysym.h" +#include "fcitx-utils/stringutils.h" +#include "fcitx-utils/textformatflags.h" #include "fcitx-utils/utf8.h" +#include "fcitx/addonfactory.h" +#include "fcitx/addoninstance.h" #include "fcitx/addonmanager.h" +#include "fcitx/candidatelist.h" +#include "fcitx/event.h" #include "fcitx/inputcontext.h" #include "fcitx/inputcontextmanager.h" #include "fcitx/inputpanel.h" +#include "fcitx/instance.h" +#include "fcitx/text.h" +#include "fcitx/userinterface.h" +#include "clipboard_public.h" namespace fcitx { +namespace { + +bool isHexKey(const Key &key) { + if (key.isDigit()) { + return true; + } + if (key.isUAZ() || key.isLAZ()) { + // sym is in valid range. + return charutils::isxdigit(key.sym()); + } + return false; +} + +} // namespace + enum class UnicodeMode { Off = 0, Search, @@ -307,11 +343,12 @@ void Unicode::handleDirect(KeyEvent &keyEvent) { return; } - if ((keyEvent.key().isDigit() || keyEvent.key().isLAZ() || - keyEvent.key().isUAZ()) && - isxdigit(keyEvent.key().sym())) { - keyEvent.accept(); - if (!state->buffer_.type(keyEvent.key().sym())) { + if (isHexKey(keyEvent.key())) { + const auto keyStr = Key::keySymToUTF8(keyEvent.key().sym()); + if (keyStr.empty()) { + return; + } + if (!state->buffer_.type(keyStr)) { return; } if (bufferIsValid(state->buffer_.userInput(), nullptr)) { diff --git a/test/testunicode.cpp b/test/testunicode.cpp index 122d84fde..d23461228 100644 --- a/test/testunicode.cpp +++ b/test/testunicode.cpp @@ -5,6 +5,10 @@ * */ #include "fcitx-utils/eventdispatcher.h" +#include "fcitx-utils/key.h" +#include "fcitx-utils/keysym.h" +#include "fcitx-utils/log.h" +#include "fcitx-utils/macros.h" #include "fcitx-utils/testing.h" #include "fcitx/addonmanager.h" #include "fcitx/instance.h" @@ -58,7 +62,8 @@ void scheduleEvent(EventDispatcher *dispatcher, Instance *instance) { testfrontend->call(uuid, Key("p"), false); // ignored testfrontend->call(uuid, Key("1"), false); - testfrontend->call(uuid, Key("8"), false); + testfrontend->call(uuid, Key(FcitxKey_KP_8), + false); testfrontend->call( uuid, Key(FcitxKey_BackSpace), false); testfrontend->call(uuid, Key("9"), false);