DSDisplayArea: destory DSRenderView and DSDisplayDeviceHWCWindow 12/242012/1
authorSooChan Lim <sc1.lim@samsung.com>
Fri, 21 Aug 2020 05:14:57 +0000 (14:14 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Fri, 21 Aug 2020 10:10:15 +0000 (19:10 +0900)
Change-Id: Id79476dfabdbb4c6726783f47be648265fb8b0bc

src/DSDisplayArea/DSDisplayArea.cpp
src/DSDisplayArea/DSDisplayAreaPrivate.h

index fdcadd4..ecfd519 100644 (file)
@@ -130,16 +130,40 @@ bool DSDisplayAreaPrivate::addZone(std::shared_ptr<DSZone> zone)
 {
        __zone = zone;
        __zone->registerCallbackWindowCreated(this, std::bind(&DSDisplayAreaPrivate::__onWindowCreated, this, std::placeholders::_1));
+       __zone->registerCallbackWindowDestroy(this, std::bind(&DSDisplayAreaPrivate::__onWindowDestroy, this, std::placeholders::_1));
 
        return true;
 }
 
 void DSDisplayAreaPrivate::__onWindowCreated(std::shared_ptr<DSWindow> window)
 {
+       // TODO: think about using unordered_map
        __renderViewList.push_back(__renderEngine->makeRenderView(window));
        __displayDeviceHWCWindowList.push_back(__displayDeviceHWC->makeHWCWindow(window));
 }
 
+void DSDisplayAreaPrivate::__onWindowDestroy(std::shared_ptr<DSWindow> window)
+{
+       // TODO: think about using unordered_map
+       for (auto renderView : __renderViewList) {
+               auto tmpWindow = renderView->getWindow();
+               if (tmpWindow.get() == window.get()) {
+                       __renderViewList.remove(renderView);
+                       renderView.reset();
+                       break;
+               }
+       }
+
+       for (auto displayDeviceHWCWindow : __displayDeviceHWCWindowList) {
+               auto tmpHWCWindow = displayDeviceHWCWindow->getWindow();
+               if (tmpHWCWindow.get() == window.get()) {
+                       __displayDeviceHWCWindowList.remove(displayDeviceHWCWindow);
+                       displayDeviceHWCWindow.reset();
+                       break;
+               }
+       }
+}
+
 void DSDisplayAreaPrivate::__onEventIdleEnterer(void *data)
 {
        DSLOG_INF("DSDisplayAreaPrivate", "__onEventIdleEnterer");
index 1b92f99..cb16595 100644 (file)
@@ -54,6 +54,7 @@ public:
 
 private:
        void __onWindowCreated(std::shared_ptr<DSWindow> window);
+       void __onWindowDestroy(std::shared_ptr<DSWindow> window);
        void __onEventIdleEnterer(void *data);
 
        std::shared_ptr<IDSOutput> __output;