Merge remote-tracking branch 'qt/5.10' into dev
Change-Id: I603cbb164e6015c1bb7796bd8bb055d84dbc3b04
This commit is contained in:
commit
397d3f75ab
@ -7,6 +7,8 @@ OTHER_FILES += \
|
||||
|
||||
SOURCES += main.cpp
|
||||
|
||||
TARGET = qt-plugin-wayland-egl
|
||||
|
||||
PLUGIN_TYPE = wayland-graphics-integration-client
|
||||
PLUGIN_CLASS_NAME = QWaylandEglClientBufferPlugin
|
||||
load(qt_plugin)
|
||||
|
@ -66,7 +66,7 @@ void QWaylandBuffer::init(wl_buffer *buf)
|
||||
|
||||
void QWaylandBuffer::release(void *data, wl_buffer *)
|
||||
{
|
||||
static_cast<QWaylandBuffer *>(data)->mBusy--;
|
||||
static_cast<QWaylandBuffer *>(data)->mBusy = false;
|
||||
}
|
||||
|
||||
const wl_buffer_listener QWaylandBuffer::listener = {
|
||||
|
@ -73,14 +73,14 @@ public:
|
||||
virtual QSize size() const = 0;
|
||||
virtual int scale() const { return 1; }
|
||||
|
||||
void setBusy() { mBusy++; }
|
||||
bool busy() const { return mBusy > 0; }
|
||||
void setBusy() { mBusy = true; }
|
||||
bool busy() const { return mBusy; }
|
||||
|
||||
protected:
|
||||
struct wl_buffer *mBuffer;
|
||||
|
||||
private:
|
||||
int mBusy;
|
||||
bool mBusy;
|
||||
|
||||
static void release(void *data, wl_buffer *);
|
||||
static const wl_buffer_listener listener;
|
||||
|
@ -1050,7 +1050,7 @@ QVariant QWaylandWindow::property(const QString &name, const QVariant &defaultVa
|
||||
|
||||
void QWaylandWindow::requestUpdate()
|
||||
{
|
||||
if (!mFrameCallback)
|
||||
if (!mWaitingForFrameSync)
|
||||
QPlatformWindow::requestUpdate();
|
||||
else
|
||||
mUpdateRequested = true;
|
||||
|
@ -125,6 +125,8 @@ QWaylandXdgSurfaceV6::QWaylandXdgSurfaceV6(QWaylandXdgShellV6 *shell, ::zxdg_sur
|
||||
|
||||
QWaylandXdgSurfaceV6::~QWaylandXdgSurfaceV6()
|
||||
{
|
||||
if (m_toplevel)
|
||||
zxdg_toplevel_v6_destroy(m_toplevel->object());
|
||||
if (m_popup)
|
||||
zxdg_popup_v6_destroy(m_popup->object());
|
||||
destroy();
|
||||
@ -169,7 +171,8 @@ void QWaylandXdgSurfaceV6::setType(Qt::WindowType type, QWaylandWindow *transien
|
||||
setToplevel();
|
||||
if (transientParent) {
|
||||
auto parentXdgSurface = static_cast<QWaylandXdgSurfaceV6 *>(transientParent->shellSurface());
|
||||
m_toplevel->set_parent(parentXdgSurface->m_toplevel->object());
|
||||
if (parentXdgSurface)
|
||||
m_toplevel->set_parent(parentXdgSurface->m_toplevel->object());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -35,8 +35,12 @@
|
||||
#include <QMimeData>
|
||||
#include <QPixmap>
|
||||
#include <QDrag>
|
||||
#include <QWindow>
|
||||
#include <QOpenGLWindow>
|
||||
|
||||
#include <QtTest/QtTest>
|
||||
#include <QtWaylandClient/private/qwaylandintegration_p.h>
|
||||
#include <QtGui/private/qguiapplication_p.h>
|
||||
|
||||
static const QSize screenSize(1600, 1200);
|
||||
|
||||
@ -97,6 +101,8 @@ public:
|
||||
++touchEventCount;
|
||||
}
|
||||
|
||||
QPoint frameOffset() const { return QPoint(frameMargins().left(), frameMargins().top()); }
|
||||
|
||||
int focusInEventCount;
|
||||
int focusOutEventCount;
|
||||
int keyPressEventCount;
|
||||
@ -109,6 +115,25 @@ public:
|
||||
QPoint mousePressPos;
|
||||
};
|
||||
|
||||
class TestGlWindow : public QOpenGLWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TestGlWindow();
|
||||
|
||||
protected:
|
||||
void paintGL() override;
|
||||
};
|
||||
|
||||
TestGlWindow::TestGlWindow()
|
||||
{}
|
||||
|
||||
void TestGlWindow::paintGL()
|
||||
{
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
}
|
||||
|
||||
class tst_WaylandClient : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
@ -149,6 +174,7 @@ private slots:
|
||||
void dontCrashOnMultipleCommits();
|
||||
void hiddenTransientParent();
|
||||
void hiddenPopupParent();
|
||||
void glWindow();
|
||||
|
||||
private:
|
||||
MockCompositor *compositor;
|
||||
@ -235,7 +261,7 @@ void tst_WaylandClient::removePrimaryScreen()
|
||||
compositor->sendRemoveOutput(firstOutput);
|
||||
QTRY_COMPARE(QGuiApplication::screens().size(), 1);
|
||||
|
||||
compositor->sendMousePress(surface, QPoint(10, 10));
|
||||
compositor->sendMousePress(surface, window.frameOffset() + QPoint(10, 10));
|
||||
QTRY_COMPARE(window.mousePressEventCount, 1);
|
||||
compositor->sendMouseRelease(surface);
|
||||
QTRY_COMPARE(window.mouseReleaseEventCount, 1);
|
||||
@ -290,7 +316,7 @@ void tst_WaylandClient::events()
|
||||
|
||||
QPoint mousePressPos(16, 16);
|
||||
QCOMPARE(window.mousePressEventCount, 0);
|
||||
compositor->sendMousePress(surface, mousePressPos);
|
||||
compositor->sendMousePress(surface, window.frameOffset() + mousePressPos);
|
||||
QTRY_COMPARE(window.mousePressEventCount, 1);
|
||||
QTRY_COMPARE(window.mousePressPos, mousePressPos);
|
||||
|
||||
@ -299,7 +325,7 @@ void tst_WaylandClient::events()
|
||||
QTRY_COMPARE(window.mouseReleaseEventCount, 1);
|
||||
|
||||
const int touchId = 0;
|
||||
compositor->sendTouchDown(surface, QPoint(10, 10), touchId);
|
||||
compositor->sendTouchDown(surface, window.frameOffset() + QPoint(10, 10), touchId);
|
||||
compositor->sendTouchFrame(surface);
|
||||
QTRY_COMPARE(window.touchEventCount, 1);
|
||||
|
||||
@ -358,6 +384,7 @@ public:
|
||||
m_dragIcon = QPixmap::fromImage(cursorImage);
|
||||
}
|
||||
~DndWindow(){}
|
||||
QPoint frameOffset() const { return QPoint(frameMargins().left(), frameMargins().top()); }
|
||||
bool dragStarted;
|
||||
|
||||
protected:
|
||||
@ -392,14 +419,14 @@ void tst_WaylandClient::touchDrag()
|
||||
QTRY_COMPARE(QGuiApplication::focusWindow(), &window);
|
||||
|
||||
const int id = 0;
|
||||
compositor->sendTouchDown(surface, QPoint(10, 10), id);
|
||||
compositor->sendTouchDown(surface, window.frameOffset() + QPoint(10, 10), id);
|
||||
compositor->sendTouchFrame(surface);
|
||||
compositor->sendTouchMotion(surface, QPoint(20, 20), id);
|
||||
compositor->sendTouchMotion(surface, window.frameOffset() + QPoint(20, 20), id);
|
||||
compositor->sendTouchFrame(surface);
|
||||
compositor->waitForStartDrag();
|
||||
compositor->sendDataDeviceDataOffer(surface);
|
||||
compositor->sendDataDeviceEnter(surface, QPoint(20, 20));
|
||||
compositor->sendDataDeviceMotion( QPoint(21, 21));
|
||||
compositor->sendDataDeviceEnter(surface, window.frameOffset() + QPoint(20, 20));
|
||||
compositor->sendDataDeviceMotion(window.frameOffset() + QPoint(21, 21));
|
||||
compositor->sendDataDeviceDrop(surface);
|
||||
compositor->sendDataDeviceLeave(surface);
|
||||
QTRY_VERIFY(window.dragStarted);
|
||||
@ -416,10 +443,10 @@ void tst_WaylandClient::mouseDrag()
|
||||
compositor->setKeyboardFocus(surface);
|
||||
QTRY_COMPARE(QGuiApplication::focusWindow(), &window);
|
||||
|
||||
compositor->sendMousePress(surface, QPoint(10, 10));
|
||||
compositor->sendMousePress(surface, window.frameOffset() + QPoint(10, 10));
|
||||
compositor->sendDataDeviceDataOffer(surface);
|
||||
compositor->sendDataDeviceEnter(surface, QPoint(20, 20));
|
||||
compositor->sendDataDeviceMotion( QPoint(21, 21));
|
||||
compositor->sendDataDeviceEnter(surface, window.frameOffset() + QPoint(20, 20));
|
||||
compositor->sendDataDeviceMotion(window.frameOffset() + QPoint(21, 21));
|
||||
compositor->waitForStartDrag();
|
||||
compositor->sendDataDeviceDrop(surface);
|
||||
compositor->sendDataDeviceLeave(surface);
|
||||
@ -480,7 +507,7 @@ void tst_WaylandClient::hiddenPopupParent()
|
||||
QTRY_VERIFY(surface = compositor->surface());
|
||||
QPoint mousePressPos(16, 16);
|
||||
QCOMPARE(toplevel.mousePressEventCount, 0);
|
||||
compositor->sendMousePress(surface, mousePressPos);
|
||||
compositor->sendMousePress(surface, toplevel.frameOffset() + mousePressPos);
|
||||
QTRY_COMPARE(toplevel.mousePressEventCount, 1);
|
||||
|
||||
QWindow popup;
|
||||
@ -494,20 +521,37 @@ void tst_WaylandClient::hiddenPopupParent()
|
||||
QTRY_VERIFY(compositor->surface());
|
||||
}
|
||||
|
||||
void tst_WaylandClient::glWindow()
|
||||
{
|
||||
QSKIP("Skipping GL tests, as not supported by all CI systems: See https://bugreports.qt.io/browse/QTBUG-65802");
|
||||
|
||||
QScopedPointer<TestGlWindow> testWindow(new TestGlWindow);
|
||||
testWindow->show();
|
||||
QSharedPointer<MockSurface> surface;
|
||||
QTRY_VERIFY(surface = compositor->surface());
|
||||
|
||||
//confirm we don't crash when we delete an already hidden GL window
|
||||
//QTBUG-65553
|
||||
testWindow->setVisible(false);
|
||||
QTRY_VERIFY(!compositor->surface());
|
||||
}
|
||||
|
||||
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.setOutputMode(screenSize);
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
// Initializing some client buffer integrations (i.e. eglInitialize) may block while waiting
|
||||
// for a wayland sync. So we call clientBufferIntegration prior to applicationInitialized
|
||||
// (while the compositor processes events without waiting) in order to avoid hanging later.
|
||||
auto *waylandIntegration = static_cast<QtWaylandClient::QWaylandIntegration *>(QGuiApplicationPrivate::platformIntegration());
|
||||
waylandIntegration->clientBufferIntegration();
|
||||
|
||||
compositor.applicationInitialized();
|
||||
|
||||
tst_WaylandClient tc(&compositor);
|
||||
|
@ -360,7 +360,9 @@ void Touch::sendDown(Surface *surface, const QPoint &position, int id)
|
||||
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());
|
||||
auto x = wl_fixed_from_int(position.x());
|
||||
auto y = wl_fixed_from_int(position.y());
|
||||
wl_touch_send_down(resource->handle, serial, time, surface->resource()->handle, id, x, y);
|
||||
}
|
||||
|
||||
void Touch::sendUp(Surface *surface, int id)
|
||||
@ -373,7 +375,9 @@ 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());
|
||||
auto x = wl_fixed_from_int(position.x());
|
||||
auto y = wl_fixed_from_int(position.y());
|
||||
wl_touch_send_motion(resource->handle, time, id, x, y);
|
||||
}
|
||||
|
||||
void Touch::sendFrame(Surface *surface)
|
||||
|
@ -1,5 +1,6 @@
|
||||
CONFIG += testcase link_pkgconfig
|
||||
QT += testlib
|
||||
QT += core-private gui-private waylandclient-private
|
||||
|
||||
QMAKE_USE += wayland-client wayland-server
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user