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);
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)
{}
DSWaylandSurface::~DSWaylandSurface()
{}
+void DSWaylandSurface::registerCallbackSurfaceCommitted(DSObject *slot, std::function<void(std::shared_ptr<DSWaylandSurfaceCommitInfo> commitInfo)> func)
+{
+ this->__surfaceCommittedSignal.connect(slot, func);
+}
+
} /* namespace display_server */
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);
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 */