精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

OpenHarmony源碼解析之多模輸入子系統(一)

系統 OpenHarmony
本篇文章基于社區weekly_20230207的代碼,對多模輸入客戶端注冊監聽流程和多模服務端事件派發流程作了簡單介紹。相信大家通過本文,對多模輸入子系統能有一個大致了解。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

1、簡介

多模輸入子系統是 OpenHarmony 輸入事件管理框架。多模輸入服務接收多種類型輸入設備(觸摸屏、鼠標、鍵盤、觸摸板等)的輸入事件,通過歸一/標準化處理后,分發給多模客戶端(應用,系統服務)。多模輸入還提供事件注入接口,該接口目前僅對系統應用開放。

多模輸入子系統分為框架部分和服務部分:框架部分封裝了各種接口給其他子系統和應用來調用;服務部分實現了這些接口,并且實現了事件派發處理的核心邏輯。這兩個部分運行在不同進程中,根據具體接口,通過socket或者binder ipc機制進行通信。

(1)主要模塊交互圖

OpenHarmony源碼解析之多模輸入子系統(一)-開源基礎軟件社區

(2)代碼目錄

/foundation/multimodalinput/input
├── frameworks # napi接口代碼,客戶端實現代碼
├── interfaces # 對外接口存放目錄
└── native # 對外native層接口存放目錄
└── innerkits # 對系統內部子系統提供native層接口存放目錄
├── service # 服務端代碼
├── sa_profile # 服務啟動配置文件
├── tools # 輸入事件注入工具
├── uinput # 輸入事件注入模塊
├── util # socket相關工具類

2、多模客戶端啟動流程

(1)時序圖

OpenHarmony源碼解析之多模輸入子系統(一)-開源基礎軟件社區

說明:

  • Ability生命周期函數OnStart()中會去創建WindowImpl實例,WindowImpl::Create()中調用InputTransferStation::AddInputWindow()創建InputEventListener并注冊到InputManagerImpl中。后續收到多模服務端發送來的輸入事件之后會通過回調InputEventListener的接口函數,把事件上報到窗口管理,窗口管理再把事件進一步上報給ArkUI。
  • InputManagerImpl::SetWindowInputEventConsumer()方法中會去初始化多模Socket客戶端,用于接收多模服務端發來的輸入事件。

(2)ArkUI何時注冊的窗口管理輸入事件回調?

AceAbility::OnStart()方法中先調用基類Ability::OnStart()方法走完上述時序圖的流程,然后調用如下代碼段,創建AceWindowListener,并調用WindowImpl::SetInputEventConsumer()注冊輸入事件回調。

OHOS::sptr<OHOS::Rosen::Window> window = Ability::GetWindow();
std::shared_ptr<AceAbility> self = std::static_pointer_cast<AceAbility>(shared_from_this());
OHOS::sptr<AceWindowListener> aceWindowListener = new AceWindowListener(self);
// register surface change callback and window mode change callback
window->RegisterWindowChangeListener(aceWindowListener);
// register drag event callback
window->RegisterDragListener(aceWindowListener);
// register Occupied Area callback
window->RegisterOccupiedAreaChangeListener(aceWindowListener);
// register ace ability handler callback
window->SetAceAbilityHandler(aceWindowListener);
// register input consumer callback
std::shared_ptr<AceWindowListener> aceInputConsumer = std::make_shared<AceWindowListener>(self);
window->SetInputEventConsumer(aceInputConsumer);

3、多模輸入服務

(1)多模服務初始化流程

OpenHarmony源碼解析之多模輸入子系統(一)-開源基礎軟件社區

說明:

  • MMIService::OnThread()中會起循環,等待并處理epoll事件。接收到libinput相關的epoll事件后,調用LibinputAdapter::EventDispatch()處理input事件。
