diff options
author | Liang Qi <liang.qi@qt.io> | 2016-08-28 10:09:27 +0200 |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@gmail.com> | 2016-08-28 10:12:09 +0200 |
commit | b0c416dede8b6ca596eb2a13361d98613e8c9533 (patch) | |
tree | adddaa3622e0013858355ad6994c8e6e892ce254 /tests | |
parent | 9610eccdf237c5ffc21630cee9c364d0fe871901 (diff) | |
parent | ae9bfd29b42156fb8f04dfa60b9e48ce10ebacb8 (diff) | |
download | qtwayland-b0c416dede8b6ca596eb2a13361d98613e8c9533.tar.gz |
Merge remote-tracking branch 'qt/5.7' into 5.8v5.8.0-alpha1
Conflicts:
src/compositor/compositor_api/qwaylandseat.cpp
src/compositor/compositor_api/qwaylandview.cpp
tests/auto/compositor/compositor.pro
tests/auto/compositor/compositor/testinputdevice.cpp
tests/auto/compositor/compositor/testinputdevice.h
tests/auto/compositor/testinputdevice.cpp
tests/auto/compositor/testinputdevice.h
tests/auto/compositor/testseat.cpp
tests/auto/compositor/testseat.h
Change-Id: I98e045908dd964e5d4120bd35e71b8839c0d923a
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/client/client.pro | 26 | ||||
-rw-r--r-- | tests/auto/client/client/client.pro | 28 | ||||
-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 | ||||
-rw-r--r-- | tests/auto/compositor/compositor.pro | 39 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/BLACKLIST (renamed from tests/auto/compositor/BLACKLIST) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/compositor.pro | 40 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/mockclient.cpp (renamed from tests/auto/compositor/mockclient.cpp) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/mockclient.h (renamed from tests/auto/compositor/mockclient.h) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/mockseat.cpp (renamed from tests/auto/compositor/mockseat.cpp) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/mockseat.h (renamed from tests/auto/compositor/mockseat.h) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/testcompositor.cpp (renamed from tests/auto/compositor/testcompositor.cpp) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/testcompositor.h (renamed from tests/auto/compositor/testcompositor.h) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/testkeyboardgrabber.cpp (renamed from tests/auto/compositor/testkeyboardgrabber.cpp) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/testkeyboardgrabber.h (renamed from tests/auto/compositor/testkeyboardgrabber.h) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/testseat.cpp (renamed from tests/auto/compositor/testseat.cpp) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/testseat.h (renamed from tests/auto/compositor/testseat.h) | 0 | ||||
-rw-r--r-- | tests/auto/compositor/compositor/tst_compositor.cpp (renamed from tests/auto/compositor/tst_compositor.cpp) | 0 | ||||
-rw-r--r-- | tests/global/.gitignore | 1 |
26 files changed, 533 insertions, 66 deletions
diff --git a/tests/auto/client/client.pro b/tests/auto/client/client.pro index eaf6c6e9..916b3abe 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 00000000..006d130a --- /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 4cea75ea..45a35ea7 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 48b41069..dd6450fc 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> ¶meters); static void sendKeyPress(void *data, const QList<QVariant> ¶meters); static void sendKeyRelease(void *data, const QList<QVariant> ¶meters); + static void sendTouchDown(void *data, const QList<QVariant> ¶meters); + static void sendTouchUp(void *data, const QList<QVariant> ¶meters); + static void sendTouchMotion(void *data, const QList<QVariant> ¶meters); + static void sendTouchFrame(void *data, const QList<QVariant> ¶meters); + static void sendDataDeviceDataOffer(void *data, const QList<QVariant> ¶meters); + static void sendDataDeviceEnter(void *data, const QList<QVariant> ¶meters); + static void sendDataDeviceMotion(void *data, const QList<QVariant> ¶meters); + static void sendDataDeviceDrop(void *data, const QList<QVariant> ¶meters); + static void sendDataDeviceLeave(void *data, const QList<QVariant> ¶meters); + static void waitForStartDrag(void *data, const QList<QVariant> ¶meters); + +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 a4d42c10..fe06bf79 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> ¶meters) compositor->m_keyboard->sendKey(parameters.last().toUInt() - 8, 0); } +void Compositor::sendTouchDown(void *data, const QList<QVariant> ¶meters) +{ + 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> ¶meters) +{ + 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> ¶meters) +{ + 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> ¶meters) +{ + 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> ¶meters) +{ + 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> ¶meters) +{ + 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> ¶meters) +{ + 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> ¶meters) +{ + 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> ¶meters) +{ + 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> ¶meters) +{ + 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 eb9beb56..031be2a4 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 86561976..86561976 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 d5eede22..d5eede22 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 55712af1..55712af1 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 d04386ac..d04386ac 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 9635c215..74363ef5 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); diff --git a/tests/auto/compositor/compositor.pro b/tests/auto/compositor/compositor.pro index 50378c6d..6bf2aef6 100644 --- a/tests/auto/compositor/compositor.pro +++ b/tests/auto/compositor/compositor.pro @@ -1,38 +1,3 @@ -CONFIG += testcase link_pkgconfig -CONFIG += wayland-scanner -TARGET = tst_compositor +TEMPLATE=subdirs -QT += testlib -QT += core-private gui-private waylandcompositor waylandcompositor-private - -!contains(QT_CONFIG, no-pkg-config) { - PKGCONFIG += wayland-client wayland-server -} else { - LIBS += -lwayland-client -lwayland-server -} - -config_xkbcommon { - !contains(QT_CONFIG, no-pkg-config) { - PKGCONFIG_PRIVATE += xkbcommon - } else { - LIBS_PRIVATE += -lxkbcommon - } -} else { - DEFINES += QT_NO_WAYLAND_XKB -} - -WAYLANDCLIENTSOURCES += \ - ../../../src/3rdparty/protocol/xdg-shell.xml \ - -SOURCES += tst_compositor.cpp \ - testcompositor.cpp \ - testkeyboardgrabber.cpp \ - mockclient.cpp \ - mockseat.cpp \ - testseat.cpp - -HEADERS += testcompositor.h \ - testkeyboardgrabber.h \ - mockclient.h \ - mockseat.h \ - testseat.h +SUBDIRS += compositor diff --git a/tests/auto/compositor/BLACKLIST b/tests/auto/compositor/compositor/BLACKLIST index df4672be..df4672be 100644 --- a/tests/auto/compositor/BLACKLIST +++ b/tests/auto/compositor/compositor/BLACKLIST diff --git a/tests/auto/compositor/compositor/compositor.pro b/tests/auto/compositor/compositor/compositor.pro new file mode 100644 index 00000000..a3748697 --- /dev/null +++ b/tests/auto/compositor/compositor/compositor.pro @@ -0,0 +1,40 @@ +CONFIG += testcase link_pkgconfig +CONFIG += wayland-scanner +TARGET = tst_compositor + +QT += testlib +QT += core-private gui-private waylandcompositor waylandcompositor-private + +!contains(QT_CONFIG, no-pkg-config) { + PKGCONFIG += wayland-client wayland-server +} else { + LIBS += -lwayland-client -lwayland-server +} + +config_xkbcommon { + !contains(QT_CONFIG, no-pkg-config) { + PKGCONFIG_PRIVATE += xkbcommon + } else { + LIBS_PRIVATE += -lxkbcommon + } +} else { + DEFINES += QT_NO_WAYLAND_XKB +} + +WAYLANDCLIENTSOURCES += \ + ../../../../src/3rdparty/protocol/xdg-shell.xml \ + +SOURCES += \ + tst_compositor.cpp \ + testcompositor.cpp \ + testkeyboardgrabber.cpp \ + mockclient.cpp \ + mockseat.cpp \ + testseat.cpp + +HEADERS += \ + testcompositor.h \ + testkeyboardgrabber.h \ + mockclient.h \ + mockseat.h \ + testseat.h diff --git a/tests/auto/compositor/mockclient.cpp b/tests/auto/compositor/compositor/mockclient.cpp index 9b6d327a..9b6d327a 100644 --- a/tests/auto/compositor/mockclient.cpp +++ b/tests/auto/compositor/compositor/mockclient.cpp diff --git a/tests/auto/compositor/mockclient.h b/tests/auto/compositor/compositor/mockclient.h index 33ada638..33ada638 100644 --- a/tests/auto/compositor/mockclient.h +++ b/tests/auto/compositor/compositor/mockclient.h diff --git a/tests/auto/compositor/mockseat.cpp b/tests/auto/compositor/compositor/mockseat.cpp index 29c4a4e1..29c4a4e1 100644 --- a/tests/auto/compositor/mockseat.cpp +++ b/tests/auto/compositor/compositor/mockseat.cpp diff --git a/tests/auto/compositor/mockseat.h b/tests/auto/compositor/compositor/mockseat.h index 1c6d324c..1c6d324c 100644 --- a/tests/auto/compositor/mockseat.h +++ b/tests/auto/compositor/compositor/mockseat.h diff --git a/tests/auto/compositor/testcompositor.cpp b/tests/auto/compositor/compositor/testcompositor.cpp index 733bea5b..733bea5b 100644 --- a/tests/auto/compositor/testcompositor.cpp +++ b/tests/auto/compositor/compositor/testcompositor.cpp diff --git a/tests/auto/compositor/testcompositor.h b/tests/auto/compositor/compositor/testcompositor.h index 8eeb7ade..8eeb7ade 100644 --- a/tests/auto/compositor/testcompositor.h +++ b/tests/auto/compositor/compositor/testcompositor.h diff --git a/tests/auto/compositor/testkeyboardgrabber.cpp b/tests/auto/compositor/compositor/testkeyboardgrabber.cpp index a3aa42ac..a3aa42ac 100644 --- a/tests/auto/compositor/testkeyboardgrabber.cpp +++ b/tests/auto/compositor/compositor/testkeyboardgrabber.cpp diff --git a/tests/auto/compositor/testkeyboardgrabber.h b/tests/auto/compositor/compositor/testkeyboardgrabber.h index 0ef59598..0ef59598 100644 --- a/tests/auto/compositor/testkeyboardgrabber.h +++ b/tests/auto/compositor/compositor/testkeyboardgrabber.h diff --git a/tests/auto/compositor/testseat.cpp b/tests/auto/compositor/compositor/testseat.cpp index 38227872..38227872 100644 --- a/tests/auto/compositor/testseat.cpp +++ b/tests/auto/compositor/compositor/testseat.cpp diff --git a/tests/auto/compositor/testseat.h b/tests/auto/compositor/compositor/testseat.h index 54641c07..54641c07 100644 --- a/tests/auto/compositor/testseat.h +++ b/tests/auto/compositor/compositor/testseat.h diff --git a/tests/auto/compositor/tst_compositor.cpp b/tests/auto/compositor/compositor/tst_compositor.cpp index 05e876dd..05e876dd 100644 --- a/tests/auto/compositor/tst_compositor.cpp +++ b/tests/auto/compositor/compositor/tst_compositor.cpp diff --git a/tests/global/.gitignore b/tests/global/.gitignore new file mode 100644 index 00000000..7407af1a --- /dev/null +++ b/tests/global/.gitignore @@ -0,0 +1 @@ +global.pro |