13#if QT_CONFIG(clipboard)
14#include "qiosclipboard.h"
22#if defined(Q_OS_VISIONOS)
23#include "qiosswiftintegration.h"
26#include <QtGui/qpointingdevice.h>
27#include <QtGui/private/qguiapplication_p.h>
28#include <QtGui/private/qrhibackingstore_p.h>
30#include <qoffscreensurface.h>
31#include <qpa/qplatformoffscreensurface.h>
33#include <QtGui/private/qcoretextfontdatabase_p.h>
34#include <QtGui/private/qmacmimeregistry_p.h>
35#include <QtGui/qutimimeconverter.h>
37#include <QOperatingSystemVersion>
40#include "qioscontext.h"
43#import <AudioToolbox/AudioServices.h>
49using namespace Qt::StringLiterals;
51class QCoreTextFontEngine;
55 return static_cast<QIOSIntegration *>(QGuiApplicationPrivate::platformIntegration());
59 : m_fontDatabase(
new QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>)
60#if QT_CONFIG(clipboard)
61 , m_clipboard(
new QIOSClipboard)
67 if (Q_UNLIKELY(!qt_apple_isApplicationExtension() && !qt_apple_sharedApplication())) {
68 qFatal(
"Error: You are creating QApplication before calling UIApplicationMain.\n"
69 "If you are writing a native iOS application, and only want to use Qt for\n"
70 "parts of the application, a good place to create QApplication is from within\n"
71 "'applicationDidFinishLaunching' inside your UIApplication delegate.\n");
75void QIOSIntegration::initialize()
77 QIOSScreen::initializeScreens();
80 m_inputContext =
new QIOSInputContext;
82 QPointingDevice::Capabilities touchCapabilities = QPointingDevice::Capability::Position | QPointingDevice::Capability::NormalizedPosition;
83#if !defined(Q_OS_VISIONOS)
84 if (UIScreen.mainScreen.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
85 touchCapabilities |= QPointingDevice::Capability::Pressure;
87 m_touchDevice =
new QPointingDevice(
"touchscreen", 0, QInputDevice::DeviceType::TouchScreen,
88 QPointingDevice::PointerType::Finger, touchCapabilities, 10, 0);
89 QWindowSystemInterface::registerInputDevice(m_touchDevice);
90#if QT_CONFIG(tabletevent)
91 QWindowSystemInterfacePrivate::TabletEvent::setPlatformSynthesizesMouse(
false);
92 m_pencilDevice =
new QPointingDevice(
93 "Apple Pencil", 0, QInputDevice::DeviceType::Stylus, QPointingDevice::PointerType::Pen,
94 QInputDevice::Capability::Position | QInputDevice::Capability::Pressure
95 | QInputDevice::Capability::XTilt | QInputDevice::Capability::YTilt
96 | QInputDevice::Capability::Hover | QInputDevice::Capability::ZPosition
97 | QInputDevice::Capability::Rotation,
99 QWindowSystemInterface::registerInputDevice(m_pencilDevice);
101 QMacMimeRegistry::initializeMimeTypes();
103 qsizetype size = QList<QPluginParsedMetaData>(m_optionalPlugins->metaData()).size();
104 for (qsizetype i = 0; i < size; ++i)
105 qobject_cast<QIosOptionalPluginInterface *>(m_optionalPlugins->instance(i))->initPlugin();
109#if !defined(Q_OS_VISIONOS)
110 if (QIOSEventDispatcher::isQtApplication()) {
111 qCDebug(lcQpaWindowScene) <<
"Replacing application delegate"
112 << UIApplication.sharedApplication.delegate <<
"with QIOSApplicationDelegate";
113 UIApplication.sharedApplication.delegate = [QIOSApplicationDelegate
new];
118QIOSIntegration::~QIOSIntegration()
120 delete m_fontDatabase;
123#if QT_CONFIG(clipboard)
128 QMacMimeRegistry::destroyMimeTypes();
130 delete m_inputContext;
133 foreach (QScreen *screen, QGuiApplication::screens())
134 QWindowSystemInterface::handleScreenRemoved(screen->handle());
136 delete m_platformServices;
137 m_platformServices = 0;
139 delete m_accessibility;
142 delete m_optionalPlugins;
143 m_optionalPlugins = 0;
146bool QIOSIntegration::hasCapability(Capability cap)
const
150 case BufferQueueingOpenGL:
156 case ThreadedPixmaps:
158 case MultipleWindows:
160 case WindowManagement:
162 case ApplicationState:
167 return QPlatformIntegration::hasCapability(cap);
171QPlatformWindow *QIOSIntegration::createPlatformWindow(QWindow *window)
const
173 return new QIOSWindow(window);
176QPlatformWindow *QIOSIntegration::createForeignWindow(QWindow *window, WId nativeHandle)
const
178 return new QIOSWindow(window, nativeHandle);
181QPlatformBackingStore *QIOSIntegration::createPlatformBackingStore(QWindow *window)
const
183 return new QRhiBackingStore(window);
188QPlatformOpenGLContext *QIOSIntegration::createPlatformOpenGLContext(QOpenGLContext *context)
const
190 return new QIOSContext(context);
194class QIOSOffscreenSurface :
public QPlatformOffscreenSurface
197 QIOSOffscreenSurface(QOffscreenSurface *offscreenSurface) : QPlatformOffscreenSurface(offscreenSurface) {}
199 QSurfaceFormat format()
const override
201 Q_ASSERT(offscreenSurface());
202 return offscreenSurface()->requestedFormat();
204 bool isValid()
const override {
return true; }
207QPlatformOffscreenSurface *
QIOSIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface)
const
209 return new QIOSOffscreenSurface(surface);
214 return QIOSEventDispatcher::create();
219 return m_fontDatabase;
222#if QT_CONFIG(clipboard)
223QPlatformClipboard *QIOSIntegration::clipboard()
const
231 return m_inputContext;
236 if (!m_platformServices)
239 return m_platformServices;
247 case PasswordMaskDelay:
251 case ShowIsMaximized:
253 case SetFocusOnTouchRelease:
256 return QPlatformIntegration::styleHint(hint);
270 return QPlatformIntegration::createPlatformTheme(name);
275 return m_touchDevice;
278#if QT_CONFIG(tabletevent)
279QPointingDevice *QIOSIntegration::pencilDevice()
281 return m_pencilDevice;
285#if QT_CONFIG(accessibility)
286QPlatformAccessibility *QIOSIntegration::accessibility()
const
288 if (!m_accessibility)
289 m_accessibility =
new QIOSPlatformAccessibility;
290 return m_accessibility;
301#if !TARGET_IPHONE_SIMULATOR
302 AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
308 UIApplication.sharedApplication.applicationIconBadgeNumber = number;
313#if defined(Q_OS_VISIONOS)
314void QIOSIntegration::openImmersiveSpace()
316 [ImmersiveSpaceManager openImmersiveSpace];
319void QIOSIntegration::dismissImmersiveSpace()
321 [ImmersiveSpaceManager dismissImmersiveSpace];
324void QIOSIntegration::setImmersiveSpaceCompositorLayer(CompositorLayer *layer)
326 m_immersiveSpaceCompositorLayer = layer;
329void QIOSIntegration::configureCompositorLayer(cp_layer_renderer_capabilities_t capabilities,
330 cp_layer_renderer_configuration_t configuration)
332 if (m_immersiveSpaceCompositorLayer)
333 m_immersiveSpaceCompositorLayer->configure(capabilities, configuration);
336void QIOSIntegration::renderCompositorLayer(cp_layer_renderer_t renderer)
338 if (m_immersiveSpaceCompositorLayer)
339 m_immersiveSpaceCompositorLayer->render(renderer);
342void QIOSIntegration::handleSpatialEvents(
const char *jsonString)
344 if (m_immersiveSpaceCompositorLayer) {
345 QJsonParseError error;
346 QJsonDocument doc = QJsonDocument::fromJson(QByteArray(jsonString), &error);
347 if (error.error != QJsonParseError::NoError) {
348 qWarning() <<
"Error parsing JSON: " << error.errorString();
351 m_immersiveSpaceCompositorLayer->handleSpatialEvents(doc.object());
359void *
QIOSIntegration::nativeResourceForWindow(
const QByteArray &resource, QWindow *window)
361 if (!window || !window->handle())
364 QByteArray lowerCaseResource = resource.toLower();
366 QIOSWindow *platformWindow =
static_cast<QIOSWindow *>(window->handle());
368 if (lowerCaseResource ==
"uiview")
369 return reinterpret_cast<
void *>(platformWindow->winId());
378#include "moc_qiosintegration.cpp"
QVariant styleHint(StyleHint hint) const override
QPlatformTheme * createPlatformTheme(const QString &name) const override
void beep() const override
static QIOSIntegration * instance()
void setApplicationBadge(qint64 number) override
QPointingDevice * touchDevice()
QStringList themeNames() const override
QPlatformNativeInterface * nativeInterface() const override
QAbstractEventDispatcher * createEventDispatcher() const override
Factory function for the GUI event dispatcher.
QPlatformServices * services() const override
QPlatformInputContext * inputContext() const override
Returns the platforms input context.
QPlatformFontDatabase * fontDatabase() const override
Accessor for the platform integration's fontdatabase.
Combined button and popup list for selecting options.
#define QIosOptionalPluginInterface_iid