void MMIService::OnThread()
{
SetThreadName(std::string("mmi_service"));
uint64_t tid = GetThisThreadId();
delegateTasks_.SetWorkerThreadId(tid);
MMI_HILOGI("Main worker thread start. tid:%{public}" PRId64 "", tid);
#ifdef OHOS_RSS_CLIENT
tid_.store(tid);
#endif
libinputAdapter_.RetriggerHotplugEvents();
libinputAdapter_.ProcessPendingEvents();
while (state_ == ServiceRunningState::STATE_RUNNING) {
epoll_event ev[MAX_EVENT_SIZE] = {};
int32_t timeout = TimerMgr->CalcNextDelay();
MMI_HILOGD("timeout:%{public}d", timeout);
int32_t count = EpollWait(ev[0], MAX_EVENT_SIZE, timeout, mmiFd_);
for (int32_t i = 0; i < count && state_ == ServiceRunningState::STATE_RUNNING; i++) {
auto mmiEd = reinterpret_cast<mmi_epoll_event*>(ev[i].data.ptr);
CHKPC(mmiEd);
if (mmiEd->event_type == EPOLL_EVENT_INPUT) {
libinputAdapter_.EventDispatch(ev[i]);//處理input事件
} else if (mmiEd->event_type == EPOLL_EVENT_SOCKET) {
OnEpollEvent(ev[i]);
} else if (mmiEd->event_type == EPOLL_EVENT_SIGNAL) {
OnSignalEvent(mmiEd->fd);
} else if (mmiEd->event_type == EPOLL_EVENT_ETASK) {
OnDelegateTask(ev[i]);
} else {
MMI_HILOGW("Unknown epoll event type:%{public}d", mmiEd->event_type);
}
}
TimerMgr->ProcessTimers();
if (state_ != ServiceRunningState::STATE_RUNNING) {
break;
}
}
MMI_HILOGI("Main worker thread stop. tid:%{public}" PRId64 "", tid);
}
  • InputEventHandler::BuildInputHandlerChain()會創建IInputEventHandler對象鏈,用于處理libinput上報的input事件。類圖如下:
  • InputEventHandler::OnEvent(void event)調用。
    EventNormalizeHandler::HandleEvent(libinput_event
     event)開始按順序處理輸入事件。
  • EventNormalizeHandler把libinput_event標準化成各種InputEvent(KeyEvent,PointerEvent,AxisEvent),并傳遞給下一級 EventFilterHandler處理。
  • EventFilterHandler會過濾一些事件,否則繼續往下傳遞。
  • EventInterceptorHandler事件攔截器,攔截成功不會繼續往下傳。
  • KeyCommandHandler根據配置文件,對一些特殊按鍵,拉起特定應用界面,或者對電源鍵,音量鍵做特殊處理,否則繼續往下傳遞。
  • KeySubscriberHandler應用訂閱的組合按鍵(應用通過inputConsumer.on接口訂閱)處理,否則繼續往下傳遞。
  • EventMonitorHandler事件跟蹤器,把事件分發給跟蹤者并繼續往下傳。
  • EventDispatchHandler通過socket把事件派發給應用。

4、多模輸入touch事件派發流程

OpenHarmony源碼解析之多模輸入子系統(一)-開源基礎軟件社區

說明:
MMIService收到libinput上報的input事件后,會調用InputEventHandler::OnEvent來處理輸入事件。最終EventDispatchHandler通過socket把事件派發給目標應用進程。

5、如何確定輸入事件派發的目標進程?

多模服務端InputWindowsManager類中有如下成員變量。

DisplayGroupInfo displayGroupInfo_;
std::map<int32_t, WindowInfo> touchItemDownInfos_;

DisplayGroupInfo中包含了當前獲焦的窗口id,以z軸排序的窗口信息列表,物理屏幕信息列表等。displayGroupInfo_信息由窗口管理服務調用。
MMI::InputManager::GetInstance()->UpdateDisplayInfo(displayGroupInfo_)接口設置。

struct DisplayGroupInfo {
int32_t width; //Width of the logical display
int32_t height; //Height of the logical display
int32_t focusWindowId; //ID of the focus window
//List of window information of the logical display arranged in Z order, with the top window at the top
std::vector<WindowInfo> windowsInfo;
std::vector<DisplayInfo> displaysInfo; //Physical screen information list
};

