summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/ios
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-11-01 10:27:41 +0100
committerLiang Qi <liang.qi@qt.io>2016-11-02 09:24:11 +0100
commitd7e4980132057aa10e54137114bf65e06c455030 (patch)
tree9d6ae36efa0cf84a612bfec6cf3dd2ea7f7e3446 /src/plugins/platforms/ios
parent44c402b4bfba44480382244b8409fb3cf34d7ac1 (diff)
parenta732576a66ff2bbd9c0b41cd5f3505a4d2fbf043 (diff)
Merge remote-tracking branch 'origin/5.8' into dev
Blacklist tst_QMenuBar::taskQTBUG46812_doNotLeaveMenubarHighlighted() on macOS. Conflicts: mkspecs/features/mac/default_post.prf mkspecs/features/mac/sdk.prf mkspecs/features/uikit/default_post.prf mkspecs/features/uikit/sdk.prf src/angle/src/libEGL/libEGL.pro src/platformsupport/fontdatabases/fontdatabases.pro src/platformsupport/platformsupport.pro src/plugins/platforms/cocoa/qnswindowdelegate.mm src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp src/plugins/platforms/ios/ios.pro src/plugins/platforms/ios/kernel.pro tests/auto/widgets/widgets/qmenubar/BLACKLIST tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp Task-number: QTBUG-56853 Change-Id: If58785210feee3550892fc7768cce90e75a2416c
Diffstat (limited to 'src/plugins/platforms/ios')
-rw-r--r--src/plugins/platforms/ios/ios.pro78
-rw-r--r--src/plugins/platforms/ios/kernel.pro77
-rw-r--r--src/plugins/platforms/ios/optional/nsphotolibrarysupport/nsphotolibrarysupport.pro22
-rw-r--r--src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.json3
-rw-r--r--src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.mm64
-rw-r--r--src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h (renamed from src/plugins/platforms/ios/qiosfileengineassetslibrary.h)29
-rw-r--r--src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm (renamed from src/plugins/platforms/ios/qiosfileengineassetslibrary.mm)4
-rw-r--r--src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h (renamed from src/plugins/platforms/ios/qiosfileenginefactory.h)4
-rw-r--r--src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.h42
-rw-r--r--src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.mm66
-rw-r--r--src/plugins/platforms/ios/optional/optional.pro2
-rw-r--r--src/plugins/platforms/ios/qiosbackingstore.h2
-rw-r--r--src/plugins/platforms/ios/qiosclipboard.mm2
-rw-r--r--src/plugins/platforms/ios/qiosfiledialog.h2
-rw-r--r--src/plugins/platforms/ios/qiosfiledialog.mm79
-rw-r--r--src/plugins/platforms/ios/qiosintegration.h7
-rw-r--r--src/plugins/platforms/ios/qiosintegration.mm14
-rw-r--r--src/plugins/platforms/ios/qiosoptionalplugininterface.h59
-rw-r--r--src/plugins/platforms/ios/qiosscreen.mm4
-rw-r--r--src/plugins/platforms/ios/qiostextinputoverlay.mm3
-rw-r--r--src/plugins/platforms/ios/qiostextresponder.mm3
-rw-r--r--src/plugins/platforms/ios/qiostheme.mm2
-rw-r--r--src/plugins/platforms/ios/qiosviewcontroller.h2
-rw-r--r--src/plugins/platforms/ios/qiosviewcontroller.mm2
-rw-r--r--src/plugins/platforms/ios/quiview.mm35
25 files changed, 436 insertions, 171 deletions
diff --git a/src/plugins/platforms/ios/ios.pro b/src/plugins/platforms/ios/ios.pro
index 35e4719955..594ccefcf1 100644
--- a/src/plugins/platforms/ios/ios.pro
+++ b/src/plugins/platforms/ios/ios.pro
@@ -1,76 +1,2 @@
-TARGET = qios
-
-# QTBUG-42937: Work around linker errors caused by circular
-# dependencies between the iOS platform plugin and the user
-# application's main() when the plugin is a shared library.
-qtConfig(shared): CONFIG += static
-
-QT += core-private gui-private platformsupport-private
-LIBS += -framework Foundation -framework UIKit -framework QuartzCore -framework AudioToolbox
-
-OBJECTIVE_SOURCES = \
- plugin.mm \
- qiosintegration.mm \
- qioseventdispatcher.mm \
- qioswindow.mm \
- qiosscreen.mm \
- qiosbackingstore.mm \
- qiosapplicationdelegate.mm \
- qiosapplicationstate.mm \
- qiosviewcontroller.mm \
- qioscontext.mm \
- qiosinputcontext.mm \
- qiostheme.mm \
- qiosglobal.mm \
- qiosservices.mm \
- quiview.mm \
- quiaccessibilityelement.mm \
- qiosplatformaccessibility.mm \
- qiostextresponder.mm
-
-HEADERS = \
- qiosintegration.h \
- qioseventdispatcher.h \
- qioswindow.h \
- qiosscreen.h \
- qiosbackingstore.h \
- qiosapplicationdelegate.h \
- qiosapplicationstate.h \
- qiosviewcontroller.h \
- qioscontext.h \
- qiosinputcontext.h \
- qiostheme.h \
- qiosglobal.h \
- qiosservices.h \
- quiview.h \
- quiaccessibilityelement.h \
- qiosplatformaccessibility.h \
- qiostextresponder.h \
- qiosfileenginefactory.h
-
-!tvos {
- LIBS += -framework AssetsLibrary
- OBJECTIVE_SOURCES += \
- qiosclipboard.mm \
- qiosmenu.mm \
- qiosfileengineassetslibrary.mm \
- qiosfiledialog.mm \
- qiosmessagedialog.mm \
- qiostextinputoverlay.mm
- HEADERS += \
- qiosclipboard.h \
- qiosmenu.h \
- qiosfileengineassetslibrary.h \
- qiosfiledialog.h \
- qiosmessagedialog.h \
- qiostextinputoverlay.h
-}
-
-OTHER_FILES = \
- quiview_textinput.mm \
- quiview_accessibility.mm
-
-PLUGIN_TYPE = platforms
-PLUGIN_CLASS_NAME = QIOSIntegrationPlugin
-!equals(TARGET, $$QT_DEFAULT_QPA_PLUGIN): PLUGIN_EXTENDS = -
-load(qt_plugin)
+TEMPLATE = subdirs
+SUBDIRS = kernel.pro optional
diff --git a/src/plugins/platforms/ios/kernel.pro b/src/plugins/platforms/ios/kernel.pro
new file mode 100644
index 0000000000..0fe012071d
--- /dev/null
+++ b/src/plugins/platforms/ios/kernel.pro
@@ -0,0 +1,77 @@
+TARGET = qios
+
+# QTBUG-42937: Work around linker errors caused by circular
+# dependencies between the iOS platform plugin and the user
+# application's main() when the plugin is a shared library.
+qtConfig(shared): CONFIG += static
+
+QT += \
+ core-private gui-private \
+ clipboard_support-private fontdatabase_support-private graphics_support-private
+
+LIBS += -framework Foundation -framework UIKit -framework QuartzCore -framework AudioToolbox
+
+OBJECTIVE_SOURCES = \
+ plugin.mm \
+ qiosintegration.mm \
+ qioseventdispatcher.mm \
+ qioswindow.mm \
+ qiosscreen.mm \
+ qiosbackingstore.mm \
+ qiosapplicationdelegate.mm \
+ qiosapplicationstate.mm \
+ qiosviewcontroller.mm \
+ qioscontext.mm \
+ qiosinputcontext.mm \
+ qiostheme.mm \
+ qiosglobal.mm \
+ qiosservices.mm \
+ quiview.mm \
+ quiaccessibilityelement.mm \
+ qiosplatformaccessibility.mm \
+ qiostextresponder.mm
+
+HEADERS = \
+ qiosintegration.h \
+ qioseventdispatcher.h \
+ qioswindow.h \
+ qiosscreen.h \
+ qiosbackingstore.h \
+ qiosapplicationdelegate.h \
+ qiosapplicationstate.h \
+ qiosviewcontroller.h \
+ qioscontext.h \
+ qiosinputcontext.h \
+ qiostheme.h \
+ qiosglobal.h \
+ qiosservices.h \
+ quiview.h \
+ quiaccessibilityelement.h \
+ qiosplatformaccessibility.h \
+ qiostextresponder.h \
+ qiosfileenginefactory.h
+
+!tvos {
+ LIBS += -framework AssetsLibrary
+ OBJECTIVE_SOURCES += \
+ qiosclipboard.mm \
+ qiosmenu.mm \
+ qiosfiledialog.mm \
+ qiosmessagedialog.mm \
+ qiostextinputoverlay.mm
+ HEADERS += \
+ qiosclipboard.h \
+ qiosmenu.h \
+ qiosfiledialog.h \
+ qiosmessagedialog.h \
+ qiostextinputoverlay.h
+}
+
+OTHER_FILES = \
+ quiview_textinput.mm \
+ quiview_accessibility.mm
+
+PLUGIN_TYPE = platforms
+PLUGIN_CLASS_NAME = QIOSIntegrationPlugin
+!equals(TARGET, $$QT_DEFAULT_QPA_PLUGIN): PLUGIN_EXTENDS = -
+load(qt_plugin)
diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/nsphotolibrarysupport.pro b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/nsphotolibrarysupport.pro
new file mode 100644
index 0000000000..f4588dda03
--- /dev/null
+++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/nsphotolibrarysupport.pro
@@ -0,0 +1,22 @@
+TARGET = qiosnsphotolibrarysupport
+
+QT += core gui gui-private
+LIBS += -framework UIKit -framework AssetsLibrary
+
+HEADERS = \
+ qiosfileengineassetslibrary.h \
+ qiosfileenginefactory.h \
+ qiosimagepickercontroller.h
+
+OBJECTIVE_SOURCES = \
+ plugin.mm \
+ qiosfileengineassetslibrary.mm \
+ qiosimagepickercontroller.mm \
+
+OTHER_FILES = \
+ plugin.json
+
+PLUGIN_CLASS_NAME = QIosOptionalPlugin_NSPhotoLibrary
+PLUGIN_EXTENDS = -
+PLUGIN_TYPE = platforms/darwin
+load(qt_plugin)
diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.json b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.json
new file mode 100644
index 0000000000..4491fb3d59
--- /dev/null
+++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "NSPhotoLibrarySupport" ]
+}
diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.mm b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.mm
new file mode 100644
index 0000000000..2ec0d33a41
--- /dev/null
+++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.mm
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../qiosoptionalplugininterface.h"
+#include "../../qiosfiledialog.h"
+
+#include "qiosimagepickercontroller.h"
+#include "qiosfileenginefactory.h"
+
+QT_BEGIN_NAMESPACE
+
+class QIosOptionalPlugin_NSPhotoLibrary : public QObject, QIosOptionalPluginInterface
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID QIosOptionalPluginInterface_iid FILE "plugin.json")
+ Q_INTERFACES(QIosOptionalPluginInterface)
+
+public:
+ explicit QIosOptionalPlugin_NSPhotoLibrary(QObject* = 0) {};
+ ~QIosOptionalPlugin_NSPhotoLibrary() {}
+
+ UIViewController* createImagePickerController(QIOSFileDialog *fileDialog) const override
+ {
+ return [[[QIOSImagePickerController alloc] initWithQIOSFileDialog:fileDialog] autorelease];
+ }
+
+private:
+ QIOSFileEngineFactory m_fileEngineFactory;
+
+};
+
+QT_END_NAMESPACE
+
+#include "plugin.moc"
diff --git a/src/plugins/platforms/ios/qiosfileengineassetslibrary.h b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h
index 06f2e8d2ca..8d7cabf15b 100644
--- a/src/plugins/platforms/ios/qiosfileengineassetslibrary.h
+++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h
@@ -43,6 +43,9 @@
#include <QtCore/private/qabstractfileengine_p.h>
Q_FORWARD_DECLARE_OBJC_CLASS(ALAsset);
+
+QT_BEGIN_NAMESPACE
+
class QIOSAssetData;
class QIOSFileEngineAssetsLibrary : public QAbstractFileEngine
@@ -51,20 +54,20 @@ public:
QIOSFileEngineAssetsLibrary(const QString &fileName);
~QIOSFileEngineAssetsLibrary();
- bool open(QIODevice::OpenMode openMode) Q_DECL_OVERRIDE;
- bool close() Q_DECL_OVERRIDE;
- FileFlags fileFlags(FileFlags type) const Q_DECL_OVERRIDE;
- qint64 size() const Q_DECL_OVERRIDE;
- qint64 read(char *data, qint64 maxlen) Q_DECL_OVERRIDE;
- qint64 pos() const Q_DECL_OVERRIDE;
- bool seek(qint64 pos) Q_DECL_OVERRIDE;
- QString fileName(FileName file) const Q_DECL_OVERRIDE;
- void setFileName(const QString &file) Q_DECL_OVERRIDE;
- QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const Q_DECL_OVERRIDE;
+ bool open(QIODevice::OpenMode openMode) override;
+ bool close() override;
+ FileFlags fileFlags(FileFlags type) const override;
+ qint64 size() const override;
+ qint64 read(char *data, qint64 maxlen) override;
+ qint64 pos() const override;
+ bool seek(qint64 pos) override;
+ QString fileName(FileName file) const override;
+ void setFileName(const QString &file) override;
+ QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const override;
#ifndef QT_NO_FILESYSTEMITERATOR
- Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) Q_DECL_OVERRIDE;
- Iterator *endEntryList() Q_DECL_OVERRIDE;
+ Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override;
+ Iterator *endEntryList() override;
#endif
void setError(QFile::FileError error, const QString &str) { QAbstractFileEngine::setError(error, str); }
@@ -78,5 +81,7 @@ private:
ALAsset *loadAsset() const;
};
+QT_END_NAMESPACE
+
#endif // QIOSFILEENGINEASSETSLIBRARY_H
diff --git a/src/plugins/platforms/ios/qiosfileengineassetslibrary.mm b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm
index 560c54924a..bea2897240 100644
--- a/src/plugins/platforms/ios/qiosfileengineassetslibrary.mm
+++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm
@@ -48,6 +48,8 @@
#include <QtCore/qset.h>
#include <QtCore/qthreadstorage.h>
+QT_BEGIN_NAMESPACE
+
static QThreadStorage<QString> g_iteratorCurrentUrl;
static QThreadStorage<QPointer<QIOSAssetData> > g_assetDataCache;
@@ -472,4 +474,6 @@ QAbstractFileEngine::Iterator *QIOSFileEngineAssetsLibrary::endEntryList()
return 0;
}
+QT_END_NAMESPACE
+
#endif
diff --git a/src/plugins/platforms/ios/qiosfileenginefactory.h b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h
index 87665ac603..b143357aa5 100644
--- a/src/plugins/platforms/ios/qiosfileenginefactory.h
+++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h
@@ -44,6 +44,8 @@
#include <QtCore/private/qabstractfileengine_p.h>
#include "qiosfileengineassetslibrary.h"
+QT_BEGIN_NAMESPACE
+
class QIOSFileEngineFactory : public QAbstractFileEngineHandler
{
public:
@@ -62,4 +64,6 @@ public:
}
};
+QT_END_NAMESPACE
+
#endif // QIOSFILEENGINEFACTORY_H
diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.h b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.h
new file mode 100644
index 0000000000..df3f6b9fa3
--- /dev/null
+++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#import <UIKit/UIKit.h>
+
+#include "../../qiosfiledialog.h"
+
+@interface QIOSImagePickerController : UIImagePickerController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> {
+ QIOSFileDialog *m_fileDialog;
+}
+- (id)initWithQIOSFileDialog:(QIOSFileDialog *)fileDialog;
+@end
diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.mm b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.mm
new file mode 100644
index 0000000000..f9662b964a
--- /dev/null
+++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.mm
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#import <UIKit/UIKit.h>
+
+#include "qiosimagepickercontroller.h"
+
+@implementation QIOSImagePickerController
+
+- (id)initWithQIOSFileDialog:(QIOSFileDialog *)fileDialog
+{
+ self = [super init];
+ if (self) {
+ m_fileDialog = fileDialog;
+ [self setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
+ [self setDelegate:self];
+ }
+ return self;
+}
+
+- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
+{
+ Q_UNUSED(picker);
+ NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL];
+ QUrl fileUrl = QUrl::fromLocalFile(QString::fromNSString([url description]));
+ m_fileDialog->selectedFilesChanged(QList<QUrl>() << fileUrl);
+ emit m_fileDialog->accept();
+}
+
+- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
+{
+ Q_UNUSED(picker)
+ emit m_fileDialog->reject();
+}
+
+@end
diff --git a/src/plugins/platforms/ios/optional/optional.pro b/src/plugins/platforms/ios/optional/optional.pro
new file mode 100644
index 0000000000..5e3421a025
--- /dev/null
+++ b/src/plugins/platforms/ios/optional/optional.pro
@@ -0,0 +1,2 @@
+TEMPLATE = subdirs
+SUBDIRS = nsphotolibrarysupport
diff --git a/src/plugins/platforms/ios/qiosbackingstore.h b/src/plugins/platforms/ios/qiosbackingstore.h
index 5c37be5d38..1c072c0935 100644
--- a/src/plugins/platforms/ios/qiosbackingstore.h
+++ b/src/plugins/platforms/ios/qiosbackingstore.h
@@ -42,7 +42,7 @@
#include <qpa/qplatformbackingstore.h>
-#include <QtPlatformSupport/private/qrasterbackingstore_p.h>
+#include <QtGraphicsSupport/private/qrasterbackingstore_p.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosclipboard.mm b/src/plugins/platforms/ios/qiosclipboard.mm
index 960c9f39db..ef3b453bbf 100644
--- a/src/plugins/platforms/ios/qiosclipboard.mm
+++ b/src/plugins/platforms/ios/qiosclipboard.mm
@@ -41,7 +41,7 @@
#ifndef QT_NO_CLIPBOARD
-#include <QtPlatformSupport/private/qmacmime_p.h>
+#include <QtClipboardSupport/private/qmacmime_p.h>
#include <QtCore/QMimeData>
#include <QtGui/QGuiApplication>
diff --git a/src/plugins/platforms/ios/qiosfiledialog.h b/src/plugins/platforms/ios/qiosfiledialog.h
index 7fe24eaefe..0b56bd20bf 100644
--- a/src/plugins/platforms/ios/qiosfiledialog.h
+++ b/src/plugins/platforms/ios/qiosfiledialog.h
@@ -72,6 +72,8 @@ private:
QList<QUrl> m_selection;
QEventLoop m_eventLoop;
UIViewController *m_viewController;
+
+ bool showImagePickerDialog(QWindow *parent);
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosfiledialog.mm b/src/plugins/platforms/ios/qiosfiledialog.mm
index 70536fc5dc..c5722d33f8 100644
--- a/src/plugins/platforms/ios/qiosfiledialog.mm
+++ b/src/plugins/platforms/ios/qiosfiledialog.mm
@@ -37,52 +37,18 @@
**
****************************************************************************/
-#include "qiosfiledialog.h"
-
#import <UIKit/UIKit.h>
#include <QtCore/qstandardpaths.h>
#include <QtGui/qwindow.h>
+#include <QDebug>
-@interface QIOSImagePickerController : UIImagePickerController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> {
- QIOSFileDialog *m_fileDialog;
-}
-@end
-
-@implementation QIOSImagePickerController
-
-- (id)initWithQIOSFileDialog:(QIOSFileDialog *)fileDialog
-{
- self = [super init];
- if (self) {
- m_fileDialog = fileDialog;
- [self setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
- [self setDelegate:self];
- }
- return self;
-}
-
-- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
-{
- Q_UNUSED(picker);
- NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL];
- QUrl fileUrl = QUrl::fromLocalFile(QString::fromNSString([url description]));
- m_fileDialog->selectedFilesChanged(QList<QUrl>() << fileUrl);
- emit m_fileDialog->accept();
-}
-
-- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
-{
- Q_UNUSED(picker)
- emit m_fileDialog->reject();
-}
-
-@end
-
-// --------------------------------------------------------------------------
+#include "qiosfiledialog.h"
+#include "qiosintegration.h"
+#include "qiosoptionalplugininterface.h"
QIOSFileDialog::QIOSFileDialog()
- : m_viewController(0)
+ : m_viewController(Q_NULLPTR)
{
}
@@ -104,17 +70,36 @@ bool QIOSFileDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality window
bool acceptOpen = options()->acceptMode() == QFileDialogOptions::AcceptOpen;
QString directory = options()->initialDirectory().toLocalFile();
- if (acceptOpen && directory.startsWith(QLatin1String("assets-library:"))) {
- m_viewController = [[QIOSImagePickerController alloc] initWithQIOSFileDialog:this];
- UIWindow *window = parent ? reinterpret_cast<UIView *>(parent->winId()).window
- : [UIApplication sharedApplication].keyWindow;
- [window.rootViewController presentViewController:m_viewController animated:YES completion:nil];
- return true;
- }
+ if (acceptOpen && directory.startsWith(QLatin1String("assets-library:")))
+ return showImagePickerDialog(parent);
return false;
}
+bool QIOSFileDialog::showImagePickerDialog(QWindow *parent)
+{
+ if (!m_viewController) {
+ QFactoryLoader *plugins = QIOSIntegration::instance()->optionalPlugins();
+ for (int i = 0; i < plugins->metaData().size(); ++i) {
+ QIosOptionalPluginInterface *plugin = qobject_cast<QIosOptionalPluginInterface *>(plugins->instance(i));
+ m_viewController = [plugin->createImagePickerController(this) retain];
+ if (m_viewController)
+ break;
+ }
+ }
+
+ if (!m_viewController) {
+ qWarning() << "QIOSFileDialog: Could not resolve Qt plugin that gives access to photos on iOS";
+ return false;
+ }
+
+ UIWindow *window = parent ? reinterpret_cast<UIView *>(parent->winId()).window
+ : [UIApplication sharedApplication].keyWindow;
+ [window.rootViewController presentViewController:m_viewController animated:YES completion:nil];
+
+ return true;
+}
+
void QIOSFileDialog::hide()
{
// QFileDialog will remember the last directory set, and open subsequent dialogs in the same
@@ -126,6 +111,8 @@ void QIOSFileDialog::hide()
emit directoryEntered(QUrl::fromLocalFile(QDir::currentPath()));
[m_viewController dismissViewControllerAnimated:YES completion:nil];
+ [m_viewController release];
+ m_viewController = Q_NULLPTR;
m_eventLoop.exit();
}
diff --git a/src/plugins/platforms/ios/qiosintegration.h b/src/plugins/platforms/ios/qiosintegration.h
index d9a43a683e..54c1a1dcb7 100644
--- a/src/plugins/platforms/ios/qiosintegration.h
+++ b/src/plugins/platforms/ios/qiosintegration.h
@@ -44,8 +44,9 @@
#include <qpa/qplatformnativeinterface.h>
#include <qpa/qwindowsysteminterface.h>
+#include <QtCore/private/qfactoryloader_p.h>
+
#include "qiosapplicationstate.h"
-#include "qiosfileenginefactory.h"
#ifndef Q_OS_TVOS
#include "qiostextinputoverlay.h"
#endif
@@ -106,6 +107,8 @@ public:
void setDebugWindowManagement(bool);
bool debugWindowManagement() const;
+ QFactoryLoader *optionalPlugins() { return m_optionalPlugins; }
+
private:
QPlatformFontDatabase *m_fontDatabase;
#ifndef Q_OS_TVOS
@@ -116,7 +119,7 @@ private:
QIOSApplicationState m_applicationState;
QIOSServices *m_platformServices;
mutable QPlatformAccessibility *m_accessibility;
- QIOSFileEngineFactory m_fileEngineFactory;
+ QFactoryLoader *m_optionalPlugins;
#ifndef Q_OS_TVOS
QIOSTextInputOverlay m_textInputOverlay;
#endif
diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm
index 9799e29cf2..fbf167b514 100644
--- a/src/plugins/platforms/ios/qiosintegration.mm
+++ b/src/plugins/platforms/ios/qiosintegration.mm
@@ -51,14 +51,15 @@
#include "qiosinputcontext.h"
#include "qiostheme.h"
#include "qiosservices.h"
+#include "qiosoptionalplugininterface.h"
#include <QtGui/private/qguiapplication_p.h>
#include <qoffscreensurface.h>
#include <qpa/qplatformoffscreensurface.h>
-#include <QtPlatformSupport/private/qcoretextfontdatabase_p.h>
-#include <QtPlatformSupport/private/qmacmime_p.h>
+#include <QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h>
+#include <QtClipboardSupport/private/qmacmime_p.h>
#include <QDir>
#include <QOperatingSystemVersion>
@@ -81,6 +82,7 @@ QIOSIntegration::QIOSIntegration()
, m_inputContext(0)
, m_platformServices(new QIOSServices)
, m_accessibility(0)
+ , m_optionalPlugins(new QFactoryLoader(QIosOptionalPluginInterface_iid, QLatin1String("/platforms/darwin")))
, m_debugWindowManagement(false)
{
if (Q_UNLIKELY(![UIApplication sharedApplication])) {
@@ -125,6 +127,9 @@ QIOSIntegration::QIOSIntegration()
m_touchDevice->setCapabilities(touchCapabilities);
QWindowSystemInterface::registerTouchDevice(m_touchDevice);
QMacInternalPasteboardMime::initializeMimeTypes();
+
+ for (int i = 0; i < m_optionalPlugins->metaData().size(); ++i)
+ qobject_cast<QIosOptionalPluginInterface *>(m_optionalPlugins->instance(i))->initPlugin();
}
QIOSIntegration::~QIOSIntegration()
@@ -149,6 +154,9 @@ QIOSIntegration::~QIOSIntegration()
delete m_accessibility;
m_accessibility = 0;
+
+ delete m_optionalPlugins;
+ m_optionalPlugins = 0;
}
bool QIOSIntegration::hasCapability(Capability cap) const
@@ -228,7 +236,7 @@ QPlatformClipboard *QIOSIntegration::clipboard() const
#ifndef Q_OS_TVOS
return m_clipboard;
#else
- return 0;
+ return QPlatformIntegration::clipboard();
#endif
}
#endif
diff --git a/src/plugins/platforms/ios/qiosoptionalplugininterface.h b/src/plugins/platforms/ios/qiosoptionalplugininterface.h
new file mode 100644
index 0000000000..bcb8978e02
--- /dev/null
+++ b/src/plugins/platforms/ios/qiosoptionalplugininterface.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QIOPLUGININTERFACE_H
+#define QIOPLUGININTERFACE_H
+
+#include <QtCore/QtPlugin>
+
+#include "qiosfiledialog.h"
+
+QT_BEGIN_NAMESPACE
+
+Q_FORWARD_DECLARE_OBJC_CLASS(UIViewController);
+
+#define QIosOptionalPluginInterface_iid "org.qt-project.Qt.QPA.ios.optional"
+
+class QIosOptionalPluginInterface
+{
+public:
+ virtual ~QIosOptionalPluginInterface() {}
+ virtual void initPlugin() const {};
+ virtual UIViewController* createImagePickerController(QIOSFileDialog *) const { return Q_NULLPTR; };
+};
+
+Q_DECLARE_INTERFACE(QIosOptionalPluginInterface, QIosOptionalPluginInterface_iid)
+
+QT_END_NAMESPACE
+
+#endif // QIOPLUGININTERFACE_H
diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm
index 86bce0d70b..49268ee076 100644
--- a/src/plugins/platforms/ios/qiosscreen.mm
+++ b/src/plugins/platforms/ios/qiosscreen.mm
@@ -215,8 +215,8 @@ QIOSScreen::QIOSScreen(UIScreen *screen)
else
m_depth = 24;
- if (deviceIdentifier.contains(QRegularExpression("^iPhone(7,1|8,2)$"))) {
- // iPhone 6 Plus or iPhone 6S Plus
+ if (deviceIdentifier.contains(QRegularExpression("^iPhone(7,1|8,2|9,2|9,4)$"))) {
+ // iPhone Plus models
m_physicalDpi = 401;
} else if (deviceIdentifier.contains(QRegularExpression("^iPad(1,1|2,[1-4]|3,[1-6]|4,[1-3]|5,[3-4]|6,[7-8])$"))) {
// All iPads except the iPad Mini series
diff --git a/src/plugins/platforms/ios/qiostextinputoverlay.mm b/src/plugins/platforms/ios/qiostextinputoverlay.mm
index 462da0a978..48262dad10 100644
--- a/src/plugins/platforms/ios/qiostextinputoverlay.mm
+++ b/src/plugins/platforms/ios/qiostextinputoverlay.mm
@@ -994,7 +994,8 @@ QIOSTextInputOverlay::QIOSTextInputOverlay()
QIOSTextInputOverlay::~QIOSTextInputOverlay()
{
- disconnect(qApp, 0, this, 0);
+ if (qApp)
+ disconnect(qApp, 0, this, 0);
}
void QIOSTextInputOverlay::updateFocusObject()
diff --git a/src/plugins/platforms/ios/qiostextresponder.mm b/src/plugins/platforms/ios/qiostextresponder.mm
index d7b0a323ad..e8d216fbc2 100644
--- a/src/plugins/platforms/ios/qiostextresponder.mm
+++ b/src/plugins/platforms/ios/qiostextresponder.mm
@@ -236,6 +236,8 @@
self.inputView = [[[WrapperView alloc] initWithView:inputView] autorelease];
if (UIView *accessoryView = static_cast<UIView *>(platformData.value(kImePlatformDataInputAccessoryView).value<void *>()))
self.inputAccessoryView = [[[WrapperView alloc] initWithView:accessoryView] autorelease];
+
+#ifndef Q_OS_TVOS
if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_9_0) {
if (platformData.value(kImePlatformDataHideShortcutsBar).toBool()) {
// According to the docs, leadingBarButtonGroups/trailingBarButtonGroups should be set to nil to hide the shortcuts bar.
@@ -247,6 +249,7 @@
self.inputAssistantItem.trailingBarButtonGroups = @[trailing];
}
}
+#endif
self.undoManager.groupsByEvent = NO;
[self rebuildUndoStack];
diff --git a/src/plugins/platforms/ios/qiostheme.mm b/src/plugins/platforms/ios/qiostheme.mm
index 83a8176478..91980d3f35 100644
--- a/src/plugins/platforms/ios/qiostheme.mm
+++ b/src/plugins/platforms/ios/qiostheme.mm
@@ -44,7 +44,7 @@
#include <QtGui/QFont>
-#include <QtPlatformSupport/private/qcoretextfontdatabase_p.h>
+#include <QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h>
#include <QtGui/private/qguiapplication_p.h>
#include <qpa/qplatformintegration.h>
diff --git a/src/plugins/platforms/ios/qiosviewcontroller.h b/src/plugins/platforms/ios/qiosviewcontroller.h
index f7b190ba22..07d5535e1a 100644
--- a/src/plugins/platforms/ios/qiosviewcontroller.h
+++ b/src/plugins/platforms/ios/qiosviewcontroller.h
@@ -53,11 +53,9 @@ QT_END_NAMESPACE
#ifndef Q_OS_TVOS
@property (nonatomic, assign) UIInterfaceOrientation lockedOrientation;
-#endif
// UIViewController
@property (nonatomic, assign) BOOL prefersStatusBarHidden;
-#ifndef Q_OS_TVOS
@property (nonatomic, assign) UIStatusBarAnimation preferredStatusBarUpdateAnimation;
@property (nonatomic, assign) UIStatusBarStyle preferredStatusBarStyle;
#endif
diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm
index 0478c5b8c8..c47b6d68b1 100644
--- a/src/plugins/platforms/ios/qiosviewcontroller.mm
+++ b/src/plugins/platforms/ios/qiosviewcontroller.mm
@@ -229,9 +229,11 @@
@implementation QIOSViewController
+#ifndef Q_OS_TVOS
@synthesize prefersStatusBarHidden;
@synthesize preferredStatusBarUpdateAnimation;
@synthesize preferredStatusBarStyle;
+#endif
- (id)initWithQIOSScreen:(QT_PREPEND_NAMESPACE(QIOSScreen) *)screen
{
diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm
index 25bfa2ad90..259070216e 100644
--- a/src/plugins/platforms/ios/quiview.mm
+++ b/src/plugins/platforms/ios/quiview.mm
@@ -165,8 +165,7 @@
requestedGeometry : qt_window_private(m_qioswindow->window())->geometry;
QWindow *window = m_qioswindow->window();
- QWindowSystemInterface::handleGeometryChange(window, actualGeometry, previousGeometry);
- QWindowSystemInterface::flushWindowSystemEvents(window->inherits("QWidgetWindow") ? QEventLoop::ExcludeUserInputEvents : QEventLoop::AllEvents);
+ QWindowSystemInterface::handleGeometryChange<QWindowSystemInterface::SynchronousDelivery>(window, actualGeometry, previousGeometry);
if (actualGeometry.size() != previousGeometry.size()) {
// Trigger expose event on resize
@@ -198,8 +197,7 @@
region = QRect(QPoint(), bounds);
}
- QWindowSystemInterface::handleExposeEvent(m_qioswindow->window(), region);
- QWindowSystemInterface::flushWindowSystemEvents();
+ QWindowSystemInterface::handleExposeEvent<QWindowSystemInterface::SynchronousDelivery>(m_qioswindow->window(), region);
}
// -------------------------------------------------------------------------
@@ -224,13 +222,10 @@
qImDebug() << m_qioswindow->window() << "became first responder";
- if (qGuiApp->focusWindow() != m_qioswindow->window()) {
- QWindowSystemInterface::handleWindowActivated(m_qioswindow->window());
- QWindowSystemInterface::flushWindowSystemEvents();
- } else {
- qImDebug() << m_qioswindow->window()
- << "already active, not sending window activation";
- }
+ if (qGuiApp->focusWindow() != m_qioswindow->window())
+ QWindowSystemInterface::handleWindowActivated<QWindowSystemInterface::SynchronousDelivery>(m_qioswindow->window());
+ else
+ qImDebug() << m_qioswindow->window() << "already active, not sending window activation";
return YES;
}
@@ -265,10 +260,8 @@
qImDebug() << m_qioswindow->window() << "resigned first responder";
UIResponder *newResponder = FirstResponderCandidate::currentCandidate();
- if ([self responderShouldTriggerWindowDeactivation:newResponder]) {
- QWindowSystemInterface::handleWindowActivated(0);
- QWindowSystemInterface::flushWindowSystemEvents();
- }
+ if ([self responderShouldTriggerWindowDeactivation:newResponder])
+ QWindowSystemInterface::handleWindowActivated<QWindowSystemInterface::SynchronousDelivery>(0);
return YES;
}
@@ -358,10 +351,8 @@
- (void)sendTouchEventWithTimestamp:(ulong)timeStamp
{
- // Send touch event synchronously
QIOSIntegration *iosIntegration = QIOSIntegration::instance();
- QWindowSystemInterface::handleTouchEvent(m_qioswindow->window(), timeStamp, iosIntegration->touchDevice(), m_activeTouches.values());
- QWindowSystemInterface::flushWindowSystemEvents();
+ QWindowSystemInterface::handleTouchEvent<QWindowSystemInterface::SynchronousDelivery>(m_qioswindow->window(), timeStamp, iosIntegration->touchDevice(), m_activeTouches.values());
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
@@ -439,10 +430,8 @@
NSTimeInterval timestamp = event ? event.timestamp : [[NSProcessInfo processInfo] systemUptime];
- // Send cancel touch event synchronously
QIOSIntegration *iosIntegration = static_cast<QIOSIntegration *>(QGuiApplicationPrivate::platformIntegration());
- QWindowSystemInterface::handleTouchCancelEvent(m_qioswindow->window(), ulong(timestamp * 1000), iosIntegration->touchDevice());
- QWindowSystemInterface::flushWindowSystemEvents();
+ QWindowSystemInterface::handleTouchCancelEvent<QWindowSystemInterface::SynchronousDelivery>(m_qioswindow->window(), ulong(timestamp * 1000), iosIntegration->touchDevice());
}
- (int)mapPressTypeToKey:(UIPress*)press
@@ -465,14 +454,12 @@
// When handling the event (for example, as a back button), both press and
// release events must be handled accordingly.
- QScopedValueRollback<bool> syncRollback(QWindowSystemInterfacePrivate::synchronousWindowSystemEvents, true);
-
bool handled = false;
for (UIPress* press in presses) {
int key = [self mapPressTypeToKey:press];
if (key == Qt::Key_unknown)
continue;
- if (QWindowSystemInterface::handleKeyEvent(m_qioswindow->window(), type, key, Qt::NoModifier))
+ if (QWindowSystemInterface::handleKeyEvent<QWindowSystemInterface::SynchronousDelivery>(m_qioswindow->window(), type, key, Qt::NoModifier))
handled = true;
}