diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-09-19 18:04:22 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-09-19 18:05:25 +0200 |
commit | b62ae0fd804633de07d68f2f5654d2373a83f8d7 (patch) | |
tree | 555a12d65ccd1d657e4924cdc498923b504104b1 /tests | |
parent | a6d8c05a25c5165164fcb6400d8342933e079139 (diff) | |
parent | 7e6de1ded923936c2ba2a2d55d0cba2e7ff14e1e (diff) |
Merge remote-tracking branch 'origin/5.4' into dev
Conflicts:
src/compositor/wayland_wrapper/qwlcompositor.cpp
Change-Id: Ica26e33eb2b77ed5be0e84e8f4256d2e85abfaf5
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/client/mockcompositor.cpp | 21 | ||||
-rw-r--r-- | tests/auto/client/mockcompositor.h | 4 | ||||
-rw-r--r-- | tests/auto/client/mockinput.cpp | 35 | ||||
-rw-r--r-- | tests/auto/client/mockinput.h | 25 | ||||
-rw-r--r-- | tests/auto/client/mockshell.cpp | 3 | ||||
-rw-r--r-- | tests/auto/client/mocksurface.cpp | 75 | ||||
-rw-r--r-- | tests/auto/client/mocksurface.h | 7 | ||||
-rw-r--r-- | tests/auto/client/tst_client.cpp | 9 | ||||
-rw-r--r-- | tests/auto/compositor/mockclient.cpp | 17 | ||||
-rw-r--r-- | tests/auto/compositor/mockclient.h | 1 |
10 files changed, 141 insertions, 56 deletions
diff --git a/tests/auto/client/mockcompositor.cpp b/tests/auto/client/mockcompositor.cpp index bb4f10fd9..cb0e6576e 100644 --- a/tests/auto/client/mockcompositor.cpp +++ b/tests/auto/client/mockcompositor.cpp @@ -135,8 +135,13 @@ QSharedPointer<MockSurface> MockCompositor::surface() QSharedPointer<MockSurface> result; lock(); QVector<Impl::Surface *> surfaces = m_compositor->surfaces(); - if (!surfaces.isEmpty()) - result = surfaces.first()->mockSurface(); + foreach (Impl::Surface *surface, surfaces) { + // we don't want to mistake the cursor surface for a window surface + if (surface->isMapped()) { + result = surface->mockSurface(); + break; + } + } unlock(); return result; } @@ -189,11 +194,6 @@ void *MockCompositor::run(void *data) return 0; } -void MockCompositor::discardSurfaces() -{ - m_compositor->discardSurfaces(); -} - namespace Impl { Compositor::Compositor() @@ -209,6 +209,8 @@ Compositor::Compositor() wl_display_add_global(m_display, &wl_compositor_interface, this, bindCompositor); + m_data_device_manager.reset(new DataDeviceManager(this, m_display)); + wl_display_init_shm(m_display); m_seat.reset(new Seat(this, m_display)); @@ -298,10 +300,5 @@ void Compositor::removeSurface(Surface *surface) m_pointer->setFocus(0, QPoint()); } -void Compositor::discardSurfaces() -{ - m_surfaces.clear(); -} - } diff --git a/tests/auto/client/mockcompositor.h b/tests/auto/client/mockcompositor.h index 68e55d356..03d3a96a3 100644 --- a/tests/auto/client/mockcompositor.h +++ b/tests/auto/client/mockcompositor.h @@ -61,6 +61,7 @@ typedef void (**Implementation)(void); class Keyboard; class Pointer; class Seat; +class DataDeviceManager; class Surface; class Compositor @@ -81,7 +82,6 @@ public: void addSurface(Surface *surface); void removeSurface(Surface *surface); - void discardSurfaces(); static void setKeyboardFocus(void *data, const QList<QVariant> ¶meters); static void sendMousePress(void *data, const QList<QVariant> ¶meters); @@ -112,6 +112,7 @@ private: QScopedPointer<Seat> m_seat; Pointer *m_pointer; Keyboard *m_keyboard; + QScopedPointer<DataDeviceManager> m_data_device_manager; QVector<Surface *> m_surfaces; }; @@ -155,7 +156,6 @@ public: void sendKeyRelease(const QSharedPointer<MockSurface> &surface, uint code); QSharedPointer<MockSurface> surface(); - void discardSurfaces(); void lock(); void unlock(); diff --git a/tests/auto/client/mockinput.cpp b/tests/auto/client/mockinput.cpp index 7dbb735ed..fbe44de41 100644 --- a/tests/auto/client/mockinput.cpp +++ b/tests/auto/client/mockinput.cpp @@ -130,6 +130,8 @@ void Seat::seat_get_pointer(Resource *resource, uint32_t id) Keyboard::Keyboard(Compositor *compositor) : wl_keyboard() , m_compositor(compositor) + , m_focusResource(Q_NULLPTR) + , m_focus(Q_NULLPTR) { } @@ -174,6 +176,8 @@ void Keyboard::keyboard_destroy_resource(wl_keyboard::Resource *resource) Pointer::Pointer(Compositor *compositor) : wl_pointer() , m_compositor(compositor) + , m_focusResource(Q_NULLPTR) + , m_focus(Q_NULLPTR) { } @@ -223,4 +227,35 @@ void Pointer::pointer_destroy_resource(wl_pointer::Resource *resource) m_focusResource = 0; } +DataDevice::DataDevice(Compositor *compositor) + : wl_data_device() + , m_compositor(compositor) +{ + +} + +DataDevice::~DataDevice() +{ + +} + +DataDeviceManager::DataDeviceManager(Compositor *compositor, wl_display *display) + : wl_data_device_manager(display) + , m_compositor(compositor) +{ + +} + +DataDeviceManager::~DataDeviceManager() +{ + +} + +void DataDeviceManager::data_device_manager_get_data_device(Resource *resource, uint32_t id, struct ::wl_resource *seat) +{ + if (!m_data_device) + m_data_device.reset(new DataDevice(m_compositor)); + m_data_device->add(resource->client(), id); +} + } diff --git a/tests/auto/client/mockinput.h b/tests/auto/client/mockinput.h index 128758cad..16b19b4fb 100644 --- a/tests/auto/client/mockinput.h +++ b/tests/auto/client/mockinput.h @@ -120,6 +120,31 @@ private: Surface *m_focus; }; +class DataDevice : public QtWaylandServer::wl_data_device +{ +public: + DataDevice(Compositor *compositor); + ~DataDevice(); + +private: + Compositor *m_compositor; +}; + +class DataDeviceManager : public QtWaylandServer::wl_data_device_manager +{ +public: + DataDeviceManager(Compositor *compositor, struct ::wl_display *display); + ~DataDeviceManager(); + +protected: + void data_device_manager_get_data_device(Resource *resource, uint32_t id, struct ::wl_resource *seat) Q_DECL_OVERRIDE; + +private: + Compositor *m_compositor; + + QScopedPointer<DataDevice> m_data_device; +}; + } #endif // MOCKINPUT_H diff --git a/tests/auto/client/mockshell.cpp b/tests/auto/client/mockshell.cpp index 0d841f64c..2a5969f70 100644 --- a/tests/auto/client/mockshell.cpp +++ b/tests/auto/client/mockshell.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ #include "mockcompositor.h" +#include "mocksurface.h" namespace Impl { @@ -173,6 +174,8 @@ static void get_shell_surface(wl_client *client, wl_resource *compositorResource Q_UNUSED(compositorResource); wl_client_add_object(client, &wl_shell_surface_interface, &shellSurfaceInterface, id, surfaceResource->data); + Surface *surf = Surface::fromResource(surfaceResource); + surf->map(); } void Compositor::bindShell(wl_client *client, void *compositorData, uint32_t version, uint32_t id) diff --git a/tests/auto/client/mocksurface.cpp b/tests/auto/client/mocksurface.cpp index d5e0367a0..2e4c2bc73 100644 --- a/tests/auto/client/mocksurface.cpp +++ b/tests/auto/client/mocksurface.cpp @@ -46,10 +46,11 @@ namespace Impl { Surface::Surface(wl_client *client, uint32_t id, Compositor *compositor) : QtWaylandServer::wl_surface(client, id) + , m_buffer(Q_NULLPTR) , m_compositor(compositor) , m_mockSurface(new MockSurface(this)) + , m_mapped(false) { - wl_list_init(&m_frameCallbackList); } Surface::~Surface() @@ -57,6 +58,21 @@ Surface::~Surface() m_mockSurface->m_surface = 0; } +void Surface::map() +{ + m_mapped = true; +} + +bool Surface::isMapped() const +{ + return m_mapped; +} + +Surface *Surface::fromResource(struct ::wl_resource *resource) +{ + return static_cast<Surface *>(Resource::fromResource(resource)->surface_object); +} + void Surface::surface_destroy_resource(Resource *) { compositor()->removeSurface(this); @@ -88,47 +104,44 @@ void Surface::surface_damage(Resource *resource, Q_UNUSED(y); Q_UNUSED(width); Q_UNUSED(height); - - if (!m_buffer) - return; - -#if WAYLAND_VERSION_CHECK(1, 2, 0) - struct ::wl_shm_buffer *shm_buffer = wl_shm_buffer_get(m_buffer); -#else - struct ::wl_buffer *shm_buffer = 0; - if (wl_buffer_is_shm(static_cast<struct ::wl_buffer*>(m_buffer->data))) - shm_buffer = static_cast<struct ::wl_buffer*>(m_buffer->data); -#endif - - if (shm_buffer) { - int stride = wl_shm_buffer_get_stride(shm_buffer); - uint format = wl_shm_buffer_get_format(shm_buffer); - Q_UNUSED(format); - void *data = wl_shm_buffer_get_data(shm_buffer); - const uchar *char_data = static_cast<const uchar *>(data); - QImage img(char_data, wl_shm_buffer_get_width(shm_buffer), wl_shm_buffer_get_height(shm_buffer), stride, QImage::Format_ARGB32_Premultiplied); - m_mockSurface->image = img; - } - - wl_resource *frameCallback; - wl_list_for_each(frameCallback, &m_frameCallbackList, link) { - wl_callback_send_done(frameCallback, m_compositor->time()); - wl_resource_destroy(frameCallback); - } - - wl_list_init(&m_frameCallbackList); } void Surface::surface_frame(Resource *resource, uint32_t callback) { wl_resource *frameCallback = wl_client_add_object(resource->client(), &wl_callback_interface, 0, callback, this); - wl_list_insert(&m_frameCallbackList, &frameCallback->link); + m_frameCallbackList << frameCallback; } void Surface::surface_commit(Resource *resource) { Q_UNUSED(resource); + + if (m_buffer) { +#if WAYLAND_VERSION_CHECK(1, 2, 0) + struct ::wl_shm_buffer *shm_buffer = wl_shm_buffer_get(m_buffer); +#else + struct ::wl_buffer *shm_buffer = 0; + if (wl_buffer_is_shm(static_cast<struct ::wl_buffer*>(m_buffer->data))) + shm_buffer = static_cast<struct ::wl_buffer*>(m_buffer->data); +#endif + + if (shm_buffer) { + int stride = wl_shm_buffer_get_stride(shm_buffer); + uint format = wl_shm_buffer_get_format(shm_buffer); + Q_UNUSED(format); + void *data = wl_shm_buffer_get_data(shm_buffer); + const uchar *char_data = static_cast<const uchar *>(data); + QImage img(char_data, wl_shm_buffer_get_width(shm_buffer), wl_shm_buffer_get_height(shm_buffer), stride, QImage::Format_ARGB32_Premultiplied); + m_mockSurface->image = img; + } + } + + foreach (wl_resource *frameCallback, m_frameCallbackList) { + wl_callback_send_done(frameCallback, m_compositor->time()); + wl_resource_destroy(frameCallback); + } + m_frameCallbackList.clear(); } } diff --git a/tests/auto/client/mocksurface.h b/tests/auto/client/mocksurface.h index 49260f51b..f2a2f4eb3 100644 --- a/tests/auto/client/mocksurface.h +++ b/tests/auto/client/mocksurface.h @@ -54,6 +54,9 @@ public: ~Surface(); Compositor *compositor() const { return m_compositor; } + static Surface *fromResource(struct ::wl_resource *resource); + void map(); + bool isMapped() const; QSharedPointer<MockSurface> mockSurface() const { return m_mockSurface; } @@ -74,8 +77,8 @@ private: Compositor *m_compositor; QSharedPointer<MockSurface> m_mockSurface; - - wl_list m_frameCallbackList; + QList<wl_resource *> m_frameCallbackList; + bool m_mapped; }; } diff --git a/tests/auto/client/tst_client.cpp b/tests/auto/client/tst_client.cpp index 9c3138bcb..113f9d9a8 100644 --- a/tests/auto/client/tst_client.cpp +++ b/tests/auto/client/tst_client.cpp @@ -149,11 +149,7 @@ private: void tst_WaylandClient::screen() { - QCoreApplication::processEvents(QEventLoop::AllEvents); - QTRY_COMPARE(QGuiApplication::primaryScreen()->size(), screenSize); - // discard the cursor surface created by the QWaylandInputDevice - compositor->discardSurfaces(); } void tst_WaylandClient::createDestroyWindow() @@ -252,6 +248,11 @@ int main(int argc, char **argv) setenv("XDG_RUNTIME_DIR", ".", 1); setenv("QT_QPA_PLATFORM", "wayland", 1); // force QGuiApplication to use wayland plugin + // wayland-egl hangs in the test setup when we try to initialize. Until it gets + // figured out, avoid clientBufferIntegration() from being called in + // QWaylandWindow::createDecorations(). + setenv("QT_WAYLAND_DISABLE_WINDOWDECORATION", "1", 1); + MockCompositor compositor; compositor.setOutputGeometry(QRect(QPoint(), screenSize)); diff --git a/tests/auto/compositor/mockclient.cpp b/tests/auto/compositor/mockclient.cpp index 2ee997ed5..9bbe56519 100644 --- a/tests/auto/compositor/mockclient.cpp +++ b/tests/auto/compositor/mockclient.cpp @@ -89,7 +89,8 @@ MockClient::MockClient() const wl_output_listener MockClient::outputListener = { MockClient::outputGeometryEvent, - MockClient::outputModeEvent + MockClient::outputModeEvent, + MockClient::outputDone }; MockClient::~MockClient() @@ -103,12 +104,18 @@ void MockClient::outputGeometryEvent(void *data, wl_output *, int, const char *, const char *, int32_t ) { - resolve(data)->geometry = QRect(x, y, width, height); + resolve(data)->geometry.moveTopLeft(QPoint(x, y)); } -void MockClient::outputModeEvent(void *, wl_output *, uint32_t, - int, int, int) +void MockClient::outputModeEvent(void *data, wl_output *, uint32_t, + int w, int h, int) { + resolve(data)->geometry.setSize(QSize(w, h)); +} + +void MockClient::outputDone(void *, wl_output *) +{ + } void MockClient::readEvents() @@ -132,7 +139,7 @@ void MockClient::handleGlobal(uint32_t id, const QByteArray &interface) if (interface == "wl_compositor") { compositor = static_cast<wl_compositor *>(wl_registry_bind(registry, id, &wl_compositor_interface, 1)); } else if (interface == "wl_output") { - output = static_cast<wl_output *>(wl_registry_bind(registry, id, &wl_output_interface, 1)); + output = static_cast<wl_output *>(wl_registry_bind(registry, id, &wl_output_interface, 2)); wl_output_add_listener(output, &outputListener, this); } else if (interface == "wl_shm") { shm = static_cast<wl_shm *>(wl_registry_bind(registry, id, &wl_shm_interface, 1)); diff --git a/tests/auto/compositor/mockclient.h b/tests/auto/compositor/mockclient.h index 9f7c89d59..de1084ab9 100644 --- a/tests/auto/compositor/mockclient.h +++ b/tests/auto/compositor/mockclient.h @@ -103,6 +103,7 @@ private: int width, int height, int refresh); + static void outputDone(void *data, wl_output *output); void handleGlobal(uint32_t id, const QByteArray &interface); |