Add code send configure event 06/241806/1
authorDoyoun Kang <doyoun.kang@samsung.com>
Thu, 13 Aug 2020 04:12:58 +0000 (13:12 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 20 Aug 2020 10:11:30 +0000 (19:11 +0900)
Change-Id: I9447aa24c642d683fce41ab75c555b564abd4136

src/DSWaylandServer/DSWaylandZxdgShellV6.cpp
src/DSWaylandServer/DSWaylandZxdgShellV6.h
src/DSWaylandServer/DSWaylandZxdgShellV6Private.h
src/DSWaylandServer/IDSWaylandShell.h
src/DSWindow/DSWindow.cpp
src/DSWindow/DSWindowPrivate.h
src/DSWindowShell/DSWindowShell.cpp
src/DSWindowShell/DSWindowShell.h
src/DSWindowShell/DSWindowShellPrivate.cpp
src/DSWindowShell/DSWindowShellPrivate.h

index ba2e9ff..47d3b0d 100644 (file)
@@ -274,6 +274,12 @@ DSWaylandSurface *DSWaylandZxdgSurfaceV6::getSurface(void)
        return priv->getSurface();
 }
 
+void DSWaylandZxdgSurfaceV6::sendConfigure(int x, int y, unsigned int w, unsigned int h)
+{
+       DS_GET_PRIV(DSWaylandZxdgSurfaceV6);
+       priv->sendConfigure(x, y, w, h);
+}
+
 void DSWaylandZxdgSurfaceV6::setWindowTitle(const std::string &title)
 {
        DS_GET_PRIV(DSWaylandZxdgSurfaceV6);
@@ -317,8 +323,11 @@ std::string DSWaylandZxdgSurfaceV6::getAppID()
 
 
 DSWaylandZxdgSurfaceV6Private::DSWaylandZxdgSurfaceV6Private(DSWaylandZxdgSurfaceV6 *p_ptr)
-       : DSObjectPrivate(p_ptr), __p_ptr(p_ptr), __x(0), __y(0), __w(0), __h(0),
-         __wlSurface(nullptr), __dsSurface(nullptr)
+       : DSObjectPrivate(p_ptr), __p_ptr(p_ptr),
+         __wlSurface(nullptr), __dsSurface(nullptr),
+         __toplevel(nullptr), __popup(nullptr), __role(DSWaylandZxdgSurfaceV6::DS_XDG_SURFACE_ROLE_NONE),
+         __x(0), __y(0), __w(0), __h(0),
+         __title(""), __appId("")
 {
 }
 
@@ -346,6 +355,28 @@ DSWaylandSurface *DSWaylandZxdgSurfaceV6Private::getSurface(void)
        return __dsSurface;
 }
 
+void DSWaylandZxdgSurfaceV6Private::sendConfigure(int x, int y, unsigned int w, unsigned int h)
+{
+       DSWaylandCompositor *wlCompositor = DSWaylandCompositor::getInstance();
+       if (wlCompositor == nullptr) return;
+
+       uint32_t serial = wlCompositor->nextSerial();
+
+       DSLOG_DBG("ZXDG_SURFACE", "Role:%d, Toplevel:%p, Popup:%p", __role, __toplevel, __popup);
+
+       // TODO: Do we check role (toplevel or popup)
+       if (__toplevel)
+               __toplevel->sendConfigure(w, h);
+
+       if (__popup)
+               __popup->sendConfigure(x, y, w, h);
+
+       DSLOG_DBG("ZXDG_SURFACE", "Send configure... serial:%d", serial);
+       send_configure(serial);
+
+       DSWaylandCompositor::releaseInstance();
+}
+
 void DSWaylandZxdgSurfaceV6Private::zxdg_surface_v6_bind_resource(zxdg_surface_v6::Resource *resource)
 {
 }
