diff options
Diffstat (limited to 'src/plugins/platforms/ios')
-rw-r--r-- | src/plugins/platforms/ios/plugin.mm | 2 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiosapplicationdelegate.mm | 20 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiosscreen.mm | 19 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiosservices.h | 7 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiosservices.mm | 19 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qioswindow.h | 2 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qioswindow.mm | 15 |
7 files changed, 77 insertions, 7 deletions
diff --git a/src/plugins/platforms/ios/plugin.mm b/src/plugins/platforms/ios/plugin.mm index efb1ad8d74..3505e39a0b 100644 --- a/src/plugins/platforms/ios/plugin.mm +++ b/src/plugins/platforms/ios/plugin.mm @@ -56,7 +56,7 @@ class QIOSIntegrationPlugin : public QPlatformIntegrationPlugin QPlatformIntegration * QIOSIntegrationPlugin::create(const QString& system, const QStringList& paramList) { Q_UNUSED(paramList); - if (system.toLower() == "ios") + if (!system.compare(QLatin1String("ios"), Qt::CaseInsensitive)) return new QIOSIntegration; return 0; diff --git a/src/plugins/platforms/ios/qiosapplicationdelegate.mm b/src/plugins/platforms/ios/qiosapplicationdelegate.mm index cf702c82af..9cf1047a6b 100644 --- a/src/plugins/platforms/ios/qiosapplicationdelegate.mm +++ b/src/plugins/platforms/ios/qiosapplicationdelegate.mm @@ -41,9 +41,14 @@ #include "qiosapplicationdelegate.h" +#include "qiosintegration.h" +#include "qiosservices.h" #include "qiosviewcontroller.h" #include "qioswindow.h" +#include <QtGui/private/qguiapplication_p.h> +#include <qpa/qplatformintegration.h> + #include <QtCore/QtCore> @implementation QIOSApplicationDelegate @@ -82,6 +87,21 @@ return YES; } +- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation +{ + Q_UNUSED(application); + Q_UNUSED(sourceApplication); + Q_UNUSED(annotation); + + if (!QGuiApplication::instance()) + return NO; + + QIOSIntegration *iosIntegration = static_cast<QIOSIntegration *>(QGuiApplicationPrivate::platformIntegration()); + QIOSServices *iosServices = static_cast<QIOSServices *>(iosIntegration->services()); + + return iosServices->handleUrl(QUrl::fromNSURL(url)); +} + - (void)dealloc { [window release]; diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm index 57522cb1a3..96410952f9 100644 --- a/src/plugins/platforms/ios/qiosscreen.mm +++ b/src/plugins/platforms/ios/qiosscreen.mm @@ -189,6 +189,9 @@ void QIOSScreen::updateProperties() void QIOSScreen::updateStatusBarVisibility() { + if (!isQtApplication()) + return; + QWindow *focusWindow = QGuiApplication::focusWindow(); // If we don't have a focus window we leave the status @@ -199,20 +202,26 @@ void QIOSScreen::updateStatusBarVisibility() return; UIView *view = reinterpret_cast<UIView *>(focusWindow->handle()->winId()); + QIOSViewController *viewController = static_cast<QIOSViewController *>(view.viewController); + + bool currentStatusBarVisibility = [UIApplication sharedApplication].statusBarHidden; + if (viewController.prefersStatusBarHidden == currentStatusBarVisibility) + return; + #if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_7_0) if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_7_0) { - [view.viewController setNeedsStatusBarAppearanceUpdate]; + [viewController setNeedsStatusBarAppearanceUpdate]; + dispatch_async(dispatch_get_main_queue(), ^{ + updateProperties(); + }); } else #endif { - bool wasHidden = [UIApplication sharedApplication].statusBarHidden; - QIOSViewController *viewController = static_cast<QIOSViewController *>(view.viewController); [[UIApplication sharedApplication] setStatusBarHidden:[viewController prefersStatusBarHidden] withAnimation:UIStatusBarAnimationNone]; - if ([UIApplication sharedApplication].statusBarHidden != wasHidden) - updateProperties(); + updateProperties(); } } diff --git a/src/plugins/platforms/ios/qiosservices.h b/src/plugins/platforms/ios/qiosservices.h index 692b3a0b99..aa39fbbed4 100644 --- a/src/plugins/platforms/ios/qiosservices.h +++ b/src/plugins/platforms/ios/qiosservices.h @@ -41,6 +41,8 @@ #ifndef QIOSSERVICES_H #define QIOSSERVICES_H + +#include <qurl.h> #include <qpa/qplatformservices.h> QT_BEGIN_NAMESPACE @@ -50,6 +52,11 @@ class QIOSServices : public QPlatformServices public: bool openUrl(const QUrl &url); bool openDocument(const QUrl &url); + + bool handleUrl(const QUrl &url); + +private: + QUrl m_handlingUrl; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/ios/qiosservices.mm b/src/plugins/platforms/ios/qiosservices.mm index 32203aeb71..0ac6c590ca 100644 --- a/src/plugins/platforms/ios/qiosservices.mm +++ b/src/plugins/platforms/ios/qiosservices.mm @@ -42,6 +42,7 @@ #include "qiosservices.h" #include <QtCore/qurl.h> +#include <QtGui/qdesktopservices.h> #import <UIKit/UIApplication.h> @@ -49,6 +50,9 @@ QT_BEGIN_NAMESPACE bool QIOSServices::openUrl(const QUrl &url) { + if (url == m_handlingUrl) + return false; + if (url.scheme().isEmpty()) return openDocument(url); @@ -66,4 +70,19 @@ bool QIOSServices::openDocument(const QUrl &url) return QPlatformServices::openDocument(url); } +/* Callback from iOS that the application should handle a URL */ +bool QIOSServices::handleUrl(const QUrl &url) +{ + QUrl previouslyHandling = m_handlingUrl; + m_handlingUrl = url; + + // FIXME: Add platform services callback from QDesktopServices::setUrlHandler + // so that we can warn the user if calling setUrlHandler without also setting + // up the matching keys in the Info.plist file (CFBundleURLTypes and friends). + bool couldHandle = QDesktopServices::openUrl(url); + + m_handlingUrl = previouslyHandling; + return couldHandle; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/ios/qioswindow.h b/src/plugins/platforms/ios/qioswindow.h index a5e122bda1..d36a81180c 100644 --- a/src/plugins/platforms/ios/qioswindow.h +++ b/src/plugins/platforms/ios/qioswindow.h @@ -74,6 +74,8 @@ public: void handleContentOrientationChange(Qt::ScreenOrientation orientation); void setVisible(bool visible); + bool isExposed() const Q_DECL_OVERRIDE; + void raise() { raiseOrLower(true); } void lower() { raiseOrLower(false); } void requestActivateWindow(); diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm index 0dd810bdf6..7ab136e8b9 100644 --- a/src/plugins/platforms/ios/qioswindow.mm +++ b/src/plugins/platforms/ios/qioswindow.mm @@ -449,10 +449,18 @@ QT_BEGIN_NAMESPACE QIOSWindow::QIOSWindow(QWindow *window) : QPlatformWindow(window) , m_view([[QUIView alloc] initWithQIOSWindow:this]) - , m_normalGeometry(QPlatformWindow::geometry()) , m_windowLevel(0) { setParent(QPlatformWindow::parent()); + + // Resolve default window geometry in case it was not set before creating the + // platform window. This picks up eg. minimum-size if set, and defaults to + // the "maxmized" geometry (even though we're not in that window state). + // FIXME: Detect if we apply a maximized geometry and send a window state + // change event in that case. + m_normalGeometry = initialGeometry(window, QPlatformWindow::geometry(), + screen()->availableGeometry().width(), screen()->availableGeometry().height()); + setWindowState(window->windowState()); } @@ -579,6 +587,11 @@ void QIOSWindow::applyGeometry(const QRect &rect) [m_view layoutIfNeeded]; } +bool QIOSWindow::isExposed() const +{ + return window()->isVisible() && !window()->geometry().isEmpty(); +} + void QIOSWindow::setWindowState(Qt::WindowState state) { // Update the QWindow representation straight away, so that |