summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2014-09-19 18:04:22 +0200
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2014-09-19 18:05:25 +0200
commitb62ae0fd804633de07d68f2f5654d2373a83f8d7 (patch)
tree555a12d65ccd1d657e4924cdc498923b504104b1 /tests/auto
parenta6d8c05a25c5165164fcb6400d8342933e079139 (diff)
parent7e6de1ded923936c2ba2a2d55d0cba2e7ff14e1e (diff)
Merge remote-tracking branch 'origin/5.4' into dev
Conflicts: src/compositor/wayland_wrapper/qwlcompositor.cpp Change-Id: Ica26e33eb2b77ed5be0e84e8f4256d2e85abfaf5
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/client/mockcompositor.cpp21
-rw-r--r--tests/auto/client/mockcompositor.h4
-rw-r--r--tests/auto/client/mockinput.cpp35
-rw-r--r--tests/auto/client/mockinput.h25
-rw-r--r--tests/auto/client/mockshell.cpp3
-rw-r--r--tests/auto/client/mocksurface.cpp75
-rw-r--r--tests/auto/client/mocksurface.h7
-rw-r--r--tests/auto/client/tst_client.cpp9
-rw-r--r--tests/auto/compositor/mockclient.cpp17
-rw-r--r--tests/auto/compositor/mockclient.h1
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> &parameters);
static void sendMousePress(void *data, const QList<QVariant> &parameters);
@@ -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);