以鍵盤按鍵事件為例。

收到libinput上報的輸入事件之后,最終走到EventDispatchHandler::DispatchKeyEventPid(UDSServer& udsServer, std::shared_ptr<KeyEvent> key)函數。

簡化的調用流程如下:

EventDispatchHandler::DispatchKeyEventPid() =>
InputWindowsManager::UpdateTarget() =>
InputWindowsManager::GetPidAndUpdateTarget()
int32_t InputWindowsManager::GetPidAndUpdateTarget(std::shared_ptr<InputEvent> inputEvent)
{
CALL_DEBUG_ENTER;
CHKPR(inputEvent, INVALID_PID);
const int32_t focusWindowId = displayGroupInfo_.focusWindowId;
WindowInfo* windowInfo = nullptr;
for (auto &item : displayGroupInfo_.windowsInfo) {
if (item.id == focusWindowId) {
windowInfo = &item;
break;
}
}
CHKPR(windowInfo, INVALID_PID);
inputEvent->SetTargetWindowId(windowInfo->id);
inputEvent->SetAgentWindowId(windowInfo->agentWindowId);
MMI_HILOGD("focusWindowId:%{public}d, pid:%{public}d", focusWindowId, windowInfo->pid);
return windowInfo->pid;
}

InputWindowsManager::GetPidAndUpdateTarget()函數中把當前獲焦windowId信息設置到InputEvent中,并且返回目標窗口所在進程pid,有了目標進程pid,就可以獲取到目標進程對應的socket會話的服務端fd,把事件派發給目標進程。

touch事件目標窗口信息的獲取和按鍵事件不同,感興趣的可以自己查看代碼。

6、總結

本篇文章基于社區weekly_20230207的代碼,對多模輸入客戶端注冊監聽流程和多模服務端事件派發流程作了簡單介紹。相信大家通過本文,對多模輸入子系統能有一個大致了解。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2021-09-17 14:38:58

鴻蒙HarmonyOS應用

2021-09-13 15:15:18

鴻蒙HarmonyOS應用

2023-06-28 15:00:02

開源鴻蒙輸入系統架構

2021-11-08 15:04:47

鴻蒙HarmonyOS應用

2021-09-18 14:40:37

鴻蒙HarmonyOS應用

2022-01-06 16:17:58

鴻蒙HarmonyOS應用

2022-02-17 20:57:07

OpenHarmon操作系統鴻蒙

2021-12-17 16:42:09

鴻蒙HarmonyOS應用

2023-04-12 15:31:11

系統服務管理鴻蒙

2022-01-10 15:30:11

鴻蒙HarmonyOS應用

2022-05-10 11:17:27

電話子系統數據服務模塊

2021-11-18 10:28:03

鴻蒙HarmonyOS應用

2022-05-24 15:46:51

Wi-FiSTA模式

2022-01-20 14:33:29

openharmonwayland協議鴻蒙

2022-01-13 10:11:59

鴻蒙HarmonyOS應用

2022-05-20 10:32:49

事件循環器事件隊列鴻蒙

2022-01-20 11:04:31

Linux DRMOpenHarmon鴻蒙

2022-03-18 16:07:04

Graphic子系統鴻蒙

2022-02-14 14:47:11

SystemUIOpenHarmon鴻蒙

2022-05-30 15:08:33

包管理子系統包安裝模塊
點贊
收藏

51CTO技術棧公眾號

