diff --git a/src/lib/fcitx/instance.cpp b/src/lib/fcitx/instance.cpp index ceb163036..b65244780 100644 --- a/src/lib/fcitx/instance.cpp +++ b/src/lib/fcitx/instance.cpp @@ -754,43 +754,7 @@ Instance::Instance(int argc, char **argv) { CheckInputMethodChanged imChangedRAII(ic, d); auto origKey = keyEvent.origKey().normalize(); - struct { - const KeyList &list; - std::function check; - std::function trigger; - } keyHandlers[] = { - {.list = d->globalConfig_.triggerKeys(), - .check = [this]() { return canTrigger(); }, - .trigger = - [this, ic](bool totallyReleased) { - return trigger(ic, totallyReleased); - }}, - {.list = d->globalConfig_.altTriggerKeys(), - .check = [this, ic]() { return canAltTrigger(ic); }, - .trigger = [this, ic](bool) { return altTrigger(ic); }}, - {.list = d->globalConfig_.activateKeys(), - .check = [ic, d]() { return d->canActivate(ic); }, - .trigger = [this, ic](bool) { return activate(ic); }}, - {.list = d->globalConfig_.deactivateKeys(), - .check = [ic, d]() { return d->canDeactivate(ic); }, - .trigger = [this, ic](bool) { return deactivate(ic); }}, - {.list = d->globalConfig_.enumerateForwardKeys(), - .check = [this, ic]() { return canEnumerate(ic); }, - .trigger = [this, ic](bool) { return enumerate(ic, true); }}, - {.list = d->globalConfig_.enumerateBackwardKeys(), - .check = [this, ic]() { return canEnumerate(ic); }, - .trigger = [this, ic](bool) { return enumerate(ic, false); }}, - {.list = d->globalConfig_.enumerateGroupForwardKeys(), - .check = [this]() { return canChangeGroup(); }, - .trigger = [ic, d, origKey]( - bool) { d->navigateGroup(ic, origKey, true); }}, - {.list = d->globalConfig_.enumerateGroupBackwardKeys(), - .check = [this]() { return canChangeGroup(); }, - .trigger = - [ic, d, origKey](bool) { - d->navigateGroup(ic, origKey, false); - }}, - }; + auto keyHandlers = createKeyEventHandlers(keyEvent); auto *inputState = ic->propertyFor(&d->inputStateFactory_); int keyReleased = inputState->keyReleased_; @@ -2148,6 +2112,49 @@ void Instance::toggle() { } } +std::vector +Instance::createKeyEventHandlers(const KeyEvent &keyEvent) { + FCITX_D(); + + auto *ic = keyEvent.inputContext(); + const auto origKey = keyEvent.origKey().normalize(); + + const KeyEventHandler keyEventHandlers[] = { + {.list = d->globalConfig_.triggerKeys(), + .check = [this]() { return canTrigger(); }, + .trigger = + [this, ic](bool totallyReleased) { + return trigger(ic, totallyReleased); + }}, + {.list = d->globalConfig_.altTriggerKeys(), + .check = [this, ic]() { return canAltTrigger(ic); }, + .trigger = [this, ic](bool) { return altTrigger(ic); }}, + {.list = d->globalConfig_.activateKeys(), + .check = [ic, d]() { return d->canActivate(ic); }, + .trigger = [this, ic](bool) { return activate(ic); }}, + {.list = d->globalConfig_.deactivateKeys(), + .check = [ic, d]() { return d->canDeactivate(ic); }, + .trigger = [this, ic](bool) { return deactivate(ic); }}, + {.list = d->globalConfig_.enumerateForwardKeys(), + .check = [this, ic]() { return canEnumerate(ic); }, + .trigger = [this, ic](bool) { return enumerate(ic, true); }}, + {.list = d->globalConfig_.enumerateBackwardKeys(), + .check = [this, ic]() { return canEnumerate(ic); }, + .trigger = [this, ic](bool) { return enumerate(ic, false); }}, + {.list = d->globalConfig_.enumerateGroupForwardKeys(), + .check = [this]() { return canChangeGroup(); }, + .trigger = [ic, d, + origKey](bool) { d->navigateGroup(ic, origKey, true); }}, + {.list = d->globalConfig_.enumerateGroupBackwardKeys(), + .check = [this]() { return canChangeGroup(); }, + .trigger = [ic, d, + origKey](bool) { d->navigateGroup(ic, origKey, false); }}, + }; + + return std::vector(std::cbegin(keyEventHandlers), + std::cend(keyEventHandlers)); +} + void Instance::enumerate(bool forward) { FCITX_D(); if (auto *ic = mostRecentInputContext()) { diff --git a/src/lib/fcitx/instance.h b/src/lib/fcitx/instance.h index ace03efc2..e3dfc8e0f 100644 --- a/src/lib/fcitx/instance.h +++ b/src/lib/fcitx/instance.h @@ -589,6 +589,13 @@ class FCITXCORE_EXPORT Instance : public ConnectableObject { bool enumerate(InputContext *ic, bool forward); bool toggle(InputContext *ic, InputMethodSwitchedReason reason = InputMethodSwitchedReason::Trigger); + struct KeyEventHandler { + const KeyList &list; + std::function check; + std::function trigger; + }; + std::vector + createKeyEventHandlers(const KeyEvent &keyEvent); void activateInputMethod(InputContextEvent &event); void deactivateInputMethod(InputContextEvent &event);