From be03c9f1d9e509dafd2d6ee95cac4b67e775460f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 2 Aug 2023 15:34:36 +0200 Subject: [PATCH] Add embeddedwindows manual test For the child windows we have to use showNormal() explicitly, as the default window state logic of platforms like iOS does not have access to the QWindow, only to its flags, and we can not use Qt::SubWindow as a proxy for being a child window, as that's a window flag meant to be used for MDI sub windows. Pick-to: 6.6 Change-Id: I2b5e669f6180ffdcb75479dece38ae5e5430aef6 Reviewed-by: Timur Pocheptsov --- tests/manual/embeddedwindows/CMakeLists.txt | 15 +++ tests/manual/embeddedwindows/main.cpp | 102 ++++++++++++++++++++ tests/shared/nativewindow.h | 5 + 3 files changed, 122 insertions(+) create mode 100644 tests/manual/embeddedwindows/CMakeLists.txt create mode 100644 tests/manual/embeddedwindows/main.cpp 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; }();