summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qcore_mac_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel/qcore_mac_p.h')
-rw-r--r--src/corelib/kernel/qcore_mac_p.h53
1 files changed, 34 insertions, 19 deletions
diff --git a/src/corelib/kernel/qcore_mac_p.h b/src/corelib/kernel/qcore_mac_p.h
index 535d3579b2..a21ce5e65a 100644
--- a/src/corelib/kernel/qcore_mac_p.h
+++ b/src/corelib/kernel/qcore_mac_p.h
@@ -81,6 +81,24 @@
#define QT_MAC_WEAK_IMPORT(symbol) extern "C" decltype(symbol) symbol __attribute__((weak_import));
+#if defined(__OBJC__)
+#define QT_DECLARE_NAMESPACED_OBJC_INTERFACE(classname, definition) \
+ @interface QT_MANGLE_NAMESPACE(classname) : \
+ definition \
+ @end \
+ QT_NAMESPACE_ALIAS_OBJC_CLASS(classname);
+#else
+#define QT_DECLARE_NAMESPACED_OBJC_INTERFACE(classname, definition) \
+ Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(classname)); \
+ using classname = QT_MANGLE_NAMESPACE(classname);
+#endif
+
+#define QT_FORWARD_DECLARE_OBJC_ENUM(name, type) \
+ typedef type name;
+
+Q_FORWARD_DECLARE_OBJC_CLASS(NSObject);
+Q_FORWARD_DECLARE_OBJC_CLASS(NSString);
+
QT_BEGIN_NAMESPACE
template <typename T, typename U, U (*RetainFunction)(U), void (*ReleaseFunction)(U)>
class QAppleRefCounted
@@ -307,24 +325,25 @@ QT_MAC_WEAK_IMPORT(_os_activity_current);
// -------------------------------------------------------------------------
-#if defined( __OBJC__)
-class QMacNotificationObserver
+class Q_CORE_EXPORT QMacNotificationObserver
{
public:
QMacNotificationObserver() {}
+#if defined( __OBJC__)
template<typename Functor>
- QMacNotificationObserver(id object, NSNotificationName name, Functor callback) {
+ QMacNotificationObserver(NSObject *object, NSNotificationName name, Functor callback) {
observer = [[NSNotificationCenter defaultCenter] addObserverForName:name
object:object queue:nil usingBlock:^(NSNotification *) {
callback();
}
];
}
+#endif
QMacNotificationObserver(const QMacNotificationObserver& other) = delete;
QMacNotificationObserver(QMacNotificationObserver&& other) : observer(other.observer) {
- other.observer = nil;
+ other.observer = nullptr;
}
QMacNotificationObserver &operator=(const QMacNotificationObserver& other) = delete;
@@ -332,26 +351,20 @@ public:
if (this != &other) {
remove();
observer = other.observer;
- other.observer = nil;
+ other.observer = nullptr;
}
return *this;
}
- void remove() {
- if (observer)
- [[NSNotificationCenter defaultCenter] removeObserver:observer];
- observer = nil;
- }
+ void remove();
~QMacNotificationObserver() { remove(); }
private:
- id observer = nil;
+ NSObject *observer = nullptr;
};
QT_END_NAMESPACE
-@interface QT_MANGLE_NAMESPACE(KeyValueObserver) : NSObject
-@end
-QT_NAMESPACE_ALIAS_OBJC_CLASS(KeyValueObserver);
+QT_DECLARE_NAMESPACED_OBJC_INTERFACE(KeyValueObserver, NSObject)
QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QMacKeyValueObserver
@@ -361,16 +374,17 @@ public:
QMacKeyValueObserver() {}
+#if defined( __OBJC__)
// Note: QMacKeyValueObserver must not outlive the object observed!
- QMacKeyValueObserver(id object, NSString *keyPath, Callback callback,
+ QMacKeyValueObserver(NSObject *object, NSString *keyPath, Callback callback,
NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew)
: object(object), keyPath(keyPath), callback(new Callback(callback))
{
addObserver(options);
}
+#endif
- QMacKeyValueObserver(const QMacKeyValueObserver &other)
- : QMacKeyValueObserver(other.object, other.keyPath, *other.callback.get()) {}
+ QMacKeyValueObserver(const QMacKeyValueObserver &other);
QMacKeyValueObserver(QMacKeyValueObserver &&other) { swap(other, *this); }
@@ -397,15 +411,16 @@ private:
std::swap(first.callback, second.callback);
}
+#if defined( __OBJC__)
void addObserver(NSKeyValueObservingOptions options);
+#endif
- id object = nil;
+ NSObject *object = nullptr;
NSString *keyPath = nullptr;
std::unique_ptr<Callback> callback;
static KeyValueObserver *observer;
};
-#endif
// -------------------------------------------------------------------------