diff --git a/src/corelib/kernel/qcore_mac_p.h b/src/corelib/kernel/qcore_mac_p.h index 1161e363b7..a0802969dd 100644 --- a/src/corelib/kernel/qcore_mac_p.h +++ b/src/corelib/kernel/qcore_mac_p.h @@ -341,6 +341,50 @@ private: // ------------------------------------------------------------------------- +#if defined( __OBJC__) +class QMacScopedObserver +{ +public: + QMacScopedObserver() {} + + template + QMacScopedObserver(id object, NSNotificationName name, Functor callback) { + observer = [[NSNotificationCenter defaultCenter] addObserverForName:name + object:object queue:nil usingBlock:^(NSNotification *) { + callback(); + } + ]; + } + + QMacScopedObserver(const QMacScopedObserver& other) = delete; + QMacScopedObserver(QMacScopedObserver&& other) : observer(other.observer) { + other.observer = nil; + } + + QMacScopedObserver &operator=(const QMacScopedObserver& other) = delete; + QMacScopedObserver &operator=(QMacScopedObserver&& other) { + if (this != &other) { + remove(); + observer = other.observer; + other.observer = nil; + } + return *this; + } + + void remove() { + if (observer) + [[NSNotificationCenter defaultCenter] removeObserver:observer]; + observer = nil; + } + ~QMacScopedObserver() { remove(); } + +private: + id observer = nil; +}; +#endif + +// ------------------------------------------------------------------------- + QT_END_NAMESPACE #endif // QCORE_MAC_P_H