自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

由淺入深學(xué)習(xí)新模塊之Window_manager(二)

系統(tǒng) OpenHarmony
本文開(kāi)始介紹OpenHarmony的Window_manager的具體實(shí)現(xiàn)相關(guān)。

??想了解更多關(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):

由淺入深學(xué)習(xí)新模塊之window_manager(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

由淺入深學(xué)習(xí)新模塊之window_manager(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

圖1 開(kāi)機(jī)動(dòng)畫窗口創(chuàng)建時(shí)序圖

說(shuō)明:

  1. 這個(gè)是開(kāi)機(jī)動(dòng)畫創(chuàng)建窗口流程時(shí)序圖。
  2. rs_surface_node.cpp這個(gè)類負(fù)責(zé)窗口的繪制,屬于graphic模塊的內(nèi)容,和window_manager模塊的關(guān)系就是window_manager的窗口最終還是要依賴graphic模塊去進(jìn)行繪制的。
  3. 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)和思路很有幫助)。

由淺入深學(xué)習(xí)新模塊之window_manager(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

由淺入深學(xué)習(xí)新模塊之window_manager(二)-開(kāi)源基礎(chǔ)軟件社區(qū)

圖2 windowmanager類圖

說(shuō)明:

  1. window_manager_service是窗口管理的服務(wù)端類,窗口管理功能的具體實(shí)現(xiàn)是在服務(wù)端實(shí)現(xiàn)。
  2. window_manager_service和window_adapter屬于不同線程,他們通過(guò)IPC進(jìn)行通訊。
  3. 窗口管理服務(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??

責(zé)任編輯:jianghua 來(lái)源: 51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-02-08 15:32:56

新模塊操作系統(tǒng)

2011-07-05 17:45:07

PHP框架

2019-03-08 09:28:42

Google 開(kāi)源技術(shù)

2022-10-09 08:53:06

存儲(chǔ)容量SSD

2011-07-15 17:05:14

2010-03-25 17:20:00

CentOS入門

2011-08-23 13:56:12

MySQLConnection

2017-02-25 20:32:36

2021-05-26 16:21:59

亞馬遜云科技機(jī)器學(xué)習(xí)

2021-03-19 08:47:38

Zabbix 5.2VMware監(jiān)控

2022-11-03 14:13:52

強(qiáng)化學(xué)習(xí)方法

2016-11-11 14:12:19

R語(yǔ)言

2021-04-23 08:41:17

Zabbix 5.2Nginx監(jiān)控

2021-04-15 08:45:25

Zabbix 5.2Apache監(jiān)控

2021-04-25 08:28:44

Zabbix 5.2監(jiān)控IIS服務(wù)運(yùn)維

2010-08-27 11:10:30

CSSmargin

2010-08-25 09:37:39

margin

2024-12-23 14:10:00

AI模型數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)