Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qiosapplicationstate.mm
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include "qiosglobal.h"
7#include "qiosintegration.h"
8
9#include <qpa/qwindowsysteminterface.h>
10#include <QtCore/qcoreapplication.h>
11#include <QtCore/private/qcore_mac_p.h>
12
13#include <QtGui/private/qguiapplication_p.h>
14
16
17using namespace Qt::StringLiterals;
18
20{
21 NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
22 NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
23
24 // Map between notifications and corresponding application state. Note that
25 // there's no separate notification for moving to UIApplicationStateInactive,
26 // so we use UIApplicationWillResignActiveNotification as an intermediate.
27 using NotificationMap = QMap<NSNotificationName, UIApplicationState>;
28 static auto notifications = qt_apple_isApplicationExtension() ? NotificationMap{
29 { NSExtensionHostWillEnterForegroundNotification, UIApplicationStateInactive },
30 { NSExtensionHostDidBecomeActiveNotification, UIApplicationStateActive },
31 { NSExtensionHostWillResignActiveNotification, UIApplicationStateInactive },
32 { NSExtensionHostDidEnterBackgroundNotification, UIApplicationStateBackground },
33 } : NotificationMap{
34 { UIApplicationWillEnterForegroundNotification, UIApplicationStateInactive },
35 { UIApplicationDidBecomeActiveNotification, UIApplicationStateActive },
36 { UIApplicationWillResignActiveNotification, UIApplicationStateInactive },
37 { UIApplicationDidEnterBackgroundNotification, UIApplicationStateBackground },
38 };
39
40 for (auto i = notifications.constBegin(); i != notifications.constEnd(); ++i) {
41 [notificationCenter addObserverForName:i.key() object:nil queue:mainQueue
42 usingBlock:^void(NSNotification *notification) {
43 NSRange nameRange = NSMakeRange(2, notification.name.length - 14);
44 QString reason = QString::fromNSString([notification.name substringWithRange:nameRange]);
46 }];
47 }
48
50 // Extensions are not allowed to access UIApplication, so we assume the state is active
52 "Extension loaded, assuming state is active"_L1);
53 } else {
54 // Initialize correct startup state, which may not be the Qt default (inactive)
55 UIApplicationState startupState = qt_apple_sharedApplication().applicationState;
56 QIOSApplicationState::handleApplicationStateChanged(startupState, "Application loaded"_L1);
57 }
58}
60
62{
64 UIApplicationState startupState = qt_apple_sharedApplication().applicationState;
65 QIOSApplicationState::handleApplicationStateChanged(startupState, "Application launched"_L1);
66 }
67}
68
69void QIOSApplicationState::handleApplicationStateChanged(UIApplicationState uiState, const QString &reason)
70{
73 qCDebug(lcQpaApplication) << qPrintable(reason) << "- moving from" << oldState << "to" << newState;
74
75 if (QIOSIntegration *integration = QIOSIntegration::instance()) {
76 emit integration->applicationState.applicationStateWillChange(oldState, newState);
78 emit integration->applicationState.applicationStateDidChange(oldState, newState);
79 qCDebug(lcQpaApplication) << "done moving to" << newState;
80 } else {
81 qCDebug(lcQpaApplication) << "no platform integration yet, setting state directly";
83 }
84}
85
87{
88 switch (state) {
89 case UIApplicationStateActive: return Qt::ApplicationActive;
90 case UIApplicationStateInactive: return Qt::ApplicationInactive;
91 case UIApplicationStateBackground: return Qt::ApplicationSuspended;
92 }
93}
94
95#include "moc_qiosapplicationstate.cpp"
96
static Qt::ApplicationState applicationState
static Qt::ApplicationState applicationState()
static void handleApplicationStateChanged(UIApplicationState state, const QString &reason)
static Qt::ApplicationState toQtApplicationState(UIApplicationState state)
static QIOSIntegration * instance()
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static void handleApplicationStateChanged(Qt::ApplicationState newState, bool forcePropagate=false)
else opt state
[0]
void newState(QList< State > &states, const char *token, const char *lexem, bool pre)
Combined button and popup list for selecting options.
ApplicationState
Definition qnamespace.h:262
@ ApplicationSuspended
Definition qnamespace.h:263
@ ApplicationActive
Definition qnamespace.h:266
@ ApplicationInactive
Definition qnamespace.h:265
bool qt_apple_isApplicationExtension()
Definition qcore_mac.mm:424
AppleApplication * qt_apple_sharedApplication()
Definition qcore_mac.mm:431
Q_CONSTRUCTOR_FUNCTION(qt_apple_check_os_version)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
static void qRegisterApplicationStateNotifications()
#define qCDebug(category,...)
GLuint object
[3]
#define qPrintable(string)
Definition qstring.h:1531
#define emit
QQueue< int > queue
[0]