summaryrefslogtreecommitdiffstats
path: root/tests/auto/client
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/client')
-rw-r--r--tests/auto/client/client.pro26
-rw-r--r--tests/auto/client/client/client.pro28
-rw-r--r--tests/auto/client/client/mockcompositor.cpp (renamed from tests/auto/client/mockcompositor.cpp)89
-rw-r--r--tests/auto/client/client/mockcompositor.h (renamed from tests/auto/client/mockcompositor.h)25
-rw-r--r--tests/auto/client/client/mockinput.cpp (renamed from tests/auto/client/mockinput.cpp)216
-rw-r--r--tests/auto/client/client/mockinput.h (renamed from tests/auto/client/mockinput.h)33
-rw-r--r--tests/auto/client/client/mockoutput.cpp (renamed from tests/auto/client/mockoutput.cpp)0
-rw-r--r--tests/auto/client/client/mockshell.cpp (renamed from tests/auto/client/mockshell.cpp)0
-rw-r--r--tests/auto/client/client/mocksurface.cpp (renamed from tests/auto/client/mocksurface.cpp)0
-rw-r--r--tests/auto/client/client/mocksurface.h (renamed from tests/auto/client/mocksurface.h)0
-rw-r--r--tests/auto/client/client/tst_client.cpp (renamed from tests/auto/client/tst_client.cpp)102
11 files changed, 490 insertions, 29 deletions
diff --git a/tests/auto/client/client.pro b/tests/auto/client/client.pro
index eaf6c6e95..916b3abe4 100644
--- a/tests/auto/client/client.pro
+++ b/tests/auto/client/client.pro
@@ -1,25 +1,3 @@
-CONFIG += testcase link_pkgconfig
-TARGET = tst_client
+TEMPLATE=subdirs
-QT += testlib
-QT += core-private gui-private
-
-!contains(QT_CONFIG, no-pkg-config) {
- PKGCONFIG += wayland-client wayland-server
-} else {
- LIBS += -lwayland-client -lwayland-server
-}
-
-CONFIG += wayland-scanner
-WAYLANDSERVERSOURCES += \
- ../../../src/3rdparty/protocol/wayland.xml
-
-SOURCES += tst_client.cpp \
- mockcompositor.cpp \
- mockinput.cpp \
- mockshell.cpp \
- mocksurface.cpp \
- mockoutput.cpp
-HEADERS += mockcompositor.h \
- mockinput.h \
- mocksurface.h \
+SUBDIRS += client
diff --git a/tests/auto/client/client/client.pro b/tests/auto/client/client/client.pro
new file mode 100644
index 000000000..006d130a0
--- /dev/null
+++ b/tests/auto/client/client/client.pro
@@ -0,0 +1,28 @@
+CONFIG += testcase link_pkgconfig
+TARGET = tst_client
+
+QT += testlib
+QT += core-private gui-private
+
+!contains(QT_CONFIG, no-pkg-config) {
+ PKGCONFIG += wayland-client wayland-server
+} else {
+ LIBS += -lwayland-client -lwayland-server
+}
+
+CONFIG += wayland-scanner
+WAYLANDSERVERSOURCES += \
+ ../../../../src/3rdparty/protocol/wayland.xml
+
+SOURCES += \
+ tst_client.cpp \
+ mockcompositor.cpp \
+ mockinput.cpp \
+ mockshell.cpp \
+ mocksurface.cpp \
+ mockoutput.cpp
+
+HEADERS += \
+ mockcompositor.h \
+ mockinput.h \
+ mocksurface.h
diff --git a/tests/auto/client/mockcompositor.cpp b/tests/auto/client/client/mockcompositor.cpp
index 4cea75ea2..45a35ea7d 100644
--- a/tests/auto/client/mockcompositor.cpp
+++ b/tests/auto/client/client/mockcompositor.cpp
@@ -117,6 +117,75 @@ void MockCompositor::sendKeyRelease(const QSharedPointer<MockSurface> &surface,
processCommand(command);
}
+void MockCompositor::sendTouchDown(const QSharedPointer<MockSurface> &surface, const QPoint &position, int id)
+{
+ Command command = makeCommand(Impl::Compositor::sendTouchDown, m_compositor);
+ command.parameters << QVariant::fromValue(surface) << position << id;
+ processCommand(command);
+}
+
+void MockCompositor::sendTouchMotion(const QSharedPointer<MockSurface> &surface, const QPoint &position, int id)
+{
+ Command command = makeCommand(Impl::Compositor::sendTouchMotion, m_compositor);
+ command.parameters << QVariant::fromValue(surface) << position << id;
+ processCommand(command);
+}
+
+void MockCompositor::sendTouchUp(const QSharedPointer<MockSurface> &surface, int id)
+{
+ Command command = makeCommand(Impl::Compositor::sendTouchUp, m_compositor);
+ command.parameters << QVariant::fromValue(surface) << id;
+ processCommand(command);
+}
+
+void MockCompositor::sendTouchFrame(const QSharedPointer<MockSurface> &surface)
+{
+ Command command = makeCommand(Impl::Compositor::sendTouchFrame, m_compositor);
+ command.parameters << QVariant::fromValue(surface);
+ processCommand(command);
+}
+
+void MockCompositor::sendDataDeviceDataOffer(const QSharedPointer<MockSurface> &surface)
+{
+ Command command = makeCommand(Impl::Compositor::sendDataDeviceDataOffer, m_compositor);
+ command.parameters << QVariant::fromValue(surface);
+ processCommand(command);
+}
+
+void MockCompositor::sendDataDeviceEnter(const QSharedPointer<MockSurface> &surface, const QPoint& position)
+{
+ Command command = makeCommand(Impl::Compositor::sendDataDeviceEnter, m_compositor);
+ command.parameters << QVariant::fromValue(surface) << QVariant::fromValue(position);
+ processCommand(command);
+}
+
+void MockCompositor::sendDataDeviceMotion(const QPoint &position)
+{
+ Command command = makeCommand(Impl::Compositor::sendDataDeviceMotion, m_compositor);
+ command.parameters << QVariant::fromValue(position);
+ processCommand(command);
+}
+
+void MockCompositor::sendDataDeviceDrop(const QSharedPointer<MockSurface> &surface)
+{
+ Command command = makeCommand(Impl::Compositor::sendDataDeviceDrop, m_compositor);
+ command.parameters << QVariant::fromValue(surface);
+ processCommand(command);
+}
+
+void MockCompositor::sendDataDeviceLeave(const QSharedPointer<MockSurface> &surface)
+{
+ Command command = makeCommand(Impl::Compositor::sendDataDeviceLeave, m_compositor);
+ command.parameters << QVariant::fromValue(surface);
+ processCommand(command);
+}
+
+void MockCompositor::waitForStartDrag()
+{
+ Command command = makeCommand(Impl::Compositor::waitForStartDrag, m_compositor);
+ processCommand(command);
+}
+
QSharedPointer<MockSurface> MockCompositor::surface()
{
QSharedPointer<MockSurface> result;
@@ -152,9 +221,16 @@ void MockCompositor::processCommand(const Command &command)
void MockCompositor::dispatchCommands()
{
- foreach (const Command &command, m_commandQueue)
+ lock();
+ int count = m_commandQueue.length();
+ unlock();
+
+ for (int i = 0; i < count; ++i) {
+ lock();
+ const Command command = m_commandQueue.takeFirst();
+ unlock();
command.callback(command.target, command.parameters);
- m_commandQueue.clear();
+ }
}
void *MockCompositor::run(void *data)
@@ -172,8 +248,11 @@ void *MockCompositor::run(void *data)
}
while (controller->m_alive) {
- QMutexLocker locker(&controller->m_mutex);
- controller->m_waitCondition.wait(&controller->m_mutex);
+ {
+ QMutexLocker locker(&controller->m_mutex);
+ if (controller->m_commandQueue.isEmpty())
+ controller->m_waitCondition.wait(&controller->m_mutex);
+ }
controller->dispatchCommands();
compositor.dispatchEvents(20);
}
@@ -185,6 +264,7 @@ namespace Impl {
Compositor::Compositor()
: m_display(wl_display_create())
+ , m_startDragSeen(false)
, m_time(0)
{
wl_list_init(&m_outputResources);
@@ -203,6 +283,7 @@ Compositor::Compositor()
m_seat.reset(new Seat(this, m_display));
m_pointer = m_seat->pointer();
m_keyboard = m_seat->keyboard();
+ m_touch = m_seat->touch();
wl_global_create(m_display, &wl_output_interface, 1, this, bindOutput);
wl_global_create(m_display, &wl_shell_interface, 1, this, bindShell);
diff --git a/tests/auto/client/mockcompositor.h b/tests/auto/client/client/mockcompositor.h
index 48b410698..dd6450fc9 100644
--- a/tests/auto/client/mockcompositor.h
+++ b/tests/auto/client/client/mockcompositor.h
@@ -47,6 +47,7 @@ typedef void (**Implementation)(void);
class Keyboard;
class Pointer;
+class Touch;
class Seat;
class DataDeviceManager;
class Surface;
@@ -75,6 +76,19 @@ public:
static void sendMouseRelease(void *data, const QList<QVariant> &parameters);
static void sendKeyPress(void *data, const QList<QVariant> &parameters);
static void sendKeyRelease(void *data, const QList<QVariant> &parameters);
+ static void sendTouchDown(void *data, const QList<QVariant> &parameters);
+ static void sendTouchUp(void *data, const QList<QVariant> &parameters);
+ static void sendTouchMotion(void *data, const QList<QVariant> &parameters);
+ static void sendTouchFrame(void *data, const QList<QVariant> &parameters);
+ static void sendDataDeviceDataOffer(void *data, const QList<QVariant> &parameters);
+ static void sendDataDeviceEnter(void *data, const QList<QVariant> &parameters);
+ static void sendDataDeviceMotion(void *data, const QList<QVariant> &parameters);
+ static void sendDataDeviceDrop(void *data, const QList<QVariant> &parameters);
+ static void sendDataDeviceLeave(void *data, const QList<QVariant> &parameters);
+ static void waitForStartDrag(void *data, const QList<QVariant> &parameters);
+
+public:
+ bool m_startDragSeen;
private:
static void bindCompositor(wl_client *client, void *data, uint32_t version, uint32_t id);
@@ -99,6 +113,7 @@ private:
QScopedPointer<Seat> m_seat;
Pointer *m_pointer;
Keyboard *m_keyboard;
+ Touch *m_touch;
QScopedPointer<DataDeviceManager> m_data_device_manager;
QVector<Surface *> m_surfaces;
};
@@ -141,6 +156,16 @@ public:
void sendMouseRelease(const QSharedPointer<MockSurface> &surface);
void sendKeyPress(const QSharedPointer<MockSurface> &surface, uint code);
void sendKeyRelease(const QSharedPointer<MockSurface> &surface, uint code);
+ void sendTouchDown(const QSharedPointer<MockSurface> &surface, const QPoint &position, int id);
+ void sendTouchMotion(const QSharedPointer<MockSurface> &surface, const QPoint &position, int id);
+ void sendTouchUp(const QSharedPointer<MockSurface> &surface, int id);
+ void sendTouchFrame(const QSharedPointer<MockSurface> &surface);
+ void sendDataDeviceDataOffer(const QSharedPointer<MockSurface> &surface);
+ void sendDataDeviceEnter(const QSharedPointer<MockSurface> &surface, const QPoint &position);
+ void sendDataDeviceMotion(const QPoint &position);
+ void sendDataDeviceDrop(const QSharedPointer<MockSurface> &surface);
+ void sendDataDeviceLeave(const QSharedPointer<MockSurface> &surface);
+ void waitForStartDrag();
QSharedPointer<MockSurface> surface();
diff --git a/tests/auto/client/mockinput.cpp b/tests/auto/client/client/mockinput.cpp
index a4d42c103..fe06bf79b 100644
--- a/tests/auto/client/mockinput.cpp
+++ b/tests/auto/client/client/mockinput.cpp
@@ -87,11 +87,128 @@ void Compositor::sendKeyRelease(void *data, const QList<QVariant> &parameters)
compositor->m_keyboard->sendKey(parameters.last().toUInt() - 8, 0);
}
+void Compositor::sendTouchDown(void *data, const QList<QVariant> &parameters)
+{
+ Compositor *compositor = static_cast<Compositor *>(data);
+ Surface *surface = resolveSurface(parameters.first());
+
+ Q_ASSERT(compositor);
+ Q_ASSERT(surface);
+
+ QPoint position = parameters.at(1).toPoint();
+ int id = parameters.at(2).toInt();
+
+ compositor->m_touch->sendDown(surface, position, id);
+}
+
+void Compositor::sendTouchUp(void *data, const QList<QVariant> &parameters)
+{
+ Compositor *compositor = static_cast<Compositor *>(data);
+ Surface *surface = resolveSurface(parameters.first());
+
+ Q_ASSERT(compositor);
+ Q_ASSERT(surface);
+
+ int id = parameters.at(1).toInt();
+
+ compositor->m_touch->sendUp(surface, id);
+}
+
+void Compositor::sendTouchMotion(void *data, const QList<QVariant> &parameters)
+{
+ Compositor *compositor = static_cast<Compositor *>(data);
+ Surface *surface = resolveSurface(parameters.first());
+
+ Q_ASSERT(compositor);
+ Q_ASSERT(surface);
+
+ QPoint position = parameters.at(1).toPoint();
+ int id = parameters.at(2).toInt();
+
+ compositor->m_touch->sendMotion(surface, position, id);
+}
+
+void Compositor::sendTouchFrame(void *data, const QList<QVariant> &parameters)
+{
+ Compositor *compositor = static_cast<Compositor *>(data);
+ Surface *surface = resolveSurface(parameters.first());
+
+ Q_ASSERT(compositor);
+ Q_ASSERT(surface);
+
+ compositor->m_touch->sendFrame(surface);
+}
+
+void Compositor::sendDataDeviceDataOffer(void *data, const QList<QVariant> &parameters)
+{
+ Compositor *compositor = static_cast<Compositor *>(data);
+ Surface *surface = resolveSurface(parameters.first());
+
+ Q_ASSERT(compositor);
+ Q_ASSERT(surface);
+
+ compositor->m_data_device_manager->dataDevice()->sendDataOffer(surface->resource()->client());
+}
+
+void Compositor::sendDataDeviceEnter(void *data, const QList<QVariant> &parameters)
+{
+ Compositor *compositor = static_cast<Compositor *>(data);
+ Surface *surface = resolveSurface(parameters.first());
+ QPoint position = parameters.at(1).toPoint();
+
+ Q_ASSERT(compositor);
+ Q_ASSERT(surface);
+
+ compositor->m_data_device_manager->dataDevice()->sendEnter(surface, position);
+}
+
+void Compositor::sendDataDeviceMotion(void *data, const QList<QVariant> &parameters)
+{
+ Compositor *compositor = static_cast<Compositor *>(data);
+ Q_ASSERT(compositor);
+ QPoint position = parameters.first().toPoint();
+ compositor->m_data_device_manager->dataDevice()->sendMotion(position);
+}
+
+void Compositor::sendDataDeviceDrop(void *data, const QList<QVariant> &parameters)
+{
+ Compositor *compositor = static_cast<Compositor *>(data);
+ Surface *surface = resolveSurface(parameters.first());
+
+ Q_ASSERT(compositor);
+ Q_ASSERT(surface);
+
+ compositor->m_data_device_manager->dataDevice()->sendDrop(surface);
+}
+
+void Compositor::sendDataDeviceLeave(void *data, const QList<QVariant> &parameters)
+{
+ Compositor *compositor = static_cast<Compositor *>(data);
+ Surface *surface = resolveSurface(parameters.first());
+
+ Q_ASSERT(compositor);
+ Q_ASSERT(surface);
+
+ compositor->m_data_device_manager->dataDevice()->sendLeave(surface);
+}
+
+void Compositor::waitForStartDrag(void *data, const QList<QVariant> &parameters)
+{
+ Compositor *compositor = static_cast<Compositor *>(data);
+ Q_ASSERT(compositor);
+ while (!compositor->m_startDragSeen) {
+ wl_display_flush_clients(compositor->m_display);
+ wl_event_loop_dispatch(compositor->m_loop, 100);
+ }
+ compositor->m_startDragSeen = false;
+}
+
Seat::Seat(Compositor *compositor, struct ::wl_display *display)
: wl_seat(display, 2)
, m_compositor(compositor)
, m_keyboard(new Keyboard(compositor))
, m_pointer(new Pointer(compositor))
+ , m_touch(new Touch(compositor))
{
}
@@ -101,7 +218,7 @@ Seat::~Seat()
void Seat::seat_bind_resource(Resource *resource)
{
- send_capabilities(resource->handle, capability_keyboard | capability_pointer);
+ send_capabilities(resource->handle, capability_keyboard | capability_pointer | capability_touch);
}
void Seat::seat_get_keyboard(Resource *resource, uint32_t id)
@@ -114,6 +231,11 @@ void Seat::seat_get_pointer(Resource *resource, uint32_t id)
m_pointer->add(resource->client(), id, resource->version());
}
+void Seat::seat_get_touch(Resource *resource, uint32_t id)
+{
+ m_touch->add(resource->client(), id, resource->version());
+}
+
Keyboard::Keyboard(Compositor *compositor)
: wl_keyboard()
, m_compositor(compositor)
@@ -214,18 +336,100 @@ void Pointer::pointer_destroy_resource(wl_pointer::Resource *resource)
m_focusResource = 0;
}
+Touch::Touch(Compositor *compositor)
+ : wl_touch()
+ , m_compositor(compositor)
+{
+}
+
+void Touch::sendDown(Surface *surface, const QPoint &position, int id)
+{
+ uint32_t serial = m_compositor->nextSerial();
+ uint32_t time = m_compositor->time();
+ Q_ASSERT(surface);
+ Resource *resource = resourceMap().value(surface->resource()->client());
+ Q_ASSERT(resource);
+ wl_touch_send_down(resource->handle, serial, time, surface->resource()->handle, id, position.x(), position.y());
+}
+
+void Touch::sendUp(Surface *surface, int id)
+{
+ Resource *resource = resourceMap().value(surface->resource()->client());
+ wl_touch_send_up(resource->handle, m_compositor->nextSerial(), m_compositor->time(), id);
+}
+
+void Touch::sendMotion(Surface *surface, const QPoint &position, int id)
+{
+ Resource *resource = resourceMap().value(surface->resource()->client());
+ uint32_t time = m_compositor->time();
+ wl_touch_send_motion(resource->handle, time, id, position.x(), position.y());
+}
+
+void Touch::sendFrame(Surface *surface)
+{
+ Resource *resource = resourceMap().value(surface->resource()->client());
+ wl_touch_send_frame(resource->handle);
+}
+
+DataOffer::DataOffer()
+ : wl_data_offer()
+{
+
+}
+
DataDevice::DataDevice(Compositor *compositor)
: wl_data_device()
, m_compositor(compositor)
+ , m_dataOffer(nullptr)
+ , m_focus(nullptr)
{
}
+void DataDevice::sendDataOffer(wl_client *client)
+{
+ m_dataOffer = new QtWaylandServer::wl_data_offer(client, 0, 1);
+ Resource *resource = resourceMap().value(client);
+ send_data_offer(resource->handle, m_dataOffer->resource()->handle);
+}
+
+void DataDevice::sendEnter(Surface *surface, const QPoint& position)
+{
+ uint serial = m_compositor->nextSerial();
+ m_focus = surface;
+ Resource *resource = resourceMap().value(surface->resource()->client());
+ send_enter(resource->handle, serial, surface->resource()->handle, position.x(), position.y(), m_dataOffer->resource()->handle);
+}
+
+void DataDevice::sendMotion(const QPoint &position)
+{
+ uint32_t time = m_compositor->time();
+ Resource *resource = resourceMap().value(m_focus->resource()->client());
+ send_motion(resource->handle, time, position.x(), position.y());
+}
+
+void DataDevice::sendDrop(Surface *surface)
+{
+ Resource *resource = resourceMap().value(surface->resource()->client());
+ send_drop(resource->handle);
+}
+
+void DataDevice::sendLeave(Surface *surface)
+{
+ Resource *resource = resourceMap().value(surface->resource()->client());
+ send_leave(resource->handle);
+}
+
DataDevice::~DataDevice()
{
}
+void DataDevice::data_device_start_drag(QtWaylandServer::wl_data_device::Resource *resource, wl_resource *source, wl_resource *origin, wl_resource *icon, uint32_t serial)
+{
+ m_compositor->m_startDragSeen = true;
+}
+
DataDeviceManager::DataDeviceManager(Compositor *compositor, wl_display *display)
: wl_data_device_manager(display, 1)
, m_compositor(compositor)
@@ -238,6 +442,11 @@ DataDeviceManager::~DataDeviceManager()
}
+DataDevice *DataDeviceManager::dataDevice() const
+{
+ return m_data_device.data();
+}
+
void DataDeviceManager::data_device_manager_get_data_device(Resource *resource, uint32_t id, struct ::wl_resource *seat)
{
if (!m_data_device)
@@ -245,4 +454,9 @@ void DataDeviceManager::data_device_manager_get_data_device(Resource *resource,
m_data_device->add(resource->client(), id, 1);
}
+void DataDeviceManager::data_device_manager_create_data_source(QtWaylandServer::wl_data_device_manager::Resource *resource, uint32_t id)
+{
+ new QtWaylandServer::wl_data_source(resource->client(), id, 1);
+}
+
}
diff --git a/tests/auto/client/mockinput.h b/tests/auto/client/client/mockinput.h
index eb9beb564..031be2a4a 100644
--- a/tests/auto/client/mockinput.h
+++ b/tests/auto/client/client/mockinput.h
@@ -51,17 +51,20 @@ public:
Keyboard *keyboard() const { return m_keyboard.data(); }
Pointer *pointer() const { return m_pointer.data(); }
+ Touch *touch() const { return m_touch.data(); }
protected:
void seat_bind_resource(Resource *resource) Q_DECL_OVERRIDE;
void seat_get_keyboard(Resource *resource, uint32_t id) Q_DECL_OVERRIDE;
void seat_get_pointer(Resource *resource, uint32_t id) Q_DECL_OVERRIDE;
+ void seat_get_touch(Resource *resource, uint32_t id) Q_DECL_OVERRIDE;
private:
Compositor *m_compositor;
QScopedPointer<Keyboard> m_keyboard;
QScopedPointer<Pointer> m_pointer;
+ QScopedPointer<Touch> m_touch;
};
class Keyboard : public QtWaylandServer::wl_keyboard
@@ -107,14 +110,42 @@ private:
Surface *m_focus;
};
+class Touch : public QtWaylandServer::wl_touch
+{
+public:
+ Touch(Compositor *compositor);
+ void sendDown(Surface *surface, const QPoint &position, int id);
+ void sendUp(Surface *surface, int id);
+ void sendMotion(Surface *surface, const QPoint &position, int id);
+ void sendFrame(Surface *surface);
+private:
+ Compositor *m_compositor;
+};
+
+class DataOffer : public QtWaylandServer::wl_data_offer
+{
+public:
+ DataOffer();
+};
+
class DataDevice : public QtWaylandServer::wl_data_device
{
public:
DataDevice(Compositor *compositor);
+ void sendDataOffer(wl_client *client);
+ void sendEnter(Surface *surface, const QPoint &position);
+ void sendMotion(const QPoint &position);
+ void sendDrop(Surface *surface);
+ void sendLeave(Surface *surface);
~DataDevice();
+protected:
+ void data_device_start_drag(Resource *resource, struct ::wl_resource *source, struct ::wl_resource *origin, struct ::wl_resource *icon, uint32_t serial) override;
+
private:
Compositor *m_compositor;
+ QtWaylandServer::wl_data_offer *m_dataOffer;
+ Surface* m_focus;
};
class DataDeviceManager : public QtWaylandServer::wl_data_device_manager
@@ -122,9 +153,11 @@ class DataDeviceManager : public QtWaylandServer::wl_data_device_manager
public:
DataDeviceManager(Compositor *compositor, struct ::wl_display *display);
~DataDeviceManager();
+ DataDevice *dataDevice() const;
protected:
void data_device_manager_get_data_device(Resource *resource, uint32_t id, struct ::wl_resource *seat) Q_DECL_OVERRIDE;
+ void data_device_manager_create_data_source(Resource *resource, uint32_t id) override;
private:
Compositor *m_compositor;
diff --git a/tests/auto/client/mockoutput.cpp b/tests/auto/client/client/mockoutput.cpp
index 86561976f..86561976f 100644
--- a/tests/auto/client/mockoutput.cpp
+++ b/tests/auto/client/client/mockoutput.cpp
diff --git a/tests/auto/client/mockshell.cpp b/tests/auto/client/client/mockshell.cpp
index d5eede22e..d5eede22e 100644
--- a/tests/auto/client/mockshell.cpp
+++ b/tests/auto/client/client/mockshell.cpp
diff --git a/tests/auto/client/mocksurface.cpp b/tests/auto/client/client/mocksurface.cpp
index 55712af11..55712af11 100644
--- a/tests/auto/client/mocksurface.cpp
+++ b/tests/auto/client/client/mocksurface.cpp
diff --git a/tests/auto/client/mocksurface.h b/tests/auto/client/client/mocksurface.h
index d04386ac8..d04386ac8 100644
--- a/tests/auto/client/mocksurface.h
+++ b/tests/auto/client/client/mocksurface.h
diff --git a/tests/auto/client/tst_client.cpp b/tests/auto/client/client/tst_client.cpp
index 9635c215f..74363ef5f 100644
--- a/tests/auto/client/tst_client.cpp
+++ b/tests/auto/client/client/tst_client.cpp
@@ -31,6 +31,10 @@
#include <QBackingStore>
#include <QPainter>
#include <QScreen>
+#include <QWindow>
+#include <QMimeData>
+#include <QPixmap>
+#include <QDrag>
#include <QtTest/QtTest>
@@ -46,6 +50,7 @@ public:
, keyReleaseEventCount(0)
, mousePressEventCount(0)
, mouseReleaseEventCount(0)
+ , touchEventCount(0)
, keyCode(0)
{
setSurfaceType(QSurface::RasterSurface);
@@ -86,12 +91,18 @@ public:
++mouseReleaseEventCount;
}
+ void touchEvent(QTouchEvent *event) Q_DECL_OVERRIDE
+ {
+ ++touchEventCount;
+ }
+
int focusInEventCount;
int focusOutEventCount;
int keyPressEventCount;
int keyReleaseEventCount;
int mousePressEventCount;
int mouseReleaseEventCount;
+ int touchEventCount;
uint keyCode;
QPoint mousePressPos;
@@ -129,6 +140,8 @@ private slots:
void createDestroyWindow();
void events();
void backingStore();
+ void touchDrag();
+ void mouseDrag();
private:
MockCompositor *compositor;
@@ -192,6 +205,15 @@ void tst_WaylandClient::events()
QCOMPARE(window.mouseReleaseEventCount, 0);
compositor->sendMouseRelease(surface);
QTRY_COMPARE(window.mouseReleaseEventCount, 1);
+
+ const int touchId = 0;
+ compositor->sendTouchDown(surface, QPoint(10, 10), touchId);
+ compositor->sendTouchFrame(surface);
+ QTRY_COMPARE(window.touchEventCount, 1);
+
+ compositor->sendTouchUp(surface, touchId);
+ compositor->sendTouchFrame(surface);
+ QTRY_COMPARE(window.touchEventCount, 2);
}
void tst_WaylandClient::backingStore()
@@ -230,6 +252,86 @@ void tst_WaylandClient::backingStore()
QTRY_VERIFY(surface->image.isNull());
}
+class DndWindow : public QWindow
+{
+ Q_OBJECT
+
+public:
+ DndWindow(QWindow *parent = 0)
+ : QWindow(parent)
+ , dragStarted(false)
+ {
+ QImage cursorImage(64,64,QImage::Format_ARGB32);
+ cursorImage.fill(Qt::blue);
+ m_dragIcon = QPixmap::fromImage(cursorImage);
+ }
+ ~DndWindow(){}
+ bool dragStarted;
+
+protected:
+ void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE
+ {
+ if (dragStarted)
+ return;
+ dragStarted = true;
+
+ QByteArray dataBytes;
+ QMimeData *mimeData = new QMimeData;
+ mimeData->setData("application/x-dnditemdata", dataBytes);
+ QDrag *drag = new QDrag(this);
+ drag->setMimeData(mimeData);
+ drag->setPixmap(m_dragIcon);
+ drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);
+ }
+private:
+ QPixmap m_dragIcon;
+};
+
+void tst_WaylandClient::touchDrag()
+{
+ DndWindow window;
+ window.show();
+
+ QSharedPointer<MockSurface> surface;
+ QTRY_VERIFY(surface = compositor->surface());
+
+ compositor->setKeyboardFocus(surface);
+ QTRY_COMPARE(QGuiApplication::focusWindow(), &window);
+
+ const int id = 0;
+ compositor->sendTouchDown(surface, QPoint(10, 10), id);
+ compositor->sendTouchMotion(surface, QPoint(20, 20), id);
+ compositor->sendTouchFrame(surface);
+ compositor->waitForStartDrag();
+ compositor->sendDataDeviceDataOffer(surface);
+ compositor->sendDataDeviceEnter(surface, QPoint(20, 20));
+ compositor->sendDataDeviceMotion( QPoint(21, 21));
+ compositor->sendDataDeviceDrop(surface);
+ compositor->sendDataDeviceLeave(surface);
+ QTRY_VERIFY(window.dragStarted);
+}
+
+void tst_WaylandClient::mouseDrag()
+{
+ DndWindow window;
+ window.show();
+
+ QSharedPointer<MockSurface> surface;
+ QTRY_VERIFY(surface = compositor->surface());
+
+ compositor->setKeyboardFocus(surface);
+ QTRY_COMPARE(QGuiApplication::focusWindow(), &window);
+
+ compositor->sendMousePress(surface, QPoint(10, 10));
+ compositor->sendDataDeviceDataOffer(surface);
+ compositor->sendDataDeviceEnter(surface, QPoint(20, 20));
+ compositor->sendDataDeviceMotion( QPoint(21, 21));
+ compositor->waitForStartDrag();
+ compositor->sendDataDeviceDrop(surface);
+ compositor->sendDataDeviceLeave(surface);
+ QTRY_VERIFY(window.dragStarted);
+}
+
int main(int argc, char **argv)
{
setenv("XDG_RUNTIME_DIR", ".", 1);