13#if QT_CONFIG(clipboard)
14#include "qiosclipboard.h"
21#if defined(Q_OS_VISIONOS)
22#include "qiosswiftintegration.h"
25#include <QtGui/qpointingdevice.h>
26#include <QtGui/private/qguiapplication_p.h>
27#include <QtGui/private/qrhibackingstore_p.h>
29#include <qoffscreensurface.h>
30#include <qpa/qplatformoffscreensurface.h>
32#include <QtGui/private/qcoretextfontdatabase_p.h>
33#include <QtGui/private/qmacmimeregistry_p.h>
34#include <QtGui/qutimimeconverter.h>
36#include <QOperatingSystemVersion>
39#include "qioscontext.h"
42#import <AudioToolbox/AudioServices.h>
48using namespace Qt::StringLiterals;
50class QCoreTextFontEngine;
54 return static_cast<QIOSIntegration *>(QGuiApplicationPrivate::platformIntegration());
58 : m_fontDatabase(
new QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>)
59#if QT_CONFIG(clipboard)
60 , m_clipboard(
new QIOSClipboard)
66 if (Q_UNLIKELY(!qt_apple_isApplicationExtension() && !qt_apple_sharedApplication())) {
67 qFatal(
"Error: You are creating QApplication before calling UIApplicationMain.\n"
68 "If you are writing a native iOS application, and only want to use Qt for\n"
69 "parts of the application, a good place to create QApplication is from within\n"
70 "'applicationDidFinishLaunching' inside your UIApplication delegate.\n");
73 if (qEnvironmentVariableIsSet(
"QT_RUNNING_VIA_TEST_RUNNER")) {
74 QDir::temp().mkdir(
"testrunner");
75 QDir::setCurrent(QDir::temp().filePath(
"testrunner"));
80 QDir::setCurrent(QString::fromNSString(NSBundle.mainBundle.bundlePath));
84void QIOSIntegration::initialize()
86 QIOSScreen::initializeScreens();
89 m_inputContext =
new QIOSInputContext;
91 QPointingDevice::Capabilities touchCapabilities = QPointingDevice::Capability::Position | QPointingDevice::Capability::NormalizedPosition;
92#if !defined(Q_OS_VISIONOS)
93 if (UIScreen.mainScreen.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
94 touchCapabilities |= QPointingDevice::Capability::Pressure;
96 m_touchDevice =
new QPointingDevice(
"touchscreen", 0, QInputDevice::DeviceType::TouchScreen,
97 QPointingDevice::PointerType::Finger, touchCapabilities, 10, 0);
98 QWindowSystemInterface::registerInputDevice(m_touchDevice);
99#if QT_CONFIG(tabletevent)
100 QWindowSystemInterfacePrivate::TabletEvent::setPlatformSynthesizesMouse(
false);
101 m_pencilDevice =
new QPointingDevice(
102 "Apple Pencil", 0, QInputDevice::DeviceType::Stylus, QPointingDevice::PointerType::Pen,
103 QInputDevice::Capability::Position | QInputDevice::Capability::Pressure
104 | QInputDevice::Capability::XTilt | QInputDevice::Capability::YTilt
105 | QInputDevice::Capability::Hover | QInputDevice::Capability::ZPosition
106 | QInputDevice::Capability::Rotation,
108 QWindowSystemInterface::registerInputDevice(m_pencilDevice);
110 QMacMimeRegistry::initializeMimeTypes();
112 qsizetype size = QList<QPluginParsedMetaData>(m_optionalPlugins->metaData()).size();
113 for (qsizetype i = 0; i < size; ++i)
114 qobject_cast<QIosOptionalPluginInterface *>(m_optionalPlugins->instance(i))->initPlugin();
117QIOSIntegration::~QIOSIntegration()
119 delete m_fontDatabase;
122#if QT_CONFIG(clipboard)
127 QMacMimeRegistry::destroyMimeTypes();
129 delete m_inputContext;
132 foreach (QScreen *screen, QGuiApplication::screens())
133 QWindowSystemInterface::handleScreenRemoved(screen->handle());
135 delete m_platformServices;
136 m_platformServices = 0;
138 delete m_accessibility;
141 delete m_optionalPlugins;
142 m_optionalPlugins = 0;
145bool QIOSIntegration::hasCapability(Capability cap)
const
149 case BufferQueueingOpenGL:
155 case ThreadedPixmaps:
157 case MultipleWindows:
159 case WindowManagement:
161 case ApplicationState:
166 return QPlatformIntegration::hasCapability(cap);
170QPlatformWindow *QIOSIntegration::createPlatformWindow(QWindow *window)
const
172 return new QIOSWindow(window);
175QPlatformWindow *QIOSIntegration::createForeignWindow(QWindow *window, WId nativeHandle)
const
177 return new QIOSWindow(window, nativeHandle);
180QPlatformBackingStore *QIOSIntegration::createPlatformBackingStore(QWindow *window)
const
182 return new QRhiBackingStore(window);
187QPlatformOpenGLContext *QIOSIntegration::createPlatformOpenGLContext(QOpenGLContext *context)
const
189 return new QIOSContext(context);
193class QIOSOffscreenSurface :
public QPlatformOffscreenSurface
196 QIOSOffscreenSurface(QOffscreenSurface *offscreenSurface) : QPlatformOffscreenSurface(offscreenSurface) {}
198 QSurfaceFormat format()
const override
200 Q_ASSERT(offscreenSurface());
201 return offscreenSurface()->requestedFormat();
203 bool isValid()
const override {
return true; }
206QPlatformOffscreenSurface *
QIOSIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface)
const
208 return new QIOSOffscreenSurface(surface);
213 return QIOSEventDispatcher::create();
218 return m_fontDatabase;
221#if QT_CONFIG(clipboard)
222QPlatformClipboard *QIOSIntegration::clipboard()
const
230 return m_inputContext;
235 if (!m_platformServices)
238 return m_platformServices;
246 case PasswordMaskDelay:
250 case ShowIsMaximized:
252 case SetFocusOnTouchRelease:
255 return QPlatformIntegration::styleHint(hint);
269 return QPlatformIntegration::createPlatformTheme(name);
274 return m_touchDevice;
277#if QT_CONFIG(tabletevent)
278QPointingDevice *QIOSIntegration::pencilDevice()
280 return m_pencilDevice;
284#if QT_CONFIG(accessibility)
285QPlatformAccessibility *QIOSIntegration::accessibility()
const
287 if (!m_accessibility)
288 m_accessibility =
new QIOSPlatformAccessibility;
289 return m_accessibility;
300#if !TARGET_IPHONE_SIMULATOR
301 AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
307 UIApplication.sharedApplication.applicationIconBadgeNumber = number;
312#if defined(Q_OS_VISIONOS)
313void QIOSIntegration::openImmersiveSpace()
315 [ImmersiveSpaceManager openImmersiveSpace];
318void QIOSIntegration::dismissImmersiveSpace()
320 [ImmersiveSpaceManager dismissImmersiveSpace];
323void QIOSIntegration::setImmersiveSpaceCompositorLayer(CompositorLayer *layer)
325 m_immersiveSpaceCompositorLayer = layer;
328void QIOSIntegration::configureCompositorLayer(cp_layer_renderer_capabilities_t capabilities,
329 cp_layer_renderer_configuration_t configuration)
331 if (m_immersiveSpaceCompositorLayer)
332 m_immersiveSpaceCompositorLayer->configure(capabilities, configuration);
335void QIOSIntegration::renderCompositorLayer(cp_layer_renderer_t renderer)
337 if (m_immersiveSpaceCompositorLayer)
338 m_immersiveSpaceCompositorLayer->render(renderer);
341void QIOSIntegration::handleSpatialEvents(
const char *jsonString)
343 if (m_immersiveSpaceCompositorLayer) {
344 QJsonParseError error;
345 QJsonDocument doc = QJsonDocument::fromJson(QByteArray(jsonString), &error);
346 if (error.error != QJsonParseError::NoError) {
347 qWarning() <<
"Error parsing JSON: " << error.errorString();
350 m_immersiveSpaceCompositorLayer->handleSpatialEvents(doc.object());
358void *
QIOSIntegration::nativeResourceForWindow(
const QByteArray &resource, QWindow *window)
360 if (!window || !window->handle())
363 QByteArray lowerCaseResource = resource.toLower();
365 QIOSWindow *platformWindow =
static_cast<QIOSWindow *>(window->handle());
367 if (lowerCaseResource ==
"uiview")
368 return reinterpret_cast<
void *>(platformWindow->winId());
377#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