diff --git a/tests/manual/embeddedwindows/CMakeLists.txt b/tests/manual/embeddedwindows/CMakeLists.txt new file mode 100644 index 00000000000..e25f14206e8 --- /dev/null +++ b/tests/manual/embeddedwindows/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_manual_test(embeddedwindows + SOURCES + main.cpp + LIBRARIES + Qt::Gui +) + +if(APPLE) + enable_language(OBJCXX) + set_source_files_properties(main.cpp PROPERTIES LANGUAGE OBJCXX) + set_property(TARGET embeddedwindows PROPERTY PROPERTY MACOSX_BUNDLE TRUE) +endif() diff --git a/tests/manual/embeddedwindows/main.cpp b/tests/manual/embeddedwindows/main.cpp new file mode 100644 index 00000000000..15c321839fe --- /dev/null +++ b/tests/manual/embeddedwindows/main.cpp @@ -0,0 +1,102 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include + +#include "../../shared/nativewindow.h" + +#include + +class TestWindow : public QRasterWindow +{ +public: + using QRasterWindow::QRasterWindow; + TestWindow(const QBrush &brush) : m_brush(brush) {} + +protected: + void mousePressEvent(QMouseEvent *) override + { + m_pressed = true; + update(); + } + + void mouseReleaseEvent(QMouseEvent *) override + { + m_pressed = false; + update(); + } + + void paintEvent(QPaintEvent *event) override + { + QPainter painter(this); + painter.setCompositionMode(QPainter::CompositionMode_Source); + painter.fillRect(event->rect(), m_pressed ? QGradient(QGradient::JuicyPeach) : m_brush); + } + +private: + QBrush m_brush = QGradient(QGradient::DustyGrass); + bool m_pressed = false; +}; + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + TestWindow window{QGradient(QGradient::WinterNeva)}; + window.resize(500, 500); + + TestWindow *opaqueChildWindow = new TestWindow; + opaqueChildWindow->setParent(&window); + opaqueChildWindow->setGeometry(50, 50, 100, 100); + opaqueChildWindow->showNormal(); + + TestWindow *maskedChildWindow = new TestWindow; + maskedChildWindow->setParent(&window); + maskedChildWindow->setGeometry(200, 50, 100, 100); + maskedChildWindow->setMask(QRegion(0, 0, 100, 100, QRegion::Ellipse)); + maskedChildWindow->showNormal(); + + static const QColor transparentGreen = QColor(0, 255, 0, 20); + TestWindow *transparentChildWindow = new TestWindow(transparentGreen); + // The default surface format of a platform may not include + // an alpha, so set it explicitly. + QSurfaceFormat format = transparentChildWindow->format(); + format.setAlphaBufferSize(8); + transparentChildWindow->setFormat(format); + // FIXME: Windows requires this, even for child windows + transparentChildWindow->setFlag(Qt::FramelessWindowHint); + transparentChildWindow->setParent(&window); + transparentChildWindow->setGeometry(350, 50, 100, 100); + transparentChildWindow->showNormal(); + + NativeWindow nativeWindow; + if (QWindow *foreignWindow = QWindow::fromWinId(nativeWindow)) { + foreignWindow->setParent(&window); + foreignWindow->setGeometry(50, 200, 100, 100); + foreignWindow->showNormal(); + } + + NativeWindow maskedNativeWindow; + if (QWindow *foreignWindow = QWindow::fromWinId(maskedNativeWindow)) { + foreignWindow->setParent(&window); + foreignWindow->setGeometry(200, 200, 100, 100); + foreignWindow->setMask(QRegion(0, 0, 100, 100, QRegion::Ellipse)); + foreignWindow->showNormal(); + } + + NativeWindow nativeParentWindow; + if (QWindow *foreignWindow = QWindow::fromWinId(nativeParentWindow)) { + foreignWindow->setParent(&window); + foreignWindow->setGeometry(50, 350, 100, 100); + foreignWindow->showNormal(); + + TestWindow *maskedChildWindowOfNativeWindow = new TestWindow; + maskedChildWindowOfNativeWindow->setParent(foreignWindow); + maskedChildWindowOfNativeWindow->setGeometry(25, 25, 50, 50); + maskedChildWindowOfNativeWindow->showNormal(); + } + + window.show(); + + return app.exec(); +} diff --git a/tests/shared/nativewindow.h b/tests/shared/nativewindow.h index 75461d134d0..1ab5fc40ced 100644 --- a/tests/shared/nativewindow.h +++ b/tests/shared/nativewindow.h @@ -44,6 +44,10 @@ private: - (instancetype)init { if ((self = [super init])) { +#if defined(Q_OS_MACOS) + self.wantsLayer = YES; +#endif + self.layer.backgroundColor = CGColorCreateGenericRGB(1.0, 0.5, 1.0, 1.0); } return self; } @@ -88,6 +92,7 @@ NativeWindow::NativeWindow() wc.lpfnWndProc = DefWindowProc; wc.hInstance = GetModuleHandle(nullptr); wc.lpszClassName = L"Native Window"; + wc.hbrBackground = CreateSolidBrush(RGB(255, 128, 255)); RegisterClass(&wc); return wc.lpszClassName; }();