From 9f4dfc88e7e259b540dde3416ff4bdfea9df7a8c Mon Sep 17 00:00:00 2001 From: jeon Date: Sat, 29 Aug 2020 00:11:55 +0900 Subject: [PATCH] DSWaylandInputPanel: set keyboard window environment and size Change-Id: I05bf5853ba8de1fbbcf11a7dce5d02ab47403eec --- src/DSWaylandServer/DSWaylandInputPanel.cpp | 41 +++++++++++++++++++++++++++-- src/DSWaylandServer/DSWaylandInputPanel.h | 3 +++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/DSWaylandServer/DSWaylandInputPanel.cpp b/src/DSWaylandServer/DSWaylandInputPanel.cpp index f8b7d18..191fced 100644 --- a/src/DSWaylandServer/DSWaylandInputPanel.cpp +++ b/src/DSWaylandServer/DSWaylandInputPanel.cpp @@ -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 waylandSurfaceCommitInfo) +{ + if (!waylandSurfaceCommitInfo->bufferChanged()) + return; + + std::shared_ptr buffer = waylandSurfaceCommitInfo->getBuffer(); + std::shared_ptr 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) { } diff --git a/src/DSWaylandServer/DSWaylandInputPanel.h b/src/DSWaylandServer/DSWaylandInputPanel.h index f456580..f9f39fa 100644 --- a/src/DSWaylandServer/DSWaylandInputPanel.h +++ b/src/DSWaylandServer/DSWaylandInputPanel.h @@ -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 waylandSurfaceCommitInfo); void __onEventIdleEnterer(void *data); }; -- 2.7.4