@@ -362,6 +393,8 @@ void DSWaylandZxdgSurfaceV6Private::zxdg_surface_v6_get_toplevel(zxdg_surface_v6
        DSWaylandZxdgToplevelV6 *zxdgToplevel = new DSWaylandZxdgToplevelV6(pub, resource->client(), id, ZXDG_TOPLEVEL_V6_VERSION);
        __toplevel = zxdgToplevel;
        __role = DSWaylandZxdgSurfaceV6::DS_XDG_SURFACE_ROLE_TOPLEVEL;
+
+       DSLOG_DBG("ZXDG_SURFACE", "Get Toplevel. DSWaylandZxdgToplevel:%p", __toplevel);
 }
 void DSWaylandZxdgSurfaceV6Private::zxdg_surface_v6_get_popup(zxdg_surface_v6::Resource *resource, uint32_t id, struct ::wl_resource *parent, struct ::wl_resource *positioner)
 {
@@ -369,6 +402,8 @@ void DSWaylandZxdgSurfaceV6Private::zxdg_surface_v6_get_popup(zxdg_surface_v6::R
        DSWaylandZxdgPopupV6 *zxdgPopup = new DSWaylandZxdgPopupV6(pub, resource->client(), id, ZXDG_TOPLEVEL_V6_VERSION);
        __popup = zxdgPopup;
        __role = DSWaylandZxdgSurfaceV6::DS_XDG_SURFACE_ROLE_POPUP;
+
+       DSLOG_DBG("ZXDG_SURFACE", "Get Popup. DSWaylandZxdgPopup:%p", __popup);
 }
 void DSWaylandZxdgSurfaceV6Private::zxdg_surface_v6_set_window_geometry(zxdg_surface_v6::Resource *resource, int32_t x, int32_t y, int32_t width, int32_t height)
 {
@@ -444,6 +479,11 @@ void DSWaylandZxdgToplevelV6::init(DSWaylandZxdgSurfaceV6 *zxdgSurface, struct :
        priv->__zxdgSurface = zxdgSurface;
 }
 
+void DSWaylandZxdgToplevelV6::sendConfigure(unsigned int w, unsigned int h)
+{
+       DS_GET_PRIV(DSWaylandZxdgToplevelV6);
+       priv->sendConfigure(w, h);
+}
 
 DSWaylandZxdgToplevelV6Private::DSWaylandZxdgToplevelV6Private(DSWaylandZxdgToplevelV6 *p_ptr)
        : DSObjectPrivate(p_ptr), __p_ptr(p_ptr)
@@ -454,6 +494,34 @@ DSWaylandZxdgToplevelV6Private::~DSWaylandZxdgToplevelV6Private()
 {
 }
 
+void DSWaylandZxdgToplevelV6Private::sendConfigure(unsigned int w, unsigned int h)
+{
+       struct ::wl_array states;
+       wl_array_init(&states);
+
+/*
+       uint32_t *s;
+
+       // if maximized
+       s = wl_array_add(&states, sizeof(uint32_t));
+       if (s)
+       {
+               *s = ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED;
+       }
+
+       // if fullscreen
+       s = wl_array_add(&states, sizeof(uint32_t));
+       if (s)
+       {
+               *s = ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN;
+       }
+*/
+
+       send_configure((int32_t)w, (int32_t)h, &states);
+
+       wl_array_release(&states);
+}
+
 void DSWaylandZxdgToplevelV6Private::zxdg_toplevel_v6_bind_resource(zxdg_toplevel_v6::Resource *resource)
 {
 }
@@ -534,6 +602,11 @@ void DSWaylandZxdgPopupV6::init(DSWaylandZxdgSurfaceV6 *zxdgSurface, struct ::wl
        priv->__zxdgSurface = zxdgSurface;
 }
 
+void DSWaylandZxdgPopupV6::sendConfigure(int x, int y, unsigned int w, unsigned int h)
+{
+       DS_GET_PRIV(DSWaylandZxdgPopupV6);
+       priv->send_configure(x, y, w, h);
+}
 
 DSWaylandZxdgPopupV6Private::DSWaylandZxdgPopupV6Private(DSWaylandZxdgPopupV6 *p_ptr)
        : DSObjectPrivate(p_ptr), __p_ptr(p_ptr)
@@ -544,6 +617,11 @@ DSWaylandZxdgPopupV6Private::~DSWaylandZxdgPopupV6Private()
 {
 }
 
+void DSWaylandZxdgPopupV6Private::sendConfigure(int x, int y, unsigned int w, unsigned int h)
+{
+       send_configure(x, y, w, h);
+}
+
 void DSWaylandZxdgPopupV6Private::zxdg_popup_v6_bind_resource(zxdg_popup_v6::Resource *resource)
 {
 }
index 84ec284..e6a190e 100644 (file)
@@ -105,6 +105,8 @@ public:
        void setSurface(DSWaylandSurface *surface) override;
        DSWaylandSurface *getSurface(void) override;
 
+       void sendConfigure(int x, int y, unsigned int w, unsigned int h) override;
+
        void setWindowTitle(const std::string &title);
        void setAppID(const std::string &appId);
 
@@ -123,6 +125,7 @@ public:
        virtual ~DSWaylandZxdgToplevelV6();
 
        void init(DSWaylandZxdgSurfaceV6 *zxdgSurface, struct ::wl_client *client, int id, int ver);
+       void sendConfigure(unsigned int w, unsigned int h);
 };
 
 class DSWaylandZxdgPopupV6 : public DSObject
@@ -135,6 +138,7 @@ public:
        virtual ~DSWaylandZxdgPopupV6();
 
        void init(DSWaylandZxdgSurfaceV6 *zxdgSurface, struct ::wl_client *client, int id, int ver);
+       void sendConfigure(int x, int y, unsigned int w, unsigned int h);
 };
 
 
