DSWaylandCompositor: support DSWaylandSurface destroy callback function 21/241821/1
authorDoyoun Kang <doyoun.kang@samsung.com>
Fri, 14 Aug 2020 03:43:28 +0000 (12:43 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 20 Aug 2020 10:11:42 +0000 (19:11 +0900)
Change-Id: I2450874fd4c3a442d941a2f6b0fb8082e86b3ef2

src/DSWaylandServer/DSWaylandCompositor.cpp
src/DSWaylandServer/DSWaylandCompositor.h
src/DSWaylandServer/DSWaylandSurface.cpp

index 67b7714..6079ce0 100644 (file)
@@ -266,6 +266,8 @@ void DSWaylandCompositorPrivate::compositor_create_surface(wl_compositor::Resour
        DSWaylandClient *waylandClient = DSWaylandClient::fromWlClient(resource->client());
        auto waylandSruface = std::make_shared<DSWaylandSurface>(waylandClient, id);
 
+       pub->__surfaceList.push_front(waylandSruface);
+
        // emit a signal of the surface created
        pub->__surfaceCreatedSignal.emit(waylandSruface);
 }
@@ -492,9 +494,27 @@ IDSWaylandShell *DSWaylandCompositor::getShell(void)
        return priv->getShell();
 }
 
+void DSWaylandCompositor::sendSurfaceDestroy(DSWaylandSurface *dswSurface)
+{
+       for (auto s : __surfaceList)
+       {
+               if (s.get() == dswSurface)
+               {
+                       __surfaceDestroySignal.emit(s);
+                       __surfaceList.remove(s);
+                       break;
+               }
+       }
+}
+
 void DSWaylandCompositor::registerCallbackSurfaceCreated(DSObject *slot, std::function<void(std::shared_ptr<DSWaylandSurface>)> func)
 {
        this->__surfaceCreatedSignal.connect(slot, func);
 }
 
+void DSWaylandCompositor::registerCallbackSurfaceDestroy(DSObject *slot, std::function<void(std::shared_ptr<DSWaylandSurface>)> func)
+{
+       __surfaceDestroySignal.connect(slot, func);
+}
+
 }
index ed48bd9..4de11dc 100644 (file)
@@ -66,8 +66,11 @@ public:
        bool setShell(IDSWaylandShell *shell);
        IDSWaylandShell *getShell(void);
 
+       void sendSurfaceDestroy(DSWaylandSurface *dswSurface);
+
        // Callback methods
        void registerCallbackSurfaceCreated(DSObject *slot, std::function<void(std::shared_ptr<DSWaylandSurface>)> func);
+       void registerCallbackSurfaceDestroy(DSObject *slot, std::function<void(std::shared_ptr<DSWaylandSurface>)> func);
 
 protected:
        //TODO
@@ -82,8 +85,11 @@ private:
        DSWaylandCompositor(DSObject *parent);
        DSWaylandCompositor& operator=(const DSWaylandCompositor&) = delete;
 
+       std::list<std::shared_ptr<DSWaylandSurface>> __surfaceList;
+
        // signals
        DSSignal<std::shared_ptr<DSWaylandSurface>> __surfaceCreatedSignal;
+       DSSignal<std::shared_ptr<DSWaylandSurface>> __surfaceDestroySignal;
 };
 
 }
index 249a3f6..9896f38 100644 (file)
@@ -86,6 +86,14 @@ void DSWaylandSurfacePrivate::surface_bind_resource(Resource *resource)
 
 void DSWaylandSurfacePrivate::surface_destroy_resource(Resource *resource)
 {
+       DS_GET_PUB(DSWaylandSurface);
+
+       DSWaylandCompositor *dswCompositor = DSWaylandCompositor::getInstance();
+       if (dswCompositor)
+       {
+               dswCompositor->sendSurfaceDestroy(pub);
+       }
+       DSWaylandCompositor::releaseInstance();
 }
 
 void DSWaylandSurfacePrivate::surface_destroy(Resource *resource)