DSRenderViewDaliImpl: emit update signal when DSWindow destroyed. 94/242494/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Thu, 27 Aug 2020 03:36:50 +0000 (12:36 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 27 Aug 2020 07:51:15 +0000 (16:51 +0900)
Change-Id: I0bd58e1e4f1d9e5e96606324c35dbde5c1b0cd43
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/DSRender/DSRenderViewDaliImpl.cpp
src/DSRender/DSRenderViewDaliImpl.h

index 7cc724d..ef3c1f2 100644 (file)
@@ -84,7 +84,8 @@ Geometry DSRenderViewDaliImpl::CreateTexturedQuad()
 
 DSRenderViewDaliImpl::DSRenderViewDaliImpl(std::shared_ptr<DSWindow> window, Dali::OffscreenWindow offscreenWindow)
        : __window(window),
-         __offscreenWindow(offscreenWindow)
+         __offscreenWindow(offscreenWindow),
+         __windowDestroyed(false)
 {
        std::string fragmentShader = "#extension GL_OES_EGL_image_external:require\n";
        fragmentShader += FRAGMENT_SHADER;
@@ -104,6 +105,7 @@ DSRenderViewDaliImpl::DSRenderViewDaliImpl(std::shared_ptr<DSWindow> window, Dal
        offscreenWindow.Add(__textureViewActor);
 
        // callbacks
+       window->registerCallbackWindowDestroyed(this, std::bind(&DSRenderViewDaliImpl::__onWindowDestroyed, this, std::placeholders::_1));
        window->registerCallbackBufferChanged(this, std::bind(&DSRenderViewDaliImpl::__onWindowBufferChanged, this, std::placeholders::_1));
        window->registerCallbackWindowRaiseToTop(this, std::bind(&DSRenderViewDaliImpl::__onWindowRaiseToTopChanged, this, std::placeholders::_1));
        window->registerCallbackWindowLowerToBottom(this, std::bind(&DSRenderViewDaliImpl::__onWindowLowerToBottomChanged, this, std::placeholders::_1));
@@ -112,8 +114,10 @@ DSRenderViewDaliImpl::DSRenderViewDaliImpl(std::shared_ptr<DSWindow> window, Dal
 
 DSRenderViewDaliImpl::~DSRenderViewDaliImpl()
 {
-       __textureViewActor.RemoveRenderer(__renderer);
-       __offscreenWindow.Remove(__textureViewActor);
+       if (!__windowDestroyed) {
+               __textureViewActor.RemoveRenderer(__renderer);
+               __offscreenWindow.Remove(__textureViewActor);
+       }
 }
 
 bool DSRenderViewDaliImpl::setBuffer(std::shared_ptr<IDSBuffer> buffer)
@@ -156,6 +160,18 @@ void DSRenderViewDaliImpl::registerCallbackUpdated(DSObject *slot, std::function
        __updatedSignal.connect(slot, func);
 }
 
+void DSRenderViewDaliImpl::__onWindowDestroyed(void *data)
+{
+       DSLOG_INF("DSRenderViewDaliImpl", "__onWindowDestroyed.");
+
+       __textureViewActor.RemoveRenderer(__renderer);
+       __offscreenWindow.Remove(__textureViewActor);
+
+       __windowDestroyed = true;
+
+       __updatedSignal.emit(nullptr);
+}
+
 void DSRenderViewDaliImpl::__onWindowBufferChanged(std::shared_ptr<IDSBuffer> buffer)
 {
        if (buffer) {
index 8ffd858..f982bc5 100644 (file)
@@ -48,6 +48,7 @@ public:
        Dali::Geometry CreateTexturedQuad();
 
 private:
+       void __onWindowDestroyed(void *data);
        void __onWindowBufferChanged(std::shared_ptr<IDSBuffer> buffer);
        void __onWindowRaiseToTopChanged(void *data);
        void __onWindowLowerToBottomChanged(void *data);
@@ -58,6 +59,8 @@ private:
        Dali::Renderer            __renderer;
        Dali::Actor               __textureViewActor;
 
+       bool                      __windowDestroyed;
+
        DSSignal<void *> __updatedSignal;
 };