diff options
Diffstat (limited to 'tests/auto/client/shared/coreprotocol.h')
-rw-r--r-- | tests/auto/client/shared/coreprotocol.h | 171 |
1 files changed, 120 insertions, 51 deletions
diff --git a/tests/auto/client/shared/coreprotocol.h b/tests/auto/client/shared/coreprotocol.h index fe8202ad1..bea39dd13 100644 --- a/tests/auto/client/shared/coreprotocol.h +++ b/tests/auto/client/shared/coreprotocol.h @@ -1,41 +1,20 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2018 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef MOCKCOMPOSITOR_COREPROTOCOL_H #define MOCKCOMPOSITOR_COREPROTOCOL_H #include "corecompositor.h" +#include <QtCore/qpointer.h> + #include <qwayland-server-wayland.h> namespace MockCompositor { class WlCompositor; +class WlShell; +class WlShellSurface; class Output; class Pointer; class Touch; @@ -96,18 +75,18 @@ class Surface : public QObject, public QtWaylandServer::wl_surface { Q_OBJECT public: - explicit Surface(WlCompositor *wlCompositor, wl_client *client, int id, int version) - : QtWaylandServer::wl_surface(client, id, version) - , m_wlCompositor(wlCompositor) - { - } - ~Surface() override { qDeleteAll(m_commits); } // TODO: maybe make sure buffers are released? + explicit Surface(WlCompositor *wlCompositor, wl_client *client, int id, int version); + ~Surface() override; void sendFrameCallbacks(); void sendEnter(Output *output); void send_enter(::wl_resource *output) = delete; void sendLeave(Output *output); void send_leave(::wl_resource *output) = delete; + void map(); + bool isMapped() const { return m_mapped; } + WlShellSurface *wlShellSurface() const { return m_wlShellSurface; } + WlCompositor *m_wlCompositor; struct PerCommitData { Callback *frame = nullptr; @@ -120,11 +99,19 @@ public: uint configureSerial = 0; int bufferScale = 1; } m_pending, m_committed; - QVector<DoubleBufferedState *> m_commits; - QVector<Callback *> m_waitingFrameCallbacks; - QVector<Output *> m_outputs; + QList<DoubleBufferedState *> m_commits; + QList<Callback *> m_waitingFrameCallbacks; + QList<Output *> m_outputs; SurfaceRole *m_role = nullptr; + WlShellSurface *m_wlShellSurface = nullptr; + bool m_mapped = false; + QList<wl_resource *> m_frameCallbackList; + + wl_resource *m_buffer = nullptr; + QImage m_image; // checking backingStore + bool m_wlshell = false; + signals: void attach(void *buffer, QPoint offset); void commit(); @@ -132,24 +119,40 @@ signals: protected: void surface_destroy_resource(Resource *resource) override; - void surface_destroy(Resource *resource) override { wl_resource_destroy(resource->handle); } + void surface_destroy(Resource *resource) override; void surface_attach(Resource *resource, wl_resource *buffer, int32_t x, int32_t y) override; void surface_set_buffer_scale(Resource *resource, int32_t scale) override; void surface_commit(Resource *resource) override; void surface_frame(Resource *resource, uint32_t callback) override; + void surface_offset(Resource *resource, int32_t x, int32_t y) override; +}; + +class Region : public QtWaylandServer::wl_region +{ +public: + explicit Region(wl_client *client, int id, int version) + : QtWaylandServer::wl_region(client, id, version) + { + } + + void region_destroy_resource(Resource *resource) override + { + Q_UNUSED(resource); + delete this; + } }; class WlCompositor : public Global, public QtWaylandServer::wl_compositor { Q_OBJECT public: - explicit WlCompositor(CoreCompositor *compositor, int version = 3) + explicit WlCompositor(CoreCompositor *compositor, int version = 6) : QtWaylandServer::wl_compositor(compositor->m_display, version) , m_compositor(compositor) {} bool isClean() override; QString dirtyMessage() override; - QVector<Surface *> m_surfaces; + QList<Surface *> m_surfaces; CoreCompositor *m_compositor = nullptr; signals: @@ -162,6 +165,51 @@ protected: m_surfaces.append(surface); emit surfaceCreated(surface); } + + void compositor_create_region(Resource *resource, uint32_t id) override + { + new Region(resource->client(), id, resource->version()); + } +}; + +class WlShell : public Global, public QtWaylandServer::wl_shell +{ + Q_OBJECT +public: + explicit WlShell(CoreCompositor *compositor, int version = 1); + QList<WlShellSurface *> m_wlShellSurfaces; + CoreCompositor *m_compositor = nullptr; + +signals: + void wlShellSurfaceCreated(WlShellSurface *wlShellSurface); + +protected: + void shell_get_shell_surface(Resource *resource, uint32_t id, ::wl_resource *surface) override; +}; + +class WlShellSurface : public QObject, public QtWaylandServer::wl_shell_surface +{ + Q_OBJECT +public: + explicit WlShellSurface(WlShell *wlShell, wl_client *client, int id, Surface *surface); + ~WlShellSurface() override; + void sendConfigure(uint32_t edges, int32_t width, int32_t height); + void send_configure(uint32_t edges, int32_t width, int32_t height) = delete; + + void shell_surface_destroy_resource(Resource *) override { delete this; } + + WlShell *m_wlShell = nullptr; + Surface *m_surface = nullptr; +}; + +class Subsurface : public QObject, public QtWaylandServer::wl_subsurface +{ + Q_OBJECT +public: + explicit Subsurface(wl_client *client, int id, int version) + : QtWaylandServer::wl_subsurface(client, id, version) + { + } }; class SubCompositor : public Global, public QtWaylandServer::wl_subcompositor @@ -171,7 +219,20 @@ public: explicit SubCompositor(CoreCompositor *compositor, int version = 1) : QtWaylandServer::wl_subcompositor(compositor->m_display, version) {} - // TODO + QList<Subsurface *> m_subsurfaces; + +signals: + void subsurfaceCreated(Subsurface *subsurface); + +protected: + void subcompositor_get_subsurface(Resource *resource, uint32_t id, ::wl_resource *surface, ::wl_resource *parent) override + { + QTRY_VERIFY(parent); + QTRY_VERIFY(surface); + auto *subsurface = new Subsurface(resource->client(), id, resource->version()); + m_subsurfaces.append(subsurface); // TODO: clean up? + emit subsurfaceCreated(subsurface); + } }; struct OutputMode { @@ -222,6 +283,7 @@ public: void sendScale(int factor); void sendScale(Resource *resource); // Sends current scale to only one client + void sendDone(wl_client *client); void sendDone(); int scale() const { return m_data.scale; } @@ -229,6 +291,9 @@ public: OutputData m_data; int m_version = 1; // TODO: remove on libwayland upgrade +Q_SIGNALS: + void outputBound(Resource *resource); + protected: void output_bind_resource(Resource *resource) override; }; @@ -237,7 +302,7 @@ class Seat : public Global, public QtWaylandServer::wl_seat { Q_OBJECT public: - explicit Seat(CoreCompositor *compositor, uint capabilities = Seat::capability_pointer | Seat::capability_keyboard | Seat::capability_touch, int version = 5); + explicit Seat(CoreCompositor *compositor, uint capabilities = Seat::capability_pointer | Seat::capability_keyboard | Seat::capability_touch, int version = 9); ~Seat() override; void send_capabilities(Resource *resource, uint capabilities) = delete; // Use wrapper instead void send_capabilities(uint capabilities) = delete; // Use wrapper instead @@ -246,13 +311,13 @@ public: CoreCompositor *m_compositor = nullptr; Pointer* m_pointer = nullptr; - QVector<Pointer *> m_oldPointers; + QList<Pointer *> m_oldPointers; Touch* m_touch = nullptr; - QVector<Touch *> m_oldTouchs; + QList<Touch *> m_oldTouchs; Keyboard* m_keyboard = nullptr; - QVector<Keyboard *> m_oldKeyboards; + QList<Keyboard *> m_oldKeyboards; uint m_capabilities = 0; @@ -275,7 +340,7 @@ class Pointer : public QObject, public QtWaylandServer::wl_pointer public: explicit Pointer(Seat *seat) : m_seat(seat) {} Surface *cursorSurface(); - CursorRole* m_cursorRole = nullptr; //TODO: cleanup + QPointer<CursorRole> m_cursorRole; void send_enter() = delete; uint sendEnter(Surface *surface, const QPointF &position); void send_leave() = delete; @@ -287,9 +352,11 @@ public: void sendAxisSource(wl_client *client, axis_source source); void sendAxisStop(wl_client *client, axis axis); void sendFrame(wl_client *client); + void sendAxisValue120(wl_client *client, axis axis, int value120); + void sendAxisRelativeDirection(wl_client *client, axis axis, axis_relative_direction direction); Seat *m_seat = nullptr; - QVector<uint> m_enterSerials; + QList<uint> m_enterSerials; QPoint m_hotspot; signals: @@ -306,6 +373,7 @@ public: explicit CursorRole(Surface *surface) // TODO: needs some more args : m_surface(surface) { + connect(m_surface, &QObject::destroyed, this, &QObject::deleteLater); } static CursorRole *fromSurface(Surface *surface) { return qobject_cast<CursorRole *>(surface->m_role); } Surface *m_surface = nullptr; @@ -320,6 +388,7 @@ public: uint sendUp(wl_client *client, int id); void sendMotion(wl_client *client, const QPointF &position, int id); void sendFrame(wl_client *client); + void sendCancel(wl_client *client); Seat *m_seat = nullptr; }; @@ -341,17 +410,17 @@ class Shm : public Global, public QtWaylandServer::wl_shm { Q_OBJECT public: - explicit Shm(CoreCompositor *compositor, QVector<format> formats = {format_argb8888, format_xrgb8888, format_rgb888}, int version = 1); + explicit Shm(CoreCompositor *compositor, QList<format> formats = {format_argb8888, format_xrgb8888, format_rgb888}, int version = 1); bool isClean() override; CoreCompositor *m_compositor = nullptr; - QVector<ShmPool *> m_pools; - const QVector<format> m_formats; + QList<ShmPool *> m_pools; + const QList<format> m_formats; protected: void shm_create_pool(Resource *resource, uint32_t id, int32_t fd, int32_t size) override; void shm_bind_resource(Resource *resource) override { - for (auto format : qAsConst(m_formats)) + for (auto format : std::as_const(m_formats)) send_format(resource->handle, format); } }; @@ -362,7 +431,7 @@ class ShmPool : QObject, public QtWaylandServer::wl_shm_pool public: explicit ShmPool(Shm *shm, wl_client *client, int id, int version = 1); Shm *m_shm = nullptr; - QVector<ShmBuffer *> m_buffers; + QList<ShmBuffer *> m_buffers; protected: void shm_pool_create_buffer(Resource *resource, uint32_t id, int32_t offset, int32_t width, int32_t height, int32_t stride, uint32_t format) override; |