index 6e85d1b..b76956b 100644 (file)
@@ -96,6 +96,8 @@ public:
        void setSurface(DSWaylandSurface *surface);
        DSWaylandSurface *getSurface(void);
 
+       void sendConfigure(int x, int y, unsigned int w, unsigned int h);
+
 protected:
         void zxdg_surface_v6_bind_resource(zxdg_surface_v6::Resource *resource) override;
         void zxdg_surface_v6_destroy_resource(zxdg_surface_v6::Resource *resource) override;
@@ -120,7 +122,8 @@ private:
        DSWaylandZxdgPopupV6 *__popup;
        DSWaylandZxdgSurfaceV6::Xdg_Surface_Role __role;
 
-        int __x, __y, __w, __h;
+        int __x, __y;
+               unsigned int __w, __h;
         std::string __title, __appId;
 };
 
@@ -133,6 +136,8 @@ public:
         DSWaylandZxdgToplevelV6Private(DSWaylandZxdgToplevelV6 *p_ptr);
         ~DSWaylandZxdgToplevelV6Private() override;
 
+       void sendConfigure(unsigned int w, unsigned int h);
+
 protected:
         void zxdg_toplevel_v6_bind_resource(zxdg_toplevel_v6::Resource *resource) override;
         void zxdg_toplevel_v6_destroy_resource(zxdg_toplevel_v6::Resource *resource) override;
@@ -165,6 +170,8 @@ public:
         DSWaylandZxdgPopupV6Private(DSWaylandZxdgPopupV6 *p_ptr);
         ~DSWaylandZxdgPopupV6Private() override;
 
+       void sendConfigure(int x, int y, unsigned int w, unsigned int h);
+
 protected:
         void zxdg_popup_v6_bind_resource(zxdg_popup_v6::Resource *resource) override;
         void zxdg_popup_v6_destroy_resource(zxdg_popup_v6::Resource *resource) override;
index 6983971..290efe0 100644 (file)
@@ -55,6 +55,8 @@ public:
 
        virtual void setSurface(DSWaylandSurface *surface) = 0;
        virtual DSWaylandSurface *getSurface(void) = 0;
+
+       virtual void sendConfigure(int x, int y, unsigned int w, unsigned int h) = 0;
 };
 
 
index 4ae3746..ac75535 100644 (file)
@@ -34,10 +34,13 @@ DSWindowPrivate::DSWindowPrivate(DSWindow *p_ptr)
          __p_ptr(p_ptr),
          __w(1),
          __h(1),
