DSWaylandInputPanel: set keyboard window environment and size 91/242791/1
authorjeon <jhyuni.kang@samsung.com>
Fri, 28 Aug 2020 15:11:55 +0000 (00:11 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Tue, 1 Sep 2020 01:29:54 +0000 (10:29 +0900)
Change-Id: I05bf5853ba8de1fbbcf11a7dce5d02ab47403eec

src/DSWaylandServer/DSWaylandInputPanel.cpp
src/DSWaylandServer/DSWaylandInputPanel.h

index f8b7d18..191fced 100644 (file)
@@ -28,6 +28,7 @@
 #include "DSWaylandSurface.h"
 #include "DSStruct.h"
 #include "DSWindowManager.h"
+#include "IDSBuffer.h"
 
 namespace display_server {
 
@@ -116,7 +117,8 @@ DSWaylandInputPanel::DSWaylandInputPanel(DSWaylandCompositor *compositor)
          __dsTextInputPrivate(nullptr),
          __eventLoop(nullptr),
          __waitUpdate(false),
-         __rerunPanelShow(false)
+         __rerunPanelShow(false),
+         __wlSurface(nullptr)
 {
        __inputPanelSurface = new DSWaylandInputPanelSurface(__compositor, this);
        __inputPanelFloating = new DSWaylandInputPanelFloating(this);
@@ -131,7 +133,8 @@ DSWaylandInputPanel::DSWaylandInputPanel(DSWaylandCompositor *compositor, DSText
          __dsTextInputPrivate(dsTextInputPrivate),
          __eventLoop(nullptr),
          __waitUpdate(false),
-         __rerunPanelShow(false)
+         __rerunPanelShow(false),
+         __wlSurface(nullptr)
 {
        __inputPanelSurface = new DSWaylandInputPanelSurface(__compositor, this);
        __inputPanelFloating = new DSWaylandInputPanelFloating(this);
@@ -153,6 +156,21 @@ void DSWaylandInputPanel::createSurface(void *client, void *inputPanelResource,
        __inputPanelSurface->createGlobal(client, inputPanelResource, id, surface);
 
        /* TODO: Find window from surface and set some data */
+       DSWaylandSurface *wlSurface = DSWaylandSurface::fromWlResource((struct ::wl_resource *)surface);
+       __wlSurface = wlSurface;
+
+       if (!wlSurface)
+       {
+               DSLOG_WRN("DSWaylandInputPanel", "%p wl_surface has no DSWaylandSurface", surface);
+               return;
+       }       
+
+       DSWindowManager *windowManager = DSWindowManager::getInstance();
+       windowManager->setWindowTitle(wlSurface, "Keyboard");
+       windowManager->setWindowAllowUserGeometry(wlSurface, true);
+       windowManager->releaseInstance();
+
+       wlSurface->registerCallbackSurfaceCommitted(this, std::bind(&DSWaylandInputPanel::__onSurfaceCommitted, this, std::placeholders::_1));
 }
 
 void DSWaylandInputPanel::clearSurfaces(void *inputPanelResource)
@@ -263,6 +281,25 @@ DSWaylandSurface *DSWaylandInputPanel::getTextInputSurface()
        return __dsTextInputPrivate->getTextInputSurface();
 }
 
+void DSWaylandInputPanel::__onSurfaceCommitted(std::shared_ptr<DSWaylandSurfaceCommitInfo> waylandSurfaceCommitInfo)
+{
+       if (!waylandSurfaceCommitInfo->bufferChanged())
+               return;
+
+       std::shared_ptr<IDSBuffer> buffer = waylandSurfaceCommitInfo->getBuffer();
+       std::shared_ptr<stSize> bufferSize = buffer->getSize();
+
+       DSWindowManager *windowManager = DSWindowManager::getInstance();
+       stGeometry geo = windowManager->getWindowGeometry(__wlSurface);
+
+       /* FIXME: This calc is only for 0 angle. Use others calc if window is rotated */
+       int nx = geo.x + (geo.w - bufferSize->w) / 2;
+       int ny = geo.y + geo.h - bufferSize->h;
+
+       windowManager->setWindowGeometry(__wlSurface, nx, ny, bufferSize->w, bufferSize->h);
+       windowManager->releaseInstance();
+}
+
 void DSWaylandInputPanel::__onEventIdleEnterer(void *data)
 {
 }
index f456580..f9f39fa 100644 (file)
@@ -38,6 +38,7 @@ class DSWaylandInputPanelPrivate;
 class DSWaylandInputPanelSurface;
 class DSWaylandInputPanelFloating;
 class DSWaylandSurface;
+class DSWaylandSurfaceCommitInfo;
 
 class DS_DECL_EXPORT DSWaylandInputPanel : public DSObject
 {
@@ -73,7 +74,9 @@ private:
        DSWaylandInputPanelFloating *__inputPanelFloating;
        bool __waitUpdate;
        bool __rerunPanelShow;
+       DSWaylandSurface *__wlSurface;
 
+       void __onSurfaceCommitted(std::shared_ptr<DSWaylandSurfaceCommitInfo> waylandSurfaceCommitInfo);
        void __onEventIdleEnterer(void *data);
 };