From 213b46cffe3c7f2a1b5c6961fc7f0f800042a287 Mon Sep 17 00:00:00 2001 From: liweixing1994 Date: Sat, 9 Aug 2025 14:28:09 +0800 Subject: [PATCH 1/2] keyEvent plugin framework --- .../innerkits/event/include/plugin_stage.h | 2 +- .../include/multimodal_input_plugin_manager.h | 6 ++ .../src/multimodal_input_plugin_manager.cpp | 82 +++++++++++++++++++ .../monitor/src/event_pre_monitor_handler.cpp | 14 +++- 4 files changed, 102 insertions(+), 2 deletions(-) diff --git a/interfaces/native/innerkits/event/include/plugin_stage.h b/interfaces/native/innerkits/event/include/plugin_stage.h index 5a43f65aa6..71801a632a 100644 --- a/interfaces/native/innerkits/event/include/plugin_stage.h +++ b/interfaces/native/innerkits/event/include/plugin_stage.h @@ -62,7 +62,7 @@ enum class InputDispatchStage { struct IPluginContext { virtual int32_t AddTimer(std::function func, int32_t intervalMs, int32_t repeatCount) = 0; virtual int32_t RemoveTimer(int32_t id) = 0; - void DispatchEvent(std::shared_ptr keyEvent, InputDispatchStage stage); + virtual void DispatchEvent(std::shared_ptr keyEvent, InputDispatchStage stage) = 0; void DispatchEvent(std::shared_ptr pointerEvent, InputDispatchStage stage); void DispatchEvent(std::shared_ptr AxisEvent, InputDispatchStage stage); virtual void DispatchEvent(libinput_event *event, int64_t frameTime) = 0; diff --git a/service/module_loader/include/multimodal_input_plugin_manager.h b/service/module_loader/include/multimodal_input_plugin_manager.h index c30ad29407..43822d6661 100644 --- a/service/module_loader/include/multimodal_input_plugin_manager.h +++ b/service/module_loader/include/multimodal_input_plugin_manager.h @@ -51,14 +51,17 @@ public: int32_t Init(std::shared_ptr pin); void UnInit(); PluginResult HandleEvent(libinput_event *event, int64_t frameTime); + PluginResult HandleEvent(std::shared_ptr keyEvent, InputPluginStage stage); int32_t AddTimer(std::function func, int32_t intervalMs, int32_t repeatCount) override; int32_t RemoveTimer(int32_t id) override; void DispatchEvent(libinput_event *event, int64_t frameTime) override; + void DispatchEvent(std::shared_ptr keyEvent, InputDispatchStage stage) override; int32_t timerCnt_ = 0; int32_t prio_ = 200; std::function callback_; + std::function)> keyEventCallback_; UnintPlugin unintPlugin_ = nullptr; std::shared_ptr plugin_; std::string name_; @@ -76,9 +79,12 @@ public: int32_t Init(); void Dump(int fd); int32_t HandleEvent(libinput_event* event, int64_t frameTime, InputPluginStage stage); + int32_t HandleEvent(std::shared_ptr keyEvent, InputPluginStage stage); void PluginAssignmentCallBack(std::function callback, InputPluginStage stage); + void PluginAssignmentCallBack(std::function)> callback, InputPluginStage stage); void PrintPlugins(); int32_t DoHandleEvent(libinput_event *event, int64_t frameTime, InputPlugin *iplugin, InputPluginStage stage); + int32_t DoHandleEvent(std::shared_ptr keyEvent, InputPlugin *iplugin, InputPluginStage stage); private: bool IntermediateEndEvent(libinput_event *event); diff --git a/service/module_loader/src/multimodal_input_plugin_manager.cpp b/service/module_loader/src/multimodal_input_plugin_manager.cpp index 4d34f63d36..eefc2855c3 100644 --- a/service/module_loader/src/multimodal_input_plugin_manager.cpp +++ b/service/module_loader/src/multimodal_input_plugin_manager.cpp @@ -157,6 +157,20 @@ void InputPluginManager::PluginAssignmentCallBack( } } +void InputPluginManager::PluginAssignmentCallBack( + std::function)> callback, InputPluginStage stage) +{ + CALL_DEBUG_ENTER; + auto it = plugins_.find(stage); + if (it == plugins_.end()) { + MMI_HILOGI("plugins_ not stage:%{public}d.", stage); + return; + } + for (auto &plugin : it->second) { + plugin->keyEventCallback_ = callback; + } +} + int32_t InputPluginManager::HandleEvent(libinput_event *event, int64_t frameTime, InputPluginStage stage) { return DoHandleEvent(event, frameTime, nullptr, stage); @@ -214,6 +228,59 @@ int32_t InputPluginManager::DoHandleEvent( return RET_NOTDO; } +int32_t InputPluginManager::HandleEvent(std::shared_ptr keyEvent, InputPluginStage stage) +{ + return DoHandleEvent(keyEvent, nullptr, stage); +} + +int32_t InputPluginManager::DoHandleEvent( + std::shared_ptr keyEvent, InputPlugin *iplugin, InputPluginStage stage) +{ + if (keyEvent == nullptr) { + return RET_NOTDO; + } + auto it = plugins_.find(stage); + if (it == plugins_.end()) { + return RET_NOTDO; + } + CALL_DEBUG_ENTER; + auto &plugins = it->second; + auto start_plugin = plugins.begin(); + if (iplugin != nullptr) { + auto cur_plugin = std::find_if(plugins.begin(), plugins.end(), + [iplugin](const std::shared_ptr &plugin) { return plugin.get() == iplugin; }); + if (cur_plugin == plugins.end()) { + return RET_NOTDO; + } + start_plugin = std::next(cur_plugin); + } + int64_t beginTime = 0; + PluginResult result; + int64_t endTime = 0; + int64_t lostTime = 0; + for (auto pluginIt = start_plugin; pluginIt != plugins.end(); ++pluginIt) { + if ((*pluginIt) == nullptr) { + continue; + } + beginTime = GetSysClockTime(); + result = (*pluginIt)->HandleEvent(keyEvent, stage); + endTime = GetSysClockTime(); + lostTime = endTime - beginTime; + if (lostTime >= TIMEOUT_US) { + MMI_HILOGE("pluginIt timeout name:%{public}s ,endTime:%{public}" PRId64 ",lostTime:%{public}" PRId64, + (*pluginIt)->name_.c_str(), endTime, lostTime); + } + if (result == PluginResult::UseNeedReissue) { + return RET_DO; + } else if (result == PluginResult::UseNoNeedReissue) { + return RET_DO; + } else if (result == PluginResult::Error) { + MMI_HILOGE("pluginIt err name:%{public}s", (*pluginIt)->name_.c_str()); + } + } + return RET_NOTDO; +} + // LIBINPUT_EVENT_TABLET_TOOL_BUTTON、LIBINPUT_EVENT_TABLET_PAD_BUTTON、LIBINPUT_EVENT_TABLET_PAD_KEY // These few existence termination events are currently not used and will be supplemented after use bool InputPluginManager::IntermediateEndEvent(libinput_event *event) @@ -303,12 +370,27 @@ void InputPlugin::DispatchEvent(libinput_event *event, int64_t frameTime) } } +void InputPlugin::DispatchEvent(std::shared_ptr keyEvent, InputDispatchStage stage) +{ + int32_t result = InputPluginManager::GetInstance()->DoHandleEvent(keyEvent, this, stage_); + if (result == RET_NOTDO) { + CHKPV(keyEventCallback_); + keyEventCallback_(keyEvent); + } +} + PluginResult InputPlugin::HandleEvent(libinput_event *event, int64_t frameTime) { CHKPR(plugin_, PluginResult::NotUse); return plugin_->HandleEvent(event, frameTime); } +PluginResult InputPlugin::HandleEvent(std::shared_ptr keyEvent, InputPluginStage stage) +{ + CHKPR(plugin_, PluginResult::NotUse); + return plugin_->HandleEvent(keyEvent, stage); +} + int32_t InputPlugin::AddTimer(std::function func, int32_t intervalMs, int32_t repeatCount) { if (timerCnt_ >= MAX_TIMER) { diff --git a/service/monitor/src/event_pre_monitor_handler.cpp b/service/monitor/src/event_pre_monitor_handler.cpp index 57ed0e2bbf..80289a23e8 100644 --- a/service/monitor/src/event_pre_monitor_handler.cpp +++ b/service/monitor/src/event_pre_monitor_handler.cpp @@ -18,6 +18,7 @@ #include "input_event_data_transformation.h" #include "input_event_handler.h" #include "util_ex.h" +#include "multimodal_input_plugin_manager.h" #undef MMI_LOG_DOMAIN #define MMI_LOG_DOMAIN MMI_LOG_HANDLER @@ -32,7 +33,18 @@ void EventPreMonitorHandler::HandleKeyEvent(const std::shared_ptr keyE CHKPV(keyEvent); OnHandleEvent(keyEvent); CHKPV(nextHandler_); - nextHandler_->HandleKeyEvent(keyEvent); + auto callback = [this](std::shared_ptr keyEvent) { + this->nextHandler_->HandleKeyEvent(keyEvent); + } + auto manager = InputPluginManager::GetInstance(); + if (manager != nullptr) { + manager->PluginAssignmentCallBack(callback, InputPluginStage::INPUT_BEFORE_KEYCOMMAND); + int32_t result = manager->HandleEvent(keyEvent, InputPluginStage::INPUT_BEFORE_KEYCOMMAND); + if (result != 0) { + return; + } + } + callback(keyEvent); } #endif // OHOS_BUILD_ENABLE_KEYBOARD -- Gitee From c1de7eb36dd3d1044071667cc377202351194ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A2=81=E6=B4=8B?= Date: Tue, 12 Aug 2025 06:21:47 +0000 Subject: [PATCH 2/2] update service/monitor/src/event_pre_monitor_handler.cpp. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 袁洋 --- service/monitor/src/event_pre_monitor_handler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/monitor/src/event_pre_monitor_handler.cpp b/service/monitor/src/event_pre_monitor_handler.cpp index 80289a23e8..7d8160a211 100644 --- a/service/monitor/src/event_pre_monitor_handler.cpp +++ b/service/monitor/src/event_pre_monitor_handler.cpp @@ -35,7 +35,7 @@ void EventPreMonitorHandler::HandleKeyEvent(const std::shared_ptr keyE CHKPV(nextHandler_); auto callback = [this](std::shared_ptr keyEvent) { this->nextHandler_->HandleKeyEvent(keyEvent); - } + }; auto manager = InputPluginManager::GetInstance(); if (manager != nullptr) { manager->PluginAssignmentCallBack(callback, InputPluginStage::INPUT_BEFORE_KEYCOMMAND); -- Gitee