
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
??https://ost.51cto.com??
前言:
在??上一篇??文章中,主要介紹了window_manager的發(fā)展史和功能介紹,本文開(kāi)始介紹OpenHarmony的window_manager的具體實(shí)現(xiàn)相關(guān)。
window_manager在OpenHarmony中的代碼目錄:
foundation/window/window_manager/
├── dm # Dislplay Manager Client實(shí)現(xiàn)代碼
│ ├── BUILD.gn
│ ├── include
│ ├── src
│ └── test
├── dmserver # Dislplay Manager Service實(shí)現(xiàn)代碼
│ ├── BUILD.gn
│ ├── include
│ ├── src
│ └── test
├── extension # Ability Component 窗口相關(guān)代碼實(shí)現(xiàn)目錄
│ ├── extension_connection # Ability Component 嵌入部分
│ └── window_extension # Ability Component 被嵌入部分
├── interfaces # 對(duì)外接口存放目錄
│ ├── innerkits # native接口存放目錄
│ └── kits # js/napi接口存放目錄
├── previewer # IDE輕量模擬器窗口代碼實(shí)現(xiàn)目錄
│ ├── BUILD.gn
│ ├── include
│ ├── mock
│ └── src
├── resources # 框架使用資源文件存放目錄
│ ├── BUILD.gn
│ ├── config
│ ├── dialog_ui
│ └── media
├── sa_profile # 系統(tǒng)服務(wù)配置文件
│ ├── 4606.xml
│ ├── 4607.xml
│ └── BUILD.gn
├── snapshot # 截屏命令行工具實(shí)現(xiàn)代碼
│ ├── BUILD.gn
│ ├── include
│ ├── src
│ └── test
├── test # Fuzz測(cè)試和系統(tǒng)測(cè)試用例存放目錄
│ ├── BUILD.gn
│ ├── common
│ ├── demo
│ ├── fuzztest
│ └── systemtest
├── utils # 工具類存放目錄
│ ├── BUILD.gn
│ ├── include
│ ├── src
│ └── test
├── wm # Window Manager Client實(shí)現(xiàn)代碼
│ ├── BUILD.gn
│ ├── include
│ ├── src
│ └── test
└── wmserver # Window Manager Service實(shí)現(xiàn)代碼
├── BUILD.gn
├── include
├── src
└── test
比較核心的文件夾是兩個(gè)使用Client-Server模型的wm/wmserver,dm/dmserver文件夾,其中Client端提供模塊對(duì)外的接口,Server端提供具體的實(shí)現(xiàn)。下面我們以wm/wmserver為例講解下windowmanager的實(shí)現(xiàn)。
window_manager的代碼實(shí)現(xiàn):
小Tip:當(dāng)學(xué)習(xí)一個(gè)新的模塊的時(shí)候,如果不知道如何下手,可以在這個(gè)模塊中選擇一個(gè)具體的功能(最好是具有代表性的),找到相關(guān)的接口(流程里的任何階段的都可以),然后去通過(guò)不斷的查詢調(diào)用者和接口本身的實(shí)現(xiàn)又調(diào)用了誰(shuí)來(lái)梳理下流程,畫出時(shí)序圖,然后根據(jù)定義接口的頭文件來(lái)確定類圖。這兩個(gè)圖確定后,整體的代碼結(jié)構(gòu)和流程就會(huì)變得清晰。
我們先回顧下窗口管理的相關(guān)功能:
窗口管理:窗口提供管理窗口的一些基礎(chǔ)能力,包括對(duì)當(dāng)前窗口的創(chuàng)建、銷毀、各屬性設(shè)置,以及對(duì)各窗口間的管理調(diào)度。
我們很容易可以在window_impl.h文件中找到這些基礎(chǔ)能力的對(duì)應(yīng)接口:
\foundation\window\window_manager\wm\include\window_impl.h。
WMError Create(uint32_t parentId, //創(chuàng)建
const std::shared_ptr<AbilityRuntime::Context>& context = nullptr);
virtual WMError Destroy() override; //銷毀
//窗口的管理調(diào)度
virtual WMError Show(uint32_t reason = 0, bool withAnimation = false) override;
virtual WMError Hide(uint32_t reason = 0, bool withAnimation = false) override;
virtual WMError MoveTo(int32_t x, int32_t y) override;
virtual WMError Resize(uint32_t width, uint32_t height) override;
virtual WMError SetKeepScreenOn(bool keepScreenOn) override;
virtual bool IsKeepScreenOn() const override;
virtual WMError SetTurnScreenOn(bool turnScreenOn) override;
virtual bool IsTurnScreenOn() const override;
virtual WMError SetBackgroundColor(const std::string& color) override;
virtual WMError SetTransparent(bool isTransparent) override;
virtual bool IsTransparent() const override;
virtual WMError SetBrightness(float brightness) override;
virtual float GetBrightness() const override;
virtual WMError SetCallingWindow(uint32_t windowId) override;
virtual void SetPrivacyMode(bool isPrivacyMode) override;
virtual bool IsPrivacyMode() const override;
virtual void SetSystemPrivacyMode(bool isSystemPrivacyMode) override;
virtual void DisableAppWindowDecor() override;
virtual WMError BindDialogTarget(sptr<IRemoteObject> targetToken) override;
virtual void SetSnapshotSkip(bool isSkip) override;
// window effect 屬性設(shè)置
virtual WMError SetCornerRadius(float cornerRadius) override;
virtual WMError SetShadowRadius(float radius) override;
virtual WMError SetShadowColor(std::string color) override;
virtual void SetShadowOffsetX(float offsetX) override;
virtual void SetShadowOffsetY(float offsetY) override;
virtual WMError SetBlur(float radius) override;
virtual WMError SetBackdropBlur(float radius) override;
virtual WMError SetBackdropBlurStyle(WindowBlurStyle blurStyle) override;
我們?cè)僖源翱诘膭?chuàng)建函數(shù)為例梳理下流程:
Create函數(shù)的實(shí)現(xiàn):
\foundation\window\window_manager\wm\src\window_impl.cpp。
WMError WindowImpl::Create(uint32_t parentId, const std::shared_ptr<AbilityRuntime::Context>& context)
{
//此處省略若干代碼
WMError ret = SingletonContainer::Get<WindowAdapter>().CreateWindow(windowAgent, property_, surfaceNode_,
windowId, token);
RecordLifeCycleExceptionEvent(LifeCycleEvent::CREATE_EVENT, ret);
//此處省略若干代碼
return ret;
}
可以再代碼里面看到調(diào)用了WindowAdapter中的CreateWindow函數(shù),而本身WindowImpl::Create的調(diào)用者可以通過(guò)IDE工具搜到:
\foundation\window\window_manager\wm\src\window.cpp。
sptr<Window> Window::Create(const std::string& windowName, sptr<WindowOption>& option,
const std::shared_ptr<OHOS::AbilityRuntime::Context>& context)
{
//此處省略若干代碼
WMError error = windowImpl->Create(option->GetParentId(), context);//調(diào)用windowImpl->Create
if (error != WMError::WM_OK) {
return nullptr;
}
return windowImpl;
}
通過(guò)不斷的尋找調(diào)用者和調(diào)用的接口,可以獲得一個(gè)時(shí)序圖(圖1):


