diff options
Diffstat (limited to 'tests/manual/xembed/qt-client-raster')
5 files changed, 157 insertions, 0 deletions
diff --git a/tests/manual/xembed/qt-client-raster/CMakeLists.txt b/tests/manual/xembed/qt-client-raster/CMakeLists.txt new file mode 100644 index 0000000000..0784f411a3 --- /dev/null +++ b/tests/manual/xembed/qt-client-raster/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +##################################################################### +## qt-client-raster Binary: +##################################################################### + +qt_internal_add_manual_test(qt-client-raster + GUI + SOURCES + main.cpp + rasterwindow.cpp rasterwindow.h + LIBRARIES + Qt::Gui +) diff --git a/tests/manual/xembed/qt-client-raster/main.cpp b/tests/manual/xembed/qt-client-raster/main.cpp new file mode 100644 index 0000000000..628a9f652c --- /dev/null +++ b/tests/manual/xembed/qt-client-raster/main.cpp @@ -0,0 +1,29 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "rasterwindow.h" +#include <QDebug> + +int main(int argc, char **argv) +{ + QGuiApplication app(argc, argv); + + QStringList args = app.arguments(); + + WId winId = 0; + if (args.count() > 1) { + bool ok; + winId = args[1].toUInt(&ok); + Q_ASSERT(ok); + } + + RasterWindow window; + + QWindow *foreign = QWindow::fromWinId(winId); + Q_ASSERT(foreign != 0); + + window.setParent(foreign); + window.show(); + + return app.exec(); +} diff --git a/tests/manual/xembed/qt-client-raster/qt-client-raster.pro b/tests/manual/xembed/qt-client-raster/qt-client-raster.pro new file mode 100644 index 0000000000..9a47ed41c2 --- /dev/null +++ b/tests/manual/xembed/qt-client-raster/qt-client-raster.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET= qt-client-raster +QT += gui + +SOURCES += \ + main.cpp \ + rasterwindow.cpp +HEADERS += \ + rasterwindow.h diff --git a/tests/manual/xembed/qt-client-raster/rasterwindow.cpp b/tests/manual/xembed/qt-client-raster/rasterwindow.cpp new file mode 100644 index 0000000000..89d765f707 --- /dev/null +++ b/tests/manual/xembed/qt-client-raster/rasterwindow.cpp @@ -0,0 +1,72 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "rasterwindow.h" + +RasterWindow::RasterWindow(QWindow *parent) + : QWindow(parent) + , m_update_pending(false) +{ + winId(); + + m_backingStore = new QBackingStore(this); + create(); + + setGeometry(100, 100, 300, 200); +} + + +bool RasterWindow::event(QEvent *event) +{ + if (event->type() == QEvent::UpdateRequest) { + m_update_pending = false; + renderNow(); + return true; + } + return QWindow::event(event); +} + +void RasterWindow::renderLater() +{ + if (!m_update_pending) { + m_update_pending = true; + QCoreApplication::postEvent(this, new QEvent(QEvent::UpdateRequest)); + } +} + +void RasterWindow::resizeEvent(QResizeEvent *resizeEvent) +{ + m_backingStore->resize(resizeEvent->size()); + if (isExposed()) + renderNow(); +} + +void RasterWindow::exposeEvent(QExposeEvent *) +{ + if (isExposed()) { + renderNow(); + } +} + +void RasterWindow::renderNow() +{ + if (!isExposed()) + return; + + QRect rect(0, 0, width(), height()); + m_backingStore->beginPaint(rect); + + QPaintDevice *device = m_backingStore->paintDevice(); + QPainter painter(device); + + painter.fillRect(0, 0, width(), height(), Qt::white); + render(&painter); + + m_backingStore->endPaint(); + m_backingStore->flush(rect); +} + +void RasterWindow::render(QPainter *painter) +{ + painter->drawText(QRectF(0, 0, width(), height()), Qt::AlignCenter, QStringLiteral("QWindow")); +} diff --git a/tests/manual/xembed/qt-client-raster/rasterwindow.h b/tests/manual/xembed/qt-client-raster/rasterwindow.h new file mode 100644 index 0000000000..2d41cd8e5d --- /dev/null +++ b/tests/manual/xembed/qt-client-raster/rasterwindow.h @@ -0,0 +1,32 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef RASTERWINDOW_H +#define RASTERWINDOW_H + +#include <QtGui> + +class RasterWindow : public QWindow +{ + Q_OBJECT +public: + explicit RasterWindow(QWindow *parent = nullptr); + + virtual void render(QPainter *painter); + +public slots: + void renderLater(); + void renderNow(); + +protected: + bool event(QEvent *event) override; + + void resizeEvent(QResizeEvent *event) override; + void exposeEvent(QExposeEvent *event) override; + +private: + QBackingStore *m_backingStore; + bool m_update_pending; +}; + +#endif // RASTERWINDOW_H |