From 447a82ebe4ff494b175ed574fd2d07492873e691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 8 Apr 2024 10:09:49 +0200 Subject: [PATCH] iOS: Move QUIWindow implementation out of qiosscreen.mm Task-number: QTBUG-121781 Change-Id: Iaa4388908d0d59022ec05b63696147a0d1d01ae1 Reviewed-by: Amr Elsayed Reviewed-by: Volker Hilsheimer Reviewed-by: Assam Boudjelthia --- src/plugins/platforms/ios/CMakeLists.txt | 1 + src/plugins/platforms/ios/qiosscreen.h | 4 -- src/plugins/platforms/ios/qiosscreen.mm | 46 +------------------ src/plugins/platforms/ios/qiostheme.mm | 1 + src/plugins/platforms/ios/quiview.mm | 1 + src/plugins/platforms/ios/quiwindow.h | 13 ++++++ src/plugins/platforms/ios/quiwindow.mm | 56 ++++++++++++++++++++++++ 7 files changed, 73 insertions(+), 49 deletions(-) create mode 100644 src/plugins/platforms/ios/quiwindow.h create mode 100644 src/plugins/platforms/ios/quiwindow.mm diff --git a/src/plugins/platforms/ios/CMakeLists.txt b/src/plugins/platforms/ios/CMakeLists.txt index 32e4eb8051a..4cc3efc91e7 100644 --- a/src/plugins/platforms/ios/CMakeLists.txt +++ b/src/plugins/platforms/ios/CMakeLists.txt @@ -27,6 +27,7 @@ qt_internal_add_plugin(QIOSIntegrationPlugin qioswindow.h qioswindow.mm quiaccessibilityelement.h quiaccessibilityelement.mm quiview.h quiview.mm + quiwindow.mm quiwindow.h uistrings_p.h uistrings.cpp NO_PCH_SOURCES qioscontext.mm # undef QT_NO_FOREACH diff --git a/src/plugins/platforms/ios/qiosscreen.h b/src/plugins/platforms/ios/qiosscreen.h index b1fa5cad0d7..f05a5456b38 100644 --- a/src/plugins/platforms/ios/qiosscreen.h +++ b/src/plugins/platforms/ios/qiosscreen.h @@ -10,10 +10,6 @@ @class QIOSOrientationListener; -@interface QUIWindow : UIWindow -@property (nonatomic, readonly) BOOL sendingEvent; -@end - QT_BEGIN_NAMESPACE class QIOSScreen : public QObject, public QPlatformScreen diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm index d96f7686f5c..e7555c19ab5 100644 --- a/src/plugins/platforms/ios/qiosscreen.mm +++ b/src/plugins/platforms/ios/qiosscreen.mm @@ -12,6 +12,7 @@ #include "qiosviewcontroller.h" #include "quiview.h" #include "qiostheme.h" +#include "quiwindow.h" #include @@ -154,51 +155,6 @@ static QIOSScreen* qtPlatformScreenFor(UIScreen *uiScreen) // ------------------------------------------------------------------------- -@implementation QUIWindow - -- (instancetype)initWithFrame:(CGRect)frame -{ - if ((self = [super initWithFrame:frame])) - self->_sendingEvent = NO; - - return self; -} - -- (void)sendEvent:(UIEvent *)event -{ - QScopedValueRollback sendingEvent(self->_sendingEvent, YES); - [super sendEvent:event]; -} - -#if !defined(Q_OS_VISIONOS) -- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection -{ - [super traitCollectionDidChange:previousTraitCollection]; - - if (!qGuiApp) - return; - - Qt::ColorScheme colorScheme = self.traitCollection.userInterfaceStyle - == UIUserInterfaceStyleDark - ? Qt::ColorScheme::Dark - : Qt::ColorScheme::Light; - - if (self.screen == UIScreen.mainScreen) { - // Check if the current userInterfaceStyle reports a different appearance than - // the platformTheme's appearance. We might have set that one based on the UIScreen - if (previousTraitCollection.userInterfaceStyle != self.traitCollection.userInterfaceStyle - || QGuiApplicationPrivate::platformTheme()->colorScheme() != colorScheme) { - QIOSTheme::initializeSystemPalette(); - QWindowSystemInterface::handleThemeChange(); - } - } -} -#endif - -@end - -// ------------------------------------------------------------------------- - QT_BEGIN_NAMESPACE using namespace Qt::StringLiterals; diff --git a/src/plugins/platforms/ios/qiostheme.mm b/src/plugins/platforms/ios/qiostheme.mm index 251d0434cb5..3853de9cf11 100644 --- a/src/plugins/platforms/ios/qiostheme.mm +++ b/src/plugins/platforms/ios/qiostheme.mm @@ -28,6 +28,7 @@ #include "qiosfontdialog.h" #include "qiosmessagedialog.h" #include "qiosscreen.h" +#include "quiwindow.h" #endif QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm index 58071eed376..d5808db305b 100644 --- a/src/plugins/platforms/ios/quiview.mm +++ b/src/plugins/platforms/ios/quiview.mm @@ -10,6 +10,7 @@ #include "qiosscreen.h" #include "qioswindow.h" #include "qiosinputcontext.h" +#include "quiwindow.h" #ifndef Q_OS_TVOS #include "qiosmenu.h" #endif diff --git a/src/plugins/platforms/ios/quiwindow.h b/src/plugins/platforms/ios/quiwindow.h new file mode 100644 index 00000000000..b5587411e4c --- /dev/null +++ b/src/plugins/platforms/ios/quiwindow.h @@ -0,0 +1,13 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QUIWINDOW_H +#define QUIWINDOW_H + +#include + +@interface QUIWindow : UIWindow +@property (nonatomic, readonly) BOOL sendingEvent; +@end + +#endif // QUIWINDOW_H diff --git a/src/plugins/platforms/ios/quiwindow.mm b/src/plugins/platforms/ios/quiwindow.mm new file mode 100644 index 00000000000..7c910b6d9ed --- /dev/null +++ b/src/plugins/platforms/ios/quiwindow.mm @@ -0,0 +1,56 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "quiwindow.h" + +#include "qiostheme.h" + +#include + +#include +#include + +#include + +@implementation QUIWindow + +- (instancetype)initWithFrame:(CGRect)frame +{ + if ((self = [super initWithFrame:frame])) + self->_sendingEvent = NO; + + return self; +} + +- (void)sendEvent:(UIEvent *)event +{ + QScopedValueRollback sendingEvent(self->_sendingEvent, YES); + [super sendEvent:event]; +} + +#if !defined(Q_OS_VISIONOS) +- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection +{ + [super traitCollectionDidChange:previousTraitCollection]; + + if (!qGuiApp) + return; + + Qt::ColorScheme colorScheme = self.traitCollection.userInterfaceStyle + == UIUserInterfaceStyleDark + ? Qt::ColorScheme::Dark + : Qt::ColorScheme::Light; + + if (self.screen == UIScreen.mainScreen) { + // Check if the current userInterfaceStyle reports a different appearance than + // the platformTheme's appearance. We might have set that one based on the UIScreen + if (previousTraitCollection.userInterfaceStyle != self.traitCollection.userInterfaceStyle + || QGuiApplicationPrivate::platformTheme()->colorScheme() != colorScheme) { + QIOSTheme::initializeSystemPalette(); + QWindowSystemInterface::handleThemeChange(); + } + } +} +#endif + +@end