圖1 開(kāi)機(jī)動(dòng)畫窗口創(chuàng)建時(shí)序圖
說(shuō)明:
- 這個(gè)是開(kāi)機(jī)動(dòng)畫創(chuàng)建窗口流程時(shí)序圖。
- rs_surface_node.cpp這個(gè)類負(fù)責(zé)窗口的繪制,屬于graphic模塊的內(nèi)容,和window_manager模塊的關(guān)系就是window_manager的窗口最終還是要依賴graphic模塊去進(jìn)行繪制的。
- window_adapter.cpp與window_manager_service.cpp之間使用IPC進(jìn)行跨進(jìn)程通訊,詳細(xì)的IPC實(shí)現(xiàn)說(shuō)明會(huì)在下篇文章介紹。
代碼的文件結(jié)構(gòu)清晰了,大致的代碼流程也熟悉了,可以繪制類圖了(現(xiàn)在很多工具可以自動(dòng)繪制類圖,但是建議自己親手繪制下,對(duì)理清代碼結(jié)構(gòu)和思路很有幫助)。


圖2 windowmanager類圖
說(shuō)明:
- window_manager_service是窗口管理的服務(wù)端類,窗口管理功能的具體實(shí)現(xiàn)是在服務(wù)端實(shí)現(xiàn)。
- window_manager_service和window_adapter屬于不同線程,他們通過(guò)IPC進(jìn)行通訊。
- 窗口管理服務(wù),提供窗口布局、Z序控制、窗口樹(shù)結(jié)構(gòu)、窗口拖拽、窗口快照等能力,并提供窗口布局和焦點(diǎn)窗口給多模輸入,這些功能在各個(gè)類的中的對(duì)應(yīng):
窗口布局:WindowLayOutPolicy
Z序控制:WindowZorderPolicy
窗口樹(shù)結(jié)構(gòu):WindowRoot
窗口拖拽:DragController
窗口快照:SnapshotController
提供多模輸入:InputWindowMonitor
具體的代碼實(shí)現(xiàn)有興趣的同學(xué)可以自行研究,更有興趣的同學(xué)可以考慮繪制下DisplayManager的時(shí)序圖和類圖。
參考文獻(xiàn):
https://gitee.com/openharmony/window_window_manager 《window_manger倉(cāng)源碼》
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
??https://ost.51cto.com??