diff --git a/src/lib/fcitx/inputmethodmanager.cpp b/src/lib/fcitx/inputmethodmanager.cpp index 428dd6c85..1219501d0 100644 --- a/src/lib/fcitx/inputmethodmanager.cpp +++ b/src/lib/fcitx/inputmethodmanager.cpp @@ -69,6 +69,7 @@ class InputMethodManagerPrivate : QPtrHolder { Instance *instance_ = nullptr; std::unique_ptr> eventWatcher_; int64_t timestamp_ = 0; + std::vector missingInputMethods_; }; bool checkEntry(const InputMethodEntry &entry, @@ -111,6 +112,7 @@ void InputMethodManagerPrivate::loadConfig( FCITX_WARN() << "Group Item " << item.name.value() << " in group " << groupConfig.name.value() << " is not valid. Removed."; + missingInputMethods_.push_back(item.name.value()); continue; } group.inputMethodList().emplace_back( @@ -236,6 +238,7 @@ void InputMethodManager::load(const std::function d->loadStaticEntries(addonNames); d->loadDynamicEntries(addonNames); + d->missingInputMethods_.clear(); d->loadConfig(buildDefaultGroupCallback); // groupOrder guarantee to be non-empty at this point. emit(d->groupOrder_.front()); @@ -455,6 +458,13 @@ InputMethodManager::entry(const std::string &name) const { FCITX_D(); return findValue(d->entries_, name); } + +const std::vector & +InputMethodManager::missingInputMethods() const { + FCITX_D(); + return d->missingInputMethods_; +} + bool InputMethodManager::foreachEntries( const std::function &callback) { FCITX_D(); diff --git a/src/lib/fcitx/inputmethodmanager.h b/src/lib/fcitx/inputmethodmanager.h index 29faf88c9..27082f408 100644 --- a/src/lib/fcitx/inputmethodmanager.h +++ b/src/lib/fcitx/inputmethodmanager.h @@ -134,6 +134,13 @@ class FCITXCORE_EXPORT InputMethodManager : public ConnectableObject { /// Return a given input method entry by name. const InputMethodEntry *entry(const std::string &name) const; + /** + * Return the names of input methods that are configured but not available. + * + * @since 5.1.13 + */ + const std::vector &missingInputMethods() const; + /** * Enumerate all the input method entries. * diff --git a/src/lib/fcitx/instance.cpp b/src/lib/fcitx/instance.cpp index 5464bc92d..49f9819f1 100644 --- a/src/lib/fcitx/instance.cpp +++ b/src/lib/fcitx/instance.cpp @@ -1471,6 +1471,19 @@ void Instance::initialize() { return false; }); d->notifications_ = d->addonManager_.addon("notifications", true); + if (d->notifications_ && !d->imManager_.missingInputMethods().empty()) { + std::string body; + for (const auto &im : d->imManager_.missingInputMethods()) { + if (!body.empty()) { + body += ", "; + } + body += im; + } + d->notifications_->call( + "fcitx", 0, "fcitx", _("Missing input methods"), + _("The following input methods are not available: {0}"), + std::vector{body}, 0, nullptr, nullptr); + } } int Instance::exec() {