DSWaylandSurface: implement the requests 60/241660/1
authorSooChan Lim <sc1.lim@samsung.com>
Tue, 21 Jul 2020 11:00:36 +0000 (20:00 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 20 Aug 2020 09:54:30 +0000 (18:54 +0900)
Change-Id: I4cdfc3414bf4c4b5204d41f1eb3bf3637cacdfbb

src/DSWaylandServer/DSWaylandSurface.cpp
src/DSWaylandServer/DSWaylandSurface.h
src/DSWaylandServer/DSWaylandSurfacePrivate.h

index 5fc903f..1832bdc 100644 (file)
@@ -4,14 +4,42 @@
 namespace display_server
 {
 
-DSWaylandSurfacePrivate::DSWaylandSurfacePrivate(DSWaylandSurface *p_ptr)
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+//  DSWaylandSurfaceCommitInfoPrivate
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+DSWaylandSurfaceCommitInfoPrivate::DSWaylandSurfaceCommitInfoPrivate(DSWaylandSurfaceCommitInfo *p_ptr)
        : DSObjectPrivate(p_ptr),
          __p_ptr(p_ptr)
 {}
 
+DSWaylandSurfaceCommitInfoPrivate::~DSWaylandSurfaceCommitInfoPrivate()
+{}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+//  DSWaylandSurfaceCommitInfo
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+DSWaylandSurfaceCommitInfo::DSWaylandSurfaceCommitInfo()
+       : DS_INIT_PRIVATE_PTR(DSWaylandSurfaceCommitInfo)
+{}
+
+DSWaylandSurfaceCommitInfo::~DSWaylandSurfaceCommitInfo()
+{}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+//  DSWaylandSurfacePrivate
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+DSWaylandSurfacePrivate::DSWaylandSurfacePrivate(DSWaylandSurface *p_ptr)
+       : DSObjectPrivate(p_ptr),
+         __p_ptr(p_ptr),
+         __commitInfoPending{std::make_unique<DSWaylandSurfaceCommitInfo>()},
+         __commitInfo{std::make_shared<DSWaylandSurfaceCommitInfo>()}
+{}
+
 DSWaylandSurfacePrivate::DSWaylandSurfacePrivate(DSWaylandSurface *p_ptr, DSWaylandClient *waylandClient, uint32_t id)
        : DSObjectPrivate(p_ptr),
-         __p_ptr(p_ptr)
+         __p_ptr(p_ptr),
+         __commitInfoPending{std::make_unique<DSWaylandSurfaceCommitInfo>()},
+         __commitInfo{std::make_shared<DSWaylandSurfaceCommitInfo>()}
 {
        if (id > 0) {
                wl_surface::init(waylandClient->wlClient(), (int)id, 4);
@@ -35,40 +63,83 @@ void DSWaylandSurfacePrivate::surface_destroy(Resource *resource)
 
 void DSWaylandSurfacePrivate::surface_attach(Resource *resource, struct ::wl_resource *buffer, int32_t x, int32_t y)
 {
+       DSWaylandSurfaceCommitInfoPrivate *commitInfoPendingPriv = DSWaylandSurfaceCommitInfoPrivate::getPrivate(__commitInfoPending.get());
+
+       commitInfoPendingPriv->attach.x = x;
+       commitInfoPendingPriv->attach.y = y;
+       commitInfoPendingPriv->attach.buffer = buffer;
 }
 
 void DSWaylandSurfacePrivate::surface_damage(Resource *resource, int32_t x, int32_t y, int32_t width, int32_t height)
 {
+       DSWaylandSurfaceCommitInfoPrivate *commitInfoPendingPriv = DSWaylandSurfaceCommitInfoPrivate::getPrivate(__commitInfoPending.get());
+
+       commitInfoPendingPriv->damageSurface.x = x;
+       commitInfoPendingPriv->damageSurface.y = y;
+       commitInfoPendingPriv->damageSurface.width = width;
+       commitInfoPendingPriv->damageSurface.height = height;
 }
 
 void DSWaylandSurfacePrivate::surface_frame(Resource *resource, uint32_t callback)
 {
+       //TODO:
 }
 
 void DSWaylandSurfacePrivate::surface_set_opaque_region(Resource *resource, struct ::wl_resource *region)
 {
+       //TODO:
 }
 
 void DSWaylandSurfacePrivate::surface_set_input_region(Resource *resource, struct ::wl_resource *region)
 {
+       //TODO:
 }
 
 void DSWaylandSurfacePrivate::surface_commit(Resource *resource)
 {
+       DS_GET_PUB(DSWaylandSurface);
+
+       DSWaylandSurfaceCommitInfoPrivate *commitInfoPendingPriv = DSWaylandSurfaceCommitInfoPrivate::getPrivate(__commitInfoPending.get());
+       DSWaylandSurfaceCommitInfoPrivate *commitInfoPriv = DSWaylandSurfaceCommitInfoPrivate::getPrivate(__commitInfo.get());
+
+       //copy commit information from commitInfoPendingPriv to commitInfoPriv
+       commitInfoPriv->attach = commitInfoPendingPriv->attach;
+       commitInfoPriv->damageSurface = commitInfoPendingPriv->damageSurface;
+       commitInfoPriv->transform = commitInfoPendingPriv->transform;
+       commitInfoPriv->scale = commitInfoPendingPriv->scale;
+       commitInfoPriv->damageBuffer = commitInfoPendingPriv->damageBuffer;
+
+       // emit a signal of the surface committed
+       pub->__surfaceCommittedSignal.emit(__commitInfo);
 }
 
 void DSWaylandSurfacePrivate::surface_set_buffer_transform(Resource *resource, int32_t transform)
 {
+       DSWaylandSurfaceCommitInfoPrivate *commitInfoPendingPriv = DSWaylandSurfaceCommitInfoPrivate::getPrivate(__commitInfoPending.get());
+
+       commitInfoPendingPriv->transform = transform;
 }
 
 void DSWaylandSurfacePrivate::surface_set_buffer_scale(Resource *resource, int32_t scale)
 {
+       DSWaylandSurfaceCommitInfoPrivate *commitInfoPendingPriv = DSWaylandSurfaceCommitInfoPrivate::getPrivate(__commitInfoPending.get());
+
+       commitInfoPendingPriv->scale = scale;
 }
 
 void DSWaylandSurfacePrivate::surface_damage_buffer(Resource *resource, int32_t x, int32_t y, int32_t width, int32_t height)
 {
+       DSWaylandSurfaceCommitInfoPrivate *commitInfoPendingPriv = DSWaylandSurfaceCommitInfoPrivate::getPrivate(__commitInfoPending.get());
+
+       commitInfoPendingPriv->damageBuffer.x = x;
+       commitInfoPendingPriv->damageBuffer.y = y;
+       commitInfoPendingPriv->damageBuffer.width = width;
+       commitInfoPendingPriv->damageBuffer.height = height;
 }
 
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+//  DSWaylandSurface
+////////////////////////////////////////////////////////////////////////////////////////////////////////
 DSWaylandSurface::DSWaylandSurface()
     : DS_INIT_PRIVATE_PTR(DSWaylandSurface)
 {}
@@ -80,4 +151,9 @@ DSWaylandSurface::DSWaylandSurface(DSWaylandClient *waylandClient, uint32_t id)
 DSWaylandSurface::~DSWaylandSurface()
 {}
 
+void DSWaylandSurface::registerCallbackSurfaceCommitted(DSObject *slot, std::function<void(std::shared_ptr<DSWaylandSurfaceCommitInfo> commitInfo)> func)
+{
+       this->__surfaceCommittedSignal.connect(slot, func);
+}
+
 } /* namespace display_server */
index 6773f21..e439f13 100644 (file)
@@ -1,15 +1,26 @@
 #ifndef __DS_WAYLAND_SURFACE_H__
 #define __DS_WAYLAND_SURFACE_H__
 
-#include <DSObject.h>
+#include "DSCore.h"
+#include "DSObject.h"
+#include "DSSignal.h"
 #include "DSWaylandClient.h"
-#include <memory>
 
 namespace display_server
 {
 
+class DSWaylandSurfaceCommitInfoPrivate;
 class DSWaylandSurfacePrivate;
 
+class DSWaylandSurfaceCommitInfo : public DSObject
+{
+DS_PIMPL_USE_PRIVATE(DSWaylandSurfaceCommitInfo);
+public:
+       DSWaylandSurfaceCommitInfo();
+       virtual ~DSWaylandSurfaceCommitInfo();
+
+       //TODO: add getter functions.
+};
 
 class DSWaylandSurface : public DSObject
 {
@@ -18,6 +29,13 @@ public:
        DSWaylandSurface();
        DSWaylandSurface(DSWaylandClient *waylandClient, uint32_t id);
        virtual ~DSWaylandSurface();
+
+       // Callback methods
+       void registerCallbackSurfaceCommitted(DSObject *slot, std::function<void(std::shared_ptr<DSWaylandSurfaceCommitInfo> commitInfo)> func);
+
+private:
+       // signals
+       DSSignal<std::shared_ptr<DSWaylandSurfaceCommitInfo>> __surfaceCommittedSignal;
 };
 
 } /* namespace display_server */
index 46324fe..f5bbbd9 100644 (file)
@@ -7,8 +7,51 @@
 namespace display_server
 {
 
+class DSWaylandSurfaceCommitInfo;
 class DSWaylandSurface;
 
+class DSWaylandSurfaceCommitInfoPrivate : public DSObjectPrivate
+{
+DS_PIMPL_USE_PUBLIC(DSWaylandSurfaceCommitInfo);
+public:
+       DSWaylandSurfaceCommitInfoPrivate() = delete;
+       DSWaylandSurfaceCommitInfoPrivate(DSWaylandSurfaceCommitInfo *p_ptr);
+       ~DSWaylandSurfaceCommitInfoPrivate() override;
+
+       static DSWaylandSurfaceCommitInfoPrivate *getPrivate(DSWaylandSurfaceCommitInfo *q) { return q->__d_func(); }
+
+       //TODO: add getter functions.
+
+public:
+       struct attach {
+               int32_t x;
+               int32_t y;
+               struct ::wl_resource *buffer;
+       };
+       struct attach attach;
+
+       struct damageSurface {
+               int32_t x;
+               int32_t y;
+               int32_t width;
+               int32_t height;
+       };
+       struct damageSurface damageSurface;
+
+       //TODO: opaque_region
+       //TODO: input region
+       int32_t transform;
+       int32_t scale;
+
+       struct damageBuffer {
+               int32_t x;
+               int32_t y;
+               int32_t width;
+               int32_t height;
+       };
+       struct damageBuffer damageBuffer;
+};
+
 class DSWaylandSurfacePrivate : public DSObjectPrivate, public DSWaylandServer::wl_surface
 {
 DS_PIMPL_USE_PUBLIC(DSWaylandSurface);
@@ -34,6 +77,8 @@ protected:
        void surface_damage_buffer(Resource *resource, int32_t x, int32_t y, int32_t width, int32_t height) override;
 
 private:
+       std::unique_ptr<DSWaylandSurfaceCommitInfo> __commitInfoPending;
+       std::shared_ptr<DSWaylandSurfaceCommitInfo> __commitInfo;
 };
 
 } /*namespace display_server */