#include "DSWaylandCompositor.h"
#include "DSWaylandTextInputManager.h"
#include "DSWaylandInputMethod.h"
+#include "DSWaylandInputPanel.h"
namespace display_server
{
__inputPanelState(InputPanelStateDidHide)
{
__wlCompositor = DSWaylandCompositor::getInstance();
- __wlTextInputManager = new DSWaylandTextInputManager(__wlCompositor, this);
__wlInputMethod = new DSWaylandInputMethod(__wlCompositor, this);
+ __wlInputPanel = new DSWaylandInputPanel(__wlCompositor, this);
+ __wlTextInputManager = new DSWaylandTextInputManager(__wlCompositor, this);
}
DSTextInputPrivate::~DSTextInputPrivate()
{
- delete __wlInputMethod;
delete __wlTextInputManager;
+ delete __wlInputPanel;
+ delete __wlInputMethod;
DSWaylandCompositor::releaseInstance();
}
__wlTextInputManager->contextCommitContent(serial, content, description, mimeTypes);
}
+void DSTextInputPrivate::updateInputPanelState(bool waitUpdate)
+{
+ __wlInputPanel->updateInputPanelState(waitUpdate);
+}
+
+void DSTextInputPrivate::setInputPanelTransientFor(DSWindow *window)
+{
+ __wlInputPanel->setTransientFor(window);
+}
+
+void DSTextInputPrivate::changeInputPanelVisibility(bool visible)
+{
+ __wlInputPanel->changeVisibility(visible);
+}
+
DSTextInput::DSTextInput()
: DS_INIT_PRIVATE_PTR(DSTextInput)
void contextInputPanelEvent(unsigned int serial, unsigned int eventType, unsigned int value);
void contextCommitContent(unsigned int serial, std::string content, std::string description, std::string mimeTypes);
+ /* DSWaylandInputPanel */
+ void updateInputPanelState(bool waitUpdate);
+ void setInputPanelTransientFor(DSWindow *window);
+ void changeInputPanelVisibility(bool visible);
+
private:
DSWaylandCompositor *__wlCompositor;
- DSWaylandTextInputManager *__wlTextInputManager;
DSWaylandInputMethod *__wlInputMethod;
+ DSWaylandInputPanel *__wlInputPanel;
+ DSWaylandTextInputManager *__wlTextInputManager;
InputPanelState __inputPanelState;
};
beforePos({0,0}), startPortraitPos({0,0}), startLandscapePos({0,0}), __inputPanel(inputPanel) {}
~DSWaylandInputPanelFloating() {}
+ void setPortraitPos(int x, int y) { startPortraitPos.x = x; startPortraitPos.y = y; initPortraitPos = true; }
+ void setLandscapePos(int x, int y) { startLandscapePos.x = x; startLandscapePos.y = y; initLandscapePos = true; }
+
bool movingRequest;
bool mousePressed;
bool initPortraitPos;
{
public:
DSWaylandInputPanelSurfaceData(DSWaylandServer::wl_input_panel_surface::Resource *resource, void *inputPanelResource, void *surfaceResource)
- : panel(false), showing(false), needShow(false),
+ : panel(false), showing(false), needShow(false), resizing(false),
__resource(resource), __inputPanelResource(inputPanelResource), __surfaceResource(surfaceResource) {}
~DSWaylandInputPanelSurfaceData() {}
bool panel;
bool showing;
bool needShow;
+ bool resizing;
private:
DSWaylandServer::wl_input_panel_surface::Resource *__resource;
DSWaylandInputPanel::DSWaylandInputPanel(DSWaylandCompositor *compositor)
: DSObject(), _d_ptr(std::make_unique<DSWaylandInputPanelPrivate>(this, compositor)),
__compositor(compositor),
+ __dsTextInputPrivate(nullptr),
+ __eventLoop(nullptr),
+ __waitUpdate(false),
+ __rerunPanelShow(false)
+{
+ __inputPanelSurface = new DSWaylandInputPanelSurface(__compositor, this);
+ __inputPanelFloating = new DSWaylandInputPanelFloating(this);
+
+ __eventLoop = DSEventLoop::getInstance();
+ __eventLoop->registerCallbackIdleEnterer(this, std::bind(&DSWaylandInputPanel::__onEventIdleEnterer, this, std::placeholders::_1));
+}
+
+DSWaylandInputPanel::DSWaylandInputPanel(DSWaylandCompositor *compositor, DSTextInputPrivate *dsTextInputPrivate)
+ : DSObject(), _d_ptr(std::make_unique<DSWaylandInputPanelPrivate>(this, compositor)),
+ __compositor(compositor),
+ __dsTextInputPrivate(dsTextInputPrivate),
__eventLoop(nullptr),
- __waitUpdate(false)
+ __waitUpdate(false),
+ __rerunPanelShow(false)
{
__inputPanelSurface = new DSWaylandInputPanelSurface(__compositor, this);
__inputPanelFloating = new DSWaylandInputPanelFloating(this);
__eventLoop->registerCallbackIdleEnterer(this, std::bind(&DSWaylandInputPanel::__onEventIdleEnterer, this, std::placeholders::_1));
}
+
DSWaylandInputPanel::~DSWaylandInputPanel()
{
DSEventLoop::releaseInstance();
}
}
+bool DSWaylandInputPanel::getRerunPanelShow()
+{
+ return __rerunPanelShow;
+}
+
+void DSWaylandInputPanel::setRerunPanelShow(bool needShow)
+{
+ __rerunPanelShow = needShow;
+}
+
void DSWaylandInputPanel::setFloatingMovingRequest(bool enabled)
{
if (!__inputPanelFloating) return;
__inputPanelFloating->movingRequest = enabled;
}
+void DSWaylandInputPanel::setTransientFor(DSWindow *parent)
+{
+ DSWindow *curParent = parent;
+ if (curParent)
+ {
+ /* TODO:
+ * if curParent->remoteSurface.onScreenParent
+ * curParent = curParent->remoteSurface.onScreenParent
+ */
+ }
+
+ __inputPanelSurface->setTransientForSurface(curParent);
+}
+
+void DSWaylandInputPanel::changeVisibility(bool visible)
+{
+ __rerunPanelShow = visible;
+ //vconf_set_int (VCONFKEY_ISF_INPUT_PANEL_STATE, visible ? VCONFKEY_ISF_INPUT_PANEL_STATE_SHOW : VCONFKEY_ISF_INPUT_PANEL_STATE_HIDE);
+ __inputPanelSurface->updateSurfaceVisibility(visible);
+ /* TODO: delete waitTimer */
+}
+
+bool DSWaylandInputPanel::isEffectRunning(DSWindow *window)
+{
+ /* TODO:
+ * if window is animating
+ * return true
+ */
+ return false;
+}
+
+void DSWaylandInputPanel::setFloatingPosition(int x, int y)
+{
+ __inputPanelSurface->setFloatingPosition(x, y);
+}
+
+DSWaylandInputPanelFloating* DSWaylandInputPanel::getFloatingData()
+{
+ return __inputPanelFloating;
+}
+
void DSWaylandInputPanel::__onEventIdleEnterer(void *data)
{
}
}
}
+void DSWaylandInputPanelSurfacePrivate::directShow(DSWaylandInputPanelSurfaceData *surfaceData)
+{
+ DS_GET_PUB(DSWaylandInputPanelSurface);
+
+ pub->setPosition(nullptr, 0, 0); /* FIXME: set correct value */
+
+ /* TODO: change window geometry */
+}
+
+void DSWaylandInputPanelSurfacePrivate::setTransientForSurface(DSWindow *parent)
+{
+ for (auto it = __dataMap.begin(); it != __dataMap.end(); it++)
+ {
+ //DSWaylandInputPanelSurfaceData *surfaceData = (*it).second;
+ /* TODO:
+ * child = surfaceData->getSurfaceResource();
+ * if child->parent
+ * {
+ * if child->parent != parent
+ * {
+ * remove child in child->parent->transients list
+ * child->parent = nullptr
+ * }
+ * }
+ * if parent != child && parent != child->parent
+ * {
+ * add child in child->parent->transients list
+ * child->parent = parent;
+ * }
+ * if (parent)
+ * {
+ * child->icccm.fetch.transientFor = true;
+ * child->icccm.transientFor = parent->id;
+ * }
+ * else
+ * {
+ * child->icccm.fetch.transientFor = false;
+ * child->icccm.transientFor = 0;
+ * }
+ * mark window changedr
+ */
+ }
+}
+
+void DSWaylandInputPanelSurfacePrivate::updateSurfaceVisibility(bool visible)
+{
+ for (auto it = __dataMap.begin(); it != __dataMap.end(); it++)
+ {
+ DSWaylandInputPanelSurfaceData *surfaceData = (*it).second;
+ surfaceData->showing = visible;
+ __updateSurfaceVisibility(surfaceData);
+ }
+}
+
+void DSWaylandInputPanelSurfacePrivate::setFloatingPosition(int x, int y)
+{
+ DS_GET_PUB(DSWaylandInputPanelSurface);
+ DSWaylandInputPanelSurfaceData *floatingData = nullptr;
+ DSWaylandInputPanelFloating *inputPanelFloating;
+ int curAngle = 0;
+
+ for (auto it = __dataMap.begin(); it != __dataMap.end(); it++)
+ {
+ //DSWaylandInputPanelSurfaceData *surfaceData = (*it).second;
+
+ /* TODO:
+ * if vkbd.floating
+ * floatingData = surfaceData
+ */
+ }
+
+ inputPanelFloating = pub->__inputPanel->getFloatingData();
+
+ if (!floatingData || !inputPanelFloating) return;
+
+ /* TODO:
+ * if (floatingData->showing)
+ * curAngle = get ec angle
+ * else
+ * curAngle = get zone angle
+ */
+
+ switch (curAngle)
+ {
+ case 90:
+ case 270:
+ inputPanelFloating->setLandscapePos(x, y);
+ //__inputPanelFloating->startLandscapePos.x = x;
+ //__inputPanelFloating->startLandscapePos.y = y;
+ //__inputPanelFloating->initLandscapePos = true;
+ break;
+// case 0:
+// case 180:
+ default:
+ inputPanelFloating->setPortraitPos(x, y);
+ //__inputPanelFloating->startPortraitPos.x = x;
+ //__inputPanelFloating->startPortraitPos.y = y;
+ //__inputPanelFloating->initPortraitPos = true;
+ break;
+ }
+
+ if (floatingData->showing)
+ pub->setPosition(nullptr, 0, 0); /* FIXME: set correct window and data */
+}
+
void DSWaylandInputPanelSurfacePrivate::input_panel_surface_destroy_resource(Resource *resource)
{
auto it = __dataMap.find(resource);
if (it != __dataMap.end())
{
DSWaylandInputPanelSurfaceData *surfaceData = (*it).second;
- /* TODO: find Window and update base_output resolution */
+ /* TODO: find DSWindow and update base_output resolution */
show(surfaceData);
}
}
void DSWaylandInputPanelSurfacePrivate::input_panel_surface_set_floating_panel(Resource *resource, uint32_t state)
{
/* TODO:
- * set Window's vkbd.floating = !!state
+ * set DSWindow's vkbd.floating = !!state
* if true
* policy_conformant_part_del
* else
pub->__inputPanel->setFloatingMovingRequest(!!enabled);
}
+void DSWaylandInputPanelSurfacePrivate::__updateSurfaceVisibility(DSWaylandInputPanelSurfaceData *surfaceData)
+{
+ DS_GET_PUB(DSWaylandInputPanelSurface);
+
+ if (surfaceData->showing) /* TODO: check pixmap is usable too*/
+ {
+ if (pub->__inputPanel->getRerunPanelShow())
+ pub->__inputPanel->setRerunPanelShow(false);
+ if (pub->isEffectRunning(nullptr)) // FIXME: change this to get window surfaceData->getDSWindow()
+ surfaceData->needShow = true;
+ else if (surfaceData->resizing)
+ surfaceData->needShow = true;
+ else
+ {
+ directShow(surfaceData);
+ surfaceData->needShow = false;
+ }
+ }
+ else
+ {
+ /* TODO:
+ * change window's property
+ */
+ surfaceData->needShow = false;
+ }
+}
+
DSWaylandInputPanelSurface::DSWaylandInputPanelSurface(DSWaylandCompositor *compositor, DSWaylandInputPanel *inputPanel)
: DSObject(), _d_ptr(std::make_unique<DSWaylandInputPanelSurfacePrivate>(this, compositor)),
priv->flushFrame();
}
+void DSWaylandInputPanelSurface::setTransientForSurface(DSWindow *parent)
+{
+ DS_GET_PRIV(DSWaylandInputPanelSurface);
+
+ priv->setTransientForSurface(parent);
+}
+
+void DSWaylandInputPanelSurface::updateSurfaceVisibility(bool visible)
+{
+ DS_GET_PRIV(DSWaylandInputPanelSurface);
+
+ priv->updateSurfaceVisibility(visible);
+}
+
+bool DSWaylandInputPanelSurface::isEffectRunning(DSWindow *window)
+{
+ return __inputPanel->isEffectRunning(window);
+}
+
+void DSWaylandInputPanelSurface::setPosition(DSWindow *window, int width, int height)
+{
+}
+
+void DSWaylandInputPanelSurface::setFloatingPosition(int x, int y)
+{
+ DS_GET_PRIV(DSWaylandInputPanelSurface);
+
+ priv->setFloatingPosition(x, y);
+}
+
+
}
#include "DSObject.h"
#include "DSWaylandCompositor.h"
#include "DSEventLoop.h"
+#include "DSTextInputPrivate.h"
+#include "DSWindow.h"
namespace display_server
{
DS_PIMPL_USE_PRIVATE(DSWaylandInputPanel);
public:
DSWaylandInputPanel(DSWaylandCompositor *compositor);
+ DSWaylandInputPanel(DSWaylandCompositor *compositor, DSTextInputPrivate *dsTextInputPrivate);
~DSWaylandInputPanel() override;
void createSurface(void *client, void *inputPanelResource, unsigned int id, void *surface);
bool getWaitUpdate();
void setWaitUpdate(bool waitUpdate);
void updateInputPanelState(bool waitUpdate);
+ bool getRerunPanelShow();
+ void setRerunPanelShow(bool needShow);
void setFloatingMovingRequest(bool enabled);
-
-protected:
+ void setTransientFor(DSWindow *parent);
+ void changeVisibility(bool visible);
+ bool isEffectRunning(DSWindow *window);
+ void setFloatingPosition(int x, int y);
+ DSWaylandInputPanelFloating *getFloatingData();
private:
DSWaylandCompositor *__compositor;
+ DSTextInputPrivate *__dsTextInputPrivate;
DSEventLoop *__eventLoop;
DSWaylandInputPanelSurface *__inputPanelSurface;
DSWaylandInputPanelFloating *__inputPanelFloating;
bool __waitUpdate;
+ bool __rerunPanelShow;
void __onEventIdleEnterer(void *data);
};
#include "DSCore.h"
#include "DSObject.h"
#include "DSWaylandInputPanel.h"
+#include "DSWindow.h"
namespace display_server
{
void createGlobal(void *client, void *inputPanelResource, unsigned int id, void *surface);
void clearGlobals(void *inputPanelResource);
void flushFrame();
+ void setTransientForSurface(DSWindow *parent);
+ void updateSurfaceVisibility(bool visible);
+ bool isEffectRunning(DSWindow *window);
+ void setPosition(DSWindow *window, int width, int height);
+ void setFloatingPosition(int x, int y);
protected:
void clearGlobals(void *inputPanelResource);
void show(DSWaylandInputPanelSurfaceData *surfaceData);
+ void directShow(DSWaylandInputPanelSurfaceData *surfaceData);
void flushFrame();
+ void setTransientForSurface(DSWindow *parent);
+ void updateSurfaceVisibility(bool visible);
+ void setFloatingPosition(int x, int y);
protected:
void input_panel_surface_destroy_resource(Resource *resource);
private:
DSWaylandCompositor *__compositor;
std::multimap<Resource*, DSWaylandInputPanelSurfaceData *> __dataMap;
+
+ void __updateSurfaceVisibility(DSWaylandInputPanelSurfaceData *surfaceData);
};
}
{
pub->__dsTextInputPrivate->showInputPanel(pub, id);
__showClient = privateResource->client();
- /* TODO: inputpanel wait update set */
+ pub->__dsTextInputPrivate->updateInputPanelState(true);
if (pub->__dsTextInputPrivate->getInputPanelState() == DSTextInputPrivate::InputPanelStateWillHide)
{
send_private_command(privateResource->handle, 0, "CONFORMANT_RESTORE");
}
pub->__dsTextInputPrivate->setInputPanelState(DSTextInputPrivate::InputPanelStateWillShow);
- /* TODO: inputpanel transient for set */
+ /* TODO: pub->__dsTextInputPrivate->setInputPanelTransientFor(getDSWindow(__activatedResource)); */
}
}
if (forceHide)
{
- /* TODO: Control inputpanel visible status */
+ pub->__dsTextInputPrivate->changeInputPanelVisibility(false);
+ pub->__dsTextInputPrivate->setInputPanelTransientFor(nullptr);
pub->__dsTextInputPrivate->setInputPanelState(DSTextInputPrivate::InputPanelStateDidHide);
}
else
/* TODO: will hide timer control */
if (pub->__dsTextInputPrivate->getInputPanelState() == DSTextInputPrivate::InputPanelStateWillHide)
{
- /* TODO: input panel visibility control */
+ pub->__dsTextInputPrivate->changeInputPanelVisibility(false);
+ pub->__dsTextInputPrivate->setInputPanelTransientFor(nullptr);
pub->__dsTextInputPrivate->setInputPanelState(DSTextInputPrivate::InputPanelStateDidShow);
}
}
DSWaylandCompositor::releaseInstance();
}
+TEST_F(DSWaylandInputPanelTest, GetSetRerunPanelShow)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ EXPECT_TRUE(inputPanel != nullptr);
+
+ inputPanel->setRerunPanelShow(true);
+ EXPECT_TRUE(true == inputPanel->getRerunPanelShow());
+
+ inputPanel->setRerunPanelShow(false);
+ EXPECT_TRUE(false == inputPanel->getRerunPanelShow());
+
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+
+TEST_F(DSWaylandInputPanelTest, SetTransientFor)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ EXPECT_TRUE(inputPanel != nullptr);
+
+ inputPanel->setTransientFor(nullptr);
+
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+
+TEST_F(DSWaylandInputPanelTest, ChangeVisibility)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ EXPECT_TRUE(inputPanel != nullptr);
+
+ inputPanel->changeVisibility(true);
+
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+
+TEST_F(DSWaylandInputPanelTest, IsEffectRunning)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ EXPECT_TRUE(inputPanel != nullptr);
+
+ inputPanel->isEffectRunning(nullptr);
+
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+
+TEST_F(DSWaylandInputPanelTest, SetFloatingPosition)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ EXPECT_TRUE(inputPanel != nullptr);
+
+ inputPanel->setFloatingPosition(0, 0);
+
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+
+TEST_F(DSWaylandInputPanelTest, GetFloatingData)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ EXPECT_TRUE(inputPanel != nullptr);
+
+ auto floatingData = inputPanel->getFloatingData();
+
+ EXPECT_TRUE(floatingData != nullptr);
+
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+
DSWaylandCompositor::releaseInstance();
}
+TEST_F(DSWaylandInputPanelSurfaceTest, SetTransientForSurface)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ DSWaylandInputPanelSurface *inputPanelSurface = new DSWaylandInputPanelSurface(comp, inputPanel);
+ EXPECT_TRUE(inputPanelSurface != nullptr);
+
+ inputPanelSurface->setTransientForSurface(nullptr);
+
+ delete inputPanelSurface;
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+
+TEST_F(DSWaylandInputPanelSurfaceTest, UpdateSurfaceVisibility)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ DSWaylandInputPanelSurface *inputPanelSurface = new DSWaylandInputPanelSurface(comp, inputPanel);
+ EXPECT_TRUE(inputPanelSurface != nullptr);
+
+ inputPanelSurface->updateSurfaceVisibility(true);
+
+ delete inputPanelSurface;
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+
+TEST_F(DSWaylandInputPanelSurfaceTest, SsEffectRunning)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ DSWaylandInputPanelSurface *inputPanelSurface = new DSWaylandInputPanelSurface(comp, inputPanel);
+ EXPECT_TRUE(inputPanelSurface != nullptr);
+
+ inputPanelSurface->isEffectRunning(nullptr);
+
+ delete inputPanelSurface;
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+
+TEST_F(DSWaylandInputPanelSurfaceTest, SetPosition)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ DSWaylandInputPanelSurface *inputPanelSurface = new DSWaylandInputPanelSurface(comp, inputPanel);
+ EXPECT_TRUE(inputPanelSurface != nullptr);
+
+ inputPanelSurface->setPosition(nullptr, 0, 0);
+
+ delete inputPanelSurface;
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+
+TEST_F(DSWaylandInputPanelSurfaceTest, SetFloatingPosition)
+{
+ DSWaylandCompositor *comp = DSWaylandCompositor::getInstance();
+ DSWaylandInputPanel *inputPanel = new DSWaylandInputPanel(comp);
+ DSWaylandInputPanelSurface *inputPanelSurface = new DSWaylandInputPanelSurface(comp, inputPanel);
+ EXPECT_TRUE(inputPanelSurface != nullptr);
+
+ inputPanelSurface->setFloatingPosition(0, 0);
+
+ delete inputPanelSurface;
+ delete inputPanel;
+ DSWaylandCompositor::releaseInstance();
+}
+