成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

由淺入深學習新模塊之Window_manager(二)

系統 OpenHarmony
本文開始介紹OpenHarmony的Window_manager的具體實現相關。

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

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

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

前言:

在??上一篇??文章中,主要介紹了window_manager的發展史和功能介紹,本文開始介紹OpenHarmony的window_manager的具體實現相關。

window_manager在OpenHarmony中的代碼目錄:

foundation/window/window_manager/
├── dm # Dislplay Manager Client實現代碼
├── BUILD.gn
├── include
├── src
└── test
├── dmserver # Dislplay Manager Service實現代碼
├── BUILD.gn
├── include
├── src
└── test
├── extension # Ability Component 窗口相關代碼實現目錄
├── extension_connection # Ability Component 嵌入部分
└── window_extension # Ability Component 被嵌入部分
├── interfaces # 對外接口存放目錄
├── innerkits # native接口存放目錄
└── kits # js/napi接口存放目錄
├── previewer # IDE輕量模擬器窗口代碼實現目錄
├── BUILD.gn
├── include
├── mock
└── src
├── resources # 框架使用資源文件存放目錄
├── BUILD.gn
├── config
├── dialog_ui
└── media
├── sa_profile # 系統服務配置文件
├── 4606.xml
├── 4607.xml
└── BUILD.gn
├── snapshot # 截屏命令行工具實現代碼
├── BUILD.gn
├── include
├── src
└── test
├── test # Fuzz測試和系統測試用例存放目錄
├── BUILD.gn
├── common
├── demo
├── fuzztest
└── systemtest
├── utils # 工具類存放目錄
├── BUILD.gn
├── include
├── src
└── test
├── wm # Window Manager Client實現代碼
├── BUILD.gn
├── include
├── src
└── test
└── wmserver # Window Manager Service實現代碼
├── BUILD.gn
├── include
├── src
└── test

比較核心的文件夾是兩個使用Client-Server模型的wm/wmserver,dm/dmserver文件夾,其中Client端提供模塊對外的接口,Server端提供具體的實現。下面我們以wm/wmserver為例講解下windowmanager的實現。

window_manager的代碼實現:

小Tip:當學習一個新的模塊的時候,如果不知道如何下手,可以在這個模塊中選擇一個具體的功能(最好是具有代表性的),找到相關的接口(流程里的任何階段的都可以),然后去通過不斷的查詢調用者和接口本身的實現又調用了誰來梳理下流程,畫出時序圖,然后根據定義接口的頭文件來確定類圖。這兩個圖確定后,整體的代碼結構和流程就會變得清晰。

我們先回顧下窗口管理的相關功能:

窗口管理:窗口提供管理窗口的一些基礎能力,包括對當前窗口的創建、銷毀、各屬性設置,以及對各窗口間的管理調度。

我們很容易可以在window_impl.h文件中找到這些基礎能力的對應接口:

\foundation\window\window_manager\wm\include\window_impl.h。

WMError Create(uint32_t parentId,   //創建
const std::shared_ptr<AbilityRuntime::Context>& context = nullptr);
virtual WMError Destroy() override; //銷毀

//窗口的管理調度
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 屬性設置
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;

我們再以窗口的創建函數為例梳理下流程:

Create函數的實現:

\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;
}

可以再代碼里面看到調用了WindowAdapter中的CreateWindow函數,而本身WindowImpl::Create的調用者可以通過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);//調用windowImpl->Create
if (error != WMError::WM_OK) {
return nullptr;
}
return windowImpl;
}

通過不斷的尋找調用者和調用的接口,可以獲得一個時序圖(圖1):

由淺入深學習新模塊之window_manager(二)-開源基礎軟件社區

由淺入深學習新模塊之window_manager(二)-開源基礎軟件社區

圖1 開機動畫窗口創建時序圖

說明:

  1. 這個是開機動畫創建窗口流程時序圖。
  2. rs_surface_node.cpp這個類負責窗口的繪制,屬于graphic模塊的內容,和window_manager模塊的關系就是window_manager的窗口最終還是要依賴graphic模塊去進行繪制的。
  3. window_adapter.cpp與window_manager_service.cpp之間使用IPC進行跨進程通訊,詳細的IPC實現說明會在下篇文章介紹。

代碼的文件結構清晰了,大致的代碼流程也熟悉了,可以繪制類圖了(現在很多工具可以自動繪制類圖,但是建議自己親手繪制下,對理清代碼結構和思路很有幫助)。

由淺入深學習新模塊之window_manager(二)-開源基礎軟件社區

由淺入深學習新模塊之window_manager(二)-開源基礎軟件社區

圖2 windowmanager類圖

說明:

  1. window_manager_service是窗口管理的服務端類,窗口管理功能的具體實現是在服務端實現。
  2. window_manager_service和window_adapter屬于不同線程,他們通過IPC進行通訊。
  3. 窗口管理服務,提供窗口布局、Z序控制、窗口樹結構、窗口拖拽、窗口快照等能力,并提供窗口布局和焦點窗口給多模輸入,這些功能在各個類的中的對應:
    窗口布局:WindowLayOutPolicy
    Z序控制:WindowZorderPolicy
    窗口樹結構:WindowRoot
    窗口拖拽:DragController
    窗口快照:SnapshotController
    提供多模輸入:InputWindowMonitor

具體的代碼實現有興趣的同學可以自行研究,更有興趣的同學可以考慮繪制下DisplayManager的時序圖和類圖。

參考文獻:

https://gitee.com/openharmony/window_window_manager 《window_manger倉源碼》

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

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

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

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

2023-02-08 15:32:56

新模塊操作系統

2011-07-05 17:45:07

PHP框架

2019-03-08 09:28:42

Google 開源技術

2022-10-09 08:53:06

存儲容量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

亞馬遜云科技機器學習

2021-03-19 08:47:38

Zabbix 5.2VMware監控

2022-11-03 14:13:52

強化學習方法

2016-11-11 14:12:19

R語言

2021-04-23 08:41:17

Zabbix 5.2Nginx監控

2021-04-15 08:45:25

Zabbix 5.2Apache監控

2021-04-25 08:28:44

Zabbix 5.2監控IIS服務運維

2024-12-23 14:10:00

AI模型數據

2010-08-27 11:10:30

CSSmargin

2010-08-25 09:37:39

margin
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美性影院 | 丁香综合| 综合久久av | 亚洲欧美激情精品一区二区 | 国产精品国产三级国产aⅴ中文 | 免费日韩网站 | 精品在线观看入口 | 色婷婷婷婷色 | av在线播放网 | 日韩有码一区 | 日韩精品一区二区久久 | 日韩视频在线一区二区 | 欧美午夜精品久久久久久浪潮 | 国产免费av在线 | 午夜免费小视频 | 亚洲乱码国产乱码精品精98午夜 | 久久精品一区二区三区四区 | 蜜桃av鲁一鲁一鲁一鲁 | 亚洲区一区二区 | 日韩一区中文字幕 | 亚洲人在线播放 | 在线激情视频 | 欧美日韩久| 国产精品乱码一二三区的特点 | 亚洲午夜精品 | 亚洲日本一区二区三区四区 | 暖暖日本在线视频 | 看片一区 | 成人在线播放 | 久久成人国产 | 日本小电影在线 | 人人种亚洲| 久久免费视频网 | 亚洲综合无码一区二区 | 欧美日韩黄色一级片 | 成人欧美一区二区三区在线播放 | 超碰97人人人人人蜜桃 | 免费麻豆视频 | 中文字幕成人在线 | 中文字幕一区二区三区四区五区 | 中文字幕在线观看 |