65 if (!lcQpa().isInfoEnabled())
68 auto osVersion = QMacVersion::currentRuntime();
69 auto qtBuildSDK = QMacVersion::buildSDK(QMacVersion::QtLibraries);
70 auto qtDeploymentTarget = QMacVersion::deploymentTarget(QMacVersion::QtLibraries);
71 auto appBuildSDK = QMacVersion::buildSDK(QMacVersion::ApplicationBinary);
72 auto appDeploymentTarget = QMacVersion::deploymentTarget(QMacVersion::ApplicationBinary);
74 qCInfo(lcQpa,
"Loading macOS (Cocoa) platform plugin for Qt " QT_VERSION_STR
", running on macOS %d.%d.%d\n\n"
75 " Component SDK version Deployment target \n"
76 " ------------- ------------- -------------------\n"
77 " Qt " QT_VERSION_STR
" %d.%d.%d %d.%d.%d\n"
78 " Application %d.%d.%d %d.%d.%d\n",
79 osVersion.majorVersion(), osVersion.minorVersion(), osVersion.microVersion(),
80 qtBuildSDK.majorVersion(), qtBuildSDK.minorVersion(), qtBuildSDK.microVersion(),
81 qtDeploymentTarget.majorVersion(), qtDeploymentTarget.minorVersion(), qtDeploymentTarget.microVersion(),
82 appBuildSDK.majorVersion(), appBuildSDK.minorVersion(), appBuildSDK.microVersion(),
83 appDeploymentTarget.majorVersion(), appDeploymentTarget.minorVersion(), appDeploymentTarget.microVersion());
85 qCInfo(lcQpa) <<
"Running with Liquid Glass enabled:" << qt_apple_runningWithLiquidGlass();
108QCocoaIntegration::QCocoaIntegration(
const QStringList ¶mList)
109 : mOptions(parseOptions(paramList))
111#if QT_CONFIG(accessibility)
112 , mAccessibility(
new QCocoaAccessibility)
114#ifndef QT_NO_CLIPBOARD
115 , mCocoaClipboard(
new QCocoaClipboard)
117 , mCocoaDrag(
new QCocoaDrag)
118 , mNativeInterface(
new QCocoaNativeInterface)
119 , mKeyboardMapper(
new QAppleKeyMapper)
121 logVersionInformation();
124 qWarning(
"Creating multiple Cocoa platform integrations is not supported");
127#ifndef QT_NO_FREETYPE
128 if (mOptions.testFlag(UseFreeTypeFontEngine))
129 mFontDb.reset(
new QCoreTextFontDatabaseEngineFactory<QFontEngineFT>);
132 mFontDb.reset(
new QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>);
134 auto icStrs = QPlatformInputContextFactory::requested();
135 icStrs.isEmpty() ? mInputContext.reset(
new QCocoaInputContext)
136 : mInputContext.reset(QPlatformInputContextFactory::create(icStrs));
139 QMacAutoReleasePool pool;
141 NSApplication *cocoaApplication = [QNSApplication sharedApplication];
142 qt_redirectNSApplicationSendEvent();
144 if (qEnvironmentVariableIsEmpty(
"QT_MAC_DISABLE_FOREGROUND_APPLICATION_TRANSFORM")) {
150 qt_mac_transformProccessToForegroundApplication();
155 if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
158 QCocoaApplicationDelegate *newDelegate = [QCocoaApplicationDelegate sharedDelegate];
159 [newDelegate setReflectionDelegate:[cocoaApplication delegate]];
160 [cocoaApplication setDelegate:newDelegate];
163 QCocoaMenuLoader *qtMenuLoader = [QCocoaMenuLoader sharedMenuLoader];
164 [cocoaApplication setMenu:[qtMenuLoader menu]];
167 QCocoaScreen::initializeScreens();
169 QMacMimeRegistry::initializeMimeTypes();
170 QCocoaMimeTypes::initializeMimeTypes();
171 QWindowSystemInterfacePrivate::TabletEvent::setPlatformSynthesizesMouse(
false);
172 QWindowSystemInterface::registerInputDevice(
new QInputDevice(QString(
"keyboard"), 0,
173 QInputDevice::DeviceType::Keyboard, QString(),
this));
175 connect(qGuiApp, &QGuiApplication::focusWindowChanged,
176 this, &QCocoaIntegration::focusWindowChanged);
179 m_menuTrackingObserver = QMacNotificationObserver(nil,
180 NSMenuDidBeginTrackingNotification, ^{
181 QGuiApplicationPrivate::instance()->closeAllPopups();
185QCocoaIntegration::~QCocoaIntegration()
189 qt_resetNSApplicationSendEvent();
191 QMacAutoReleasePool pool;
192 if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
194 QCocoaApplicationDelegate *delegate = [QCocoaApplicationDelegate sharedDelegate];
195 [delegate removeAppleEventHandlers];
197 [[NSApplication sharedApplication] setDelegate:nil];
201 QCocoaWindow::removePopupMonitor();
203#ifndef QT_NO_CLIPBOARD
207 delete mCocoaClipboard;
208 QMacMimeRegistry::destroyMimeTypes();
211 QCocoaScreen::cleanupScreens();
231bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap)
const
242#if defined(Q_PROCESSOR_ARM)
243 if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSTahoe) {
245 static bool isSoftwareContext = []{
246 QOpenGLContext context;
248 auto *cocoaContext =
static_cast<QCocoaGLContext*>(context.handle());
249 if (cocoaContext->isSoftwareContext()) {
250 qWarning() <<
"Detected software OpenGL backend,"
251 <<
"which is known to be broken on"
252 << qUtf8Printable(QSysInfo::prettyProductName());
258 return !isSoftwareContext;
262 case BufferQueueingOpenGL:
264 case ThreadedPixmaps:
266 case MultipleWindows:
269 case ApplicationState:
270 case ApplicationIcon:
271 case BackingStoreStaticContents:
272 case OffscreenSurface:
274 case ScreenWindowGrabbing: {
275#if defined(Q_PROCESSOR_X86_64)
277 if (QOperatingSystemVersion::current() <= QOperatingSystemVersion::MacOSSonoma
278 && QTestCiDetect::ciInTestEnvironment()) {
284 case MouseCursorPositioning:
285 return AXIsProcessTrustedWithOptions(CFDictionaryRef(@{
286 id(kAXTrustedCheckOptionPrompt): @NO
289 return QPlatformIntegration::hasCapability(cap);
446QVariant QCocoaIntegration::styleHint(StyleHint hint)
const
449 case FontSmoothingGamma:
450 return QCoreTextFontEngine::fontSmoothingGamma();
451 case ShowShortcutsInContextMenus:
452 return QVariant(
false);
453 case ReplayMousePressOutsidePopup:
454 return QVariant(
false);
458 return QPlatformIntegration::styleHint(hint);
466void QCocoaIntegration::setApplicationIcon(
const QIcon &icon)
const
469 NSApp.applicationIconImage = nil;
475 const auto dockTitleSize = QSizeF::fromCGSize(NSApp.dockTile.size).toSize();
476 auto image = icon.pixmap(dockTitleSize, qGuiApp->devicePixelRatio()).toImage();
481 image = qt_mac_padToSquareImage(image);
483 NSApp.applicationIconImage = [NSImage imageFromQImage:image];
513 NSRect rect = NSMakeRect(0, 0, 32, 32);