From 736558ff13f642ac84047790f7d95a069c83cf64 Mon Sep 17 00:00:00 2001 From: hantengc Date: Fri, 24 Oct 2025 13:49:17 +0800 Subject: [PATCH 1/3] show the current input method name in the tray icon --- .../notificationitem/notificationitem.cpp | 37 ++++++++++++++++--- .../notificationitem/notificationitem.h | 1 + 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/modules/notificationitem/notificationitem.cpp b/src/modules/notificationitem/notificationitem.cpp index b94f7789e..0702ccb52 100644 --- a/src/modules/notificationitem/notificationitem.cpp +++ b/src/modules/notificationitem/notificationitem.cpp @@ -72,6 +72,14 @@ class StatusNotifierItem : public dbus::ObjectVTable { std::string label() { return ""; } + std::string title() { + const InputMethodEntry *imEntry = nullptr; + if (auto *ic = parent_->menu()->lastRelevantIc()) { + imEntry = parent_->instance()->inputMethodEntry(ic); + } + return imEntry == nullptr ? _("Input Method") : imEntry->name(); + } + static dbus::DBusStruct< std::string, std::vector>>, @@ -104,6 +112,15 @@ class StatusNotifierItem : public dbus::ObjectVTable { lastLabel_ = std::move(label); } + void notifyNewTitle() { + std::string currentTitle = title(); + if (currentTitle.empty() || lastTitle_ == currentTitle) { + return; + } + newTitle(); + lastTitle_ = std::move(currentTitle); + } + void reset() { releaseSlot(); lastIconName_.clear(); @@ -138,8 +155,7 @@ class StatusNotifierItem : public dbus::ObjectVTable { FCITX_OBJECT_VTABLE_PROPERTY(category, "Category", "s", []() { return "SystemServices"; }); FCITX_OBJECT_VTABLE_PROPERTY(id, "Id", "s", []() { return "Fcitx"; }); - FCITX_OBJECT_VTABLE_PROPERTY(title, "Title", "s", - []() { return _("Input Method"); }); + FCITX_OBJECT_VTABLE_PROPERTY(title, "Title", "s", [this]() { return title(); }); FCITX_OBJECT_VTABLE_PROPERTY(status, "Status", "s", []() { return "Active"; }); FCITX_OBJECT_VTABLE_PROPERTY(windowId, "WindowId", "i", []() { return 0; }); @@ -238,6 +254,7 @@ class StatusNotifierItem : public dbus::ObjectVTable { std::string cachedLabel_; std::vector>> cachedLabelIcon_; + std::string lastTitle_; }; NotificationItem::NotificationItem(Instance *instance) @@ -280,26 +297,27 @@ void NotificationItem::setRegistered(bool registered) { registered_ = registered; if (registered_) { - auto updateIcon = [this](Event &e) { + auto updateIconAndTitle = [this](Event &e) { InputContext *ic = nullptr; if (e.isInputContextEvent()) { ic = dynamic_cast(e).inputContext(); } menu_->updateMenu(ic); newIcon(); + newTitle(); }; for (auto type : {EventType::InputContextFocusIn, EventType::InputContextSwitchInputMethod, EventType::InputMethodGroupChanged}) { eventHandlers_.emplace_back(instance_->watchEvent( - type, EventWatcherPhase::Default, updateIcon)); + type, EventWatcherPhase::Default, updateIconAndTitle)); } eventHandlers_.emplace_back(instance_->watchEvent( EventType::InputContextFlushUI, EventWatcherPhase::Default, - [updateIcon](Event &event) { + [updateIconAndTitle](Event &event) { if (static_cast(event) .component() == UserInterfaceComponent::StatusArea) { - updateIcon(event); + updateIconAndTitle(event); } })); } @@ -406,6 +424,13 @@ void NotificationItem::newIcon() { // sni_->xayatanaNewLabel(sni_->label(), sni_->label()); } +void NotificationItem::newTitle() { + if (!sni_->isRegistered()) { + return; + } + sni_->notifyNewTitle(); +} + class NotificationItemFactory : public AddonFactory { AddonInstance *create(AddonManager *manager) override { return new NotificationItem(manager->instance()); diff --git a/src/modules/notificationitem/notificationitem.h b/src/modules/notificationitem/notificationitem.h index def6b0dff..1e190f1f5 100644 --- a/src/modules/notificationitem/notificationitem.h +++ b/src/modules/notificationitem/notificationitem.h @@ -49,6 +49,7 @@ class NotificationItem : public AddonInstance { void maybeScheduleRegister(); void cleanUp(); + void newTitle(); Instance *instance_; std::unique_ptr watcher_; From 00322d1f21546c6cf43de10b716eb7e7ca9eaf74 Mon Sep 17 00:00:00 2001 From: hantengc Date: Tue, 11 Nov 2025 17:51:48 +0800 Subject: [PATCH 2/3] change it to a private function, no need for other modules to use it. --- src/modules/notificationitem/notificationitem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/notificationitem/notificationitem.h b/src/modules/notificationitem/notificationitem.h index 1e190f1f5..3cd743ec6 100644 --- a/src/modules/notificationitem/notificationitem.h +++ b/src/modules/notificationitem/notificationitem.h @@ -36,7 +36,6 @@ class NotificationItem : public AddonInstance { bool registered() const { return registered_; } std::unique_ptr> watch(NotificationItemCallback callback); - void newIcon(); FCITX_ADDON_DEPENDENCY_LOADER(classicui, instance_->addonManager()); DBusMenu *menu() { return menu_.get(); } @@ -49,6 +48,7 @@ class NotificationItem : public AddonInstance { void maybeScheduleRegister(); void cleanUp(); + void newIcon(); void newTitle(); Instance *instance_; From 8cc3b6f3e43cc521ba36582ef69b373d6fd5d1b9 Mon Sep 17 00:00:00 2001 From: hantengc Date: Thu, 27 Nov 2025 10:59:47 +0800 Subject: [PATCH 3/3] run clang-format --- src/modules/notificationitem/notificationitem.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/notificationitem/notificationitem.cpp b/src/modules/notificationitem/notificationitem.cpp index 0702ccb52..08a31b5fc 100644 --- a/src/modules/notificationitem/notificationitem.cpp +++ b/src/modules/notificationitem/notificationitem.cpp @@ -155,7 +155,8 @@ class StatusNotifierItem : public dbus::ObjectVTable { FCITX_OBJECT_VTABLE_PROPERTY(category, "Category", "s", []() { return "SystemServices"; }); FCITX_OBJECT_VTABLE_PROPERTY(id, "Id", "s", []() { return "Fcitx"; }); - FCITX_OBJECT_VTABLE_PROPERTY(title, "Title", "s", [this]() { return title(); }); + FCITX_OBJECT_VTABLE_PROPERTY(title, "Title", "s", + [this]() { return title(); }); FCITX_OBJECT_VTABLE_PROPERTY(status, "Status", "s", []() { return "Active"; }); FCITX_OBJECT_VTABLE_PROPERTY(windowId, "WindowId", "i", []() { return 0; });