+         __committedW(0),
+         __committedH(0),
          __created(false),
          __hasFocus(false),
          __waylandSurface(nullptr),
-         __winShell(nullptr)
+         __winShell(nullptr),
+         __firstCommit(true)
 {
 }
 
@@ -116,17 +119,41 @@ DSWindowShell *DSWindowPrivate::getWindowShell(void)
        return __winShell;
 }
 
+void DSWindowPrivate::sendConfigure(void)
+{
+       if (__winShell)
+       {
+               __winShell->sendConfigure();
+       }
+}
+
 void DSWindowPrivate::__onSurfaceCommitted(std::shared_ptr<DSWaylandSurfaceCommitInfo> waylandSurfaceCommitInfo)
 {
        DS_GET_PUB(DSWindow);
 
+       if (__firstCommit)
+       {
+               DSLOG_DBG("DSWindow", "First Commit!!! Send Configure...");
+               sendConfigure();
+               __firstCommit = false;
+       }
+
        std::shared_ptr<IDSBuffer> buffer = waylandSurfaceCommitInfo->getBuffer();
        if (buffer) {
                // TODO: set the size of window with the size of commit information
                //       It could be changed by DSWindowShell policy later..
                std::shared_ptr<stSize> bufferSize = buffer->getSize();
-               __w = bufferSize->w;
-               __h = bufferSize->h;
+               __committedW = bufferSize->w;
+               __committedH = bufferSize->h;
+
+#if 1 // temporary code - we have to use policy to decide window's size.
+               if ((__committedW != __w) ||
+                   (__committedH != __h))
+               {
+                       DSLOG_ERR("DSWindow", "Committed size (%d,%d) is not same to requested size(%d,%d)", bufferSize->w, bufferSize->h, __w, __h);
+                       return;
+               }
+#endif
 
                // emit a signal of the buffer changed
                pub->__bufferChangedSignal.emit(buffer);
index c19592f..1650248 100644 (file)
@@ -60,15 +60,19 @@ public:
        bool setWindowShell(DSWindowShell *winShell);
        DSWindowShell *getWindowShell(void);
 
+       void sendConfigure(void);
+
 private:
        void __onSurfaceCommitted(std::shared_ptr<DSWaylandSurfaceCommitInfo> waylandSurfaceCommitInfo);
 
        unsigned int __w;
        unsigned int __h;
+       unsigned int __committedW, __committedH;
        bool __created;
        bool __hasFocus;
        std::shared_ptr<DSWaylandSurface> __waylandSurface;
        DSWindowShell *__winShell;
+       bool __firstCommit;
 };
 
 }
index 2f80857..c5a1d7b 100644 (file)
@@ -275,5 +275,12 @@ const char* DSWindowShell::getRole(void)
        return priv->getRole();
 }
 
+void DSWindowShell::sendConfigure(void)
+{
+       DS_GET_PRIV(DSWindowShell);
+
+       priv->sendConfigure();
+}
+
 
 } // namespace display_server
index ee4aa1e..10e131e 100644 (file)
@@ -92,6 +92,8 @@ public:
        bool setRole(const char *role);
        const char* getRole(void);
 
+       void sendConfigure(void);
+
 protected:
 
 private:
index 07746d4..d4d5ab7 100644 (file)
@@ -261,5 +261,12 @@ const char* DSWindowShellPrivate::getRole(void)
        return nullptr;
 }
 
+void DSWindowShellPrivate::sendConfigure(void)
+{
+       if (__shellSurface)
+       {
+               __shellSurface->sendConfigure(__x, __y, __w, __h);
+       }
+}
 
 } // namespace display_server
index 9a2e7ba..e16d3f0 100644 (file)
@@ -88,6 +88,8 @@ public:
        bool setRole(const char *role);
        const char* getRole(void);
 
+       void sendConfigure(void);
+
 private:
        bool __create(int x, int y, unsigned int w, unsigned int h, DSWindowShell *pWin, DSWindowShell *pParent);