// NOTE: This is symlinked to be contained in both the AppKit and UIKit implementations. use std::ptr::NonNull; use block2::RcBlock; use objc2::rc::Retained; use objc2::runtime::ProtocolObject; use objc2_foundation::{ NSNotification, NSNotificationCenter, NSNotificationName, NSObjectProtocol, }; /// Observe the given notification. /// /// This is used in Winit as an alternative to declaring an application delegate, as we want to /// give the user full control over those. pub(crate) fn create_observer( center: &NSNotificationCenter, name: &NSNotificationName, handler: impl Fn(&NSNotification) + 'static, ) -> Retained> { let block = RcBlock::new(move |notification: NonNull| { handler(unsafe { notification.as_ref() }); }); unsafe { center.addObserverForName_object_queue_usingBlock( Some(name), None, // No sender filter None, // No queue, run on posting thread (i.e. main thread) &block, ) } }