From 09d21c1decfdd58eba6c1aefe459793c5255922e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Sun, 5 Aug 2018 12:56:05 +0200 Subject: [PATCH] Add private helper class QMacScopedObserver Change-Id: I993ce32c1f6a6eabdce8d5b2b52d8edb28ca2bfa Reviewed-by: Simon Hausmann --- src/corelib/kernel/qcore_mac_p.h | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) 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