另类专区欧美蜜桃臀第一页| 欧美福利在线播放网址导航| 亚洲精品视频在线看| 超碰97在线资源| 久久精品一二区| 成人无号精品一区二区三区| 欧美一区二区三区啪啪| 国产中文字幕二区| www.久久热.com| 国产乱码精品一区二区三区忘忧草| 欧美精品激情在线| 国产黄色大片免费看| 国产精品1区在线| 婷婷丁香激情综合| 樱花www成人免费视频| 色丁香婷婷综合久久| 日产欧产美韩系列久久99| 久久福利视频导航| 国产精品免费无码| 激情小说一区| 欧美精品久久99久久在免费线| 免费国产黄色网址| 国产黄a三级三级三级av在线看| 9人人澡人人爽人人精品| 国产精品女人久久久久久| 久久久久亚洲av无码专区 | 欧美三级中文字| 国产黄色激情视频| 蜜桃视频网站在线观看| 91一区二区在线| 国产传媒一区| 在线观看中文字幕2021| 亚洲欧美日韩国产综合精品二区| 精品综合久久久久久97| 自拍偷拍第9页| 久久最新网址| 日韩不卡中文字幕| 又黄又爽又色的视频| 91在线亚洲| 色94色欧美sute亚洲线路一久| 欧美一级欧美一级| 亚洲区欧洲区| 亚洲欧美日韩一区二区| 一本一道久久a久久综合精品| 人成免费电影一二三区在线观看| 成人免费三级在线| 99热99热| 亚洲不卡免费视频| 国产成人免费在线观看| 114国产精品久久免费观看| 亚洲一级黄色大片| 男人的j进女人的j一区| 国产第一区电影| 五月婷婷亚洲综合| 国产一区成人| 欧美中文在线观看国产| 久久久久久不卡| 免费在线播放第一区高清av| 欧美自拍视频在线| 免费观看日批视频| 日韩av电影天堂| 国产美女精品视频| 97国产精品久久久| 国模无码大尺度一区二区三区| 国产噜噜噜噜噜久久久久久久久 | 日韩一区二区精品葵司在线| 久久精品一卡二卡| 凹凸av导航大全精品| 亚洲国内高清视频| 欧美黑人欧美精品刺激| 国产99久久精品一区二区300| 亚洲精品视频中文字幕| 亚洲性猛交xxxx乱大交| 成人影院天天5g天天爽无毒影院| 中文字幕欧美日韩精品| 性生交大片免费全黄| 在线一区免费| 午夜剧场成人观在线视频免费观看| 国产福利拍拍拍| 日韩国产成人精品| 国产欧美一区二区三区视频| www.国产黄色| 91视频免费观看| 午夜精品美女久久久久av福利| 黄网站app在线观看| 亚洲国产一区二区在线播放| 免费在线a视频| 精品176极品一区| 日韩一区二区三区电影| 亚洲专区区免费| 日韩免费高清| 久久久久国产精品免费| www.欧美色| 国产一区免费电影| 国产麻豆一区二区三区在线观看| 欧美成人综合在线| 亚洲男帅同性gay1069| 成年人网站免费视频| 精品日本视频| 日韩精品中文字幕在线一区| 熟女俱乐部一区二区视频在线| 欧美丰满日韩| 欧洲一区二区视频| 精品二区在线观看| 久久嫩草精品久久久精品| 熟女视频一区二区三区| 悠悠资源网亚洲青| 日韩一二三四区| 亚洲精品国产熟女久久久| 亚洲欧美亚洲| 国产精品极品美女粉嫩高清在线| 亚洲高清视频网站| 国产精品乱码人人做人人爱| 91成人在线观看喷潮教学| 日韩午夜视频在线| 亚洲男人天堂2023| 国产成年人免费视频| 久久99精品久久久久久| 欧美精品一区在线| www欧美xxxx| 3d动漫精品啪啪一区二区竹菊 | 成人欧美一区二区三区| 2022亚洲天堂| av成人资源网| 欧美乱人伦中文字幕在线| 一个人看的www日本高清视频| 91麻豆免费看| 成人黄色av片| 大陆精大陆国产国语精品| 久久精品美女视频网站| 日本一区二区三区久久| 久久先锋影音av| 黄色大片中文字幕| 91成人短视频| 久久91精品国产| 国产剧情精品在线| 中文字幕一区二区三区不卡在线 | 日韩欧美一区二区一幕| 国产在线日韩欧美| 亚洲一区二区三区四区中文| 欧美成人影院| 国产午夜精品全部视频播放| 免费黄色网址在线| 99国产精品久久久久| 欧美亚洲黄色片| 6080成人| 久久久久久久久久久91| 亚洲爱情岛论坛永久| 一区av在线播放| 日本黄色大片在线观看| 欧美天堂亚洲电影院在线观看 | 亚洲精品ww久久久久久p站| 91高清国产视频| 国产精品99一区二区三区| 成人免费网站在线观看| 免费观看在线午夜影视| 欧美日韩不卡视频| 91香蕉视频在线播放| 国产中文字幕精品| 久久久99精品视频| 波多野结衣在线一区二区| 欧美精品18videos性欧| 手机看片1024国产| 色综合夜色一区| 国产一区二区三区四区在线| 免费成人在线影院| 手机看片日韩国产| gogo久久日韩裸体艺术| 91国产一区在线| 黄色毛片在线看| 欧美高清一级片在线| 免费网站看av| 2021久久国产精品不只是精品| 激情婷婷综合网| 日韩国产一区二区| 91网免费观看| 中文字幕 在线观看| 中文字幕最新精品| 亚洲福利在线观看视频| 一本色道综合亚洲| 日韩三级在线观看视频| 成人福利视频在线| 在线视频日韩一区 | 久久综合免费视频| 特黄aaaaaaaaa真人毛片| 欧美性猛交xxxx富婆弯腰| 亚洲一级片在线播放| 国产精品99久久久久久久女警| 国产人妻777人伦精品hd| 精品视频国产| 成人免费看片网站| 午夜日韩成人影院| 九九热精品视频| 你懂的视频在线播放| 91精品国产入口| 亚洲图片在线视频| 亚洲精品国产a久久久久久 | 婷婷在线免费观看| 欧美视频在线不卡| www.国产成人| 亚洲天天做日日做天天谢日日欢| 午夜剧场免费看| 精品无人区卡一卡二卡三乱码免费卡 | 中文字幕a在线观看| 美美哒免费高清在线观看视频一区二区 | 任你操精品视频| 成人动漫视频在线| 制服丝袜中文字幕第一页| 亚洲综合社区| 成人在线视频一区二区三区| 精品理论电影| 好吊色欧美一区二区三区四区| 国产精品美女久久久久人| 日韩美女写真福利在线观看| 国产丝袜精品丝袜| 久久最新资源网| jyzzz在线观看视频| 精品视频久久久久久久| 韩国av永久免费| 日韩一区和二区| 91精品国产乱码久久久久| 日韩欧美高清在线视频| 国产大片中文字幕| 亚洲精品自拍动漫在线| www.日本高清视频| 久久久三级国产网站| yy6080午夜| 国产成人精品免费| 两性午夜免费视频| 久久99国产精品尤物| 91小视频网站| 日韩av在线播放中文字幕| 国产91对白刺激露脸在线观看| 午夜欧美精品| 300部国产真实乱| 亚洲天天综合| 精品国产三级a∨在线| 欧美r级电影| 亚洲欧洲日夜超级视频| 欧美日韩第一| 日韩中文一区| 日本不卡二三区| 亚洲 日韩 国产第一区| 成人黄色av| 中文字幕一区二区三区乱码| 久久综合国产| 曰韩不卡视频| 亚洲精品小说| 高清无码视频直接看| 国产一区二区三区四区三区四 | 91小视频xxxx网站在线| 久久伊人精品视频| 亚洲精品白浆| 亚州精品天堂中文字幕| 国产黄大片在线观看| 91高潮在线观看| 韩日精品一区二区| 国产精品高精视频免费| 久久久加勒比| 91在线免费看网站| 一区二区在线视频观看| 国产精品一区二区三区不卡| 美女视频免费精品| 久久久影院一区二区三区 | 91丨porny丨最新| 国产精品无码久久久久一区二区| 国产视频一区不卡| 青青操在线播放| 一区二区三区欧美视频| 日韩av在线播| 色噜噜偷拍精品综合在线| 伊人久久亚洲综合| 日韩美女在线视频| 亚洲欧美综合一区二区| 国产小视频91| 2024最新电影免费在线观看| 性欧美视频videos6一9| 成人va天堂| 51蜜桃传媒精品一区二区| 乱亲女h秽乱长久久久| 色视频一区二区三区| 女人香蕉久久**毛片精品| 日韩a级在线观看| 视频一区视频二区在线观看| 亚洲欧美自拍另类日韩| 国产精品99久久久久久似苏梦涵| 亚洲av无码成人精品国产| 国产精品免费视频观看| 久久精品久久国产| 欧美三级视频在线| 亚洲第一成年人网站| 亚洲欧美日韩成人| 91精品久久| 人人澡人人澡人人看欧美| 欧美爱爱视频| 久久99导航| 亚洲欧美在线专区| 麻豆av免费在线| 国产精品一区一区| 舐め犯し波多野结衣在线观看| 亚洲猫色日本管| 黄色av网站免费| 精品国产sm最大网站| 在线观看完整版免费| 亚州成人av在线| 亚洲男男av| 美女被啪啪一区二区| 欧美午夜不卡| 日本高清一区二区视频| 久久久天堂av| 欧美一级视频免费观看| 日韩一区二区三区免费观看| 成年人视频网站在线| 91产国在线观看动作片喷水| 精品精品视频| 亚洲欧洲三级| 日韩 欧美一区二区三区| 国产三级视频网站| 亚洲高清中文字幕| 国产99对白在线播放| 在线观看精品自拍私拍| 中文字幕在线中文字幕在线中三区| 成人免费看片网址| 中文字幕免费一区二区| 日本中文字幕二区| 国产喷白浆一区二区三区| 日本五十熟hd丰满| 精品少妇一区二区三区在线播放| 精品美女在线观看视频在线观看| 国产精品久久久久久久久久久久久久 | www.国产一区二区| 精品国产乱码久久久久久浪潮| 天堂中文8资源在线8| 国产精品视频公开费视频| 欧美精品色图| 污污网站免费看| 中文文精品字幕一区二区| 黄色污污视频软件| 亚洲午夜av久久乱码| 台湾成人免费视频| 色一情一区二区三区四区| 视频一区在线播放| 91成人在线免费视频| 在线亚洲一区二区| 国产高清视频在线播放| 国产精品久久久久久一区二区 | 91免费精品国偷自产在线在线| 精品一区二区三区毛片| 国产一区二区三区在线观看免费视频 | 欧美激情1区| 97人妻精品一区二区三区免费| 亚洲18色成人| 日韩精品视频在线观看一区二区三区| 欧美中文字幕第一页| 禁断一区二区三区在线| 美女一区二区三区视频| 国产精品第四页| www.蜜臀av| 国语自产精品视频在线看| 日韩中文av| 欧美成人黄色网址| 综合色天天鬼久久鬼色| 亚洲精品成人电影| 97成人在线视频| 国产日产精品一区二区三区四区的观看方式 | 国产精品网在线观看| 欧美激情 国产精品| 久久精品免费在线观看| 96亚洲精品久久久蜜桃| 欧美日韩成人网| 人人香蕉久久| 国产精品一区二区小说| 亚洲最新在线观看| 三级国产在线观看| 国产日韩欧美91| 亚洲视频综合| 色噜噜噜噜噜噜| 欧美成人伊人久久综合网| 亚洲精品动漫| 亚洲AV无码成人精品一区| jiyouzz国产精品久久| 91porny九色| 欧美大片在线免费观看| 亚洲国产国产| 911av视频| 欧美午夜片在线免费观看| 久久久久久国产精品免费无遮挡 | 欧美午夜精品一区二区三区电影| 伊人国产精品视频| 日韩欧美精品中文字幕| 91在线中文| 天堂资源在线亚洲视频| 粉嫩在线一区二区三区视频| 探花国产精品一区二区| 欧美精品福利视频| 999国产精品视频| 一区二区不卡免费视频| 日韩免费高清av| 国产成人福利夜色影视| 91好吊色国产欧美日韩在线|