31 lines
1 KiB
Rust
31 lines
1 KiB
Rust
// 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<ProtocolObject<dyn NSObjectProtocol>> {
|
|
let block = RcBlock::new(move |notification: NonNull<NSNotification>| {
|
|
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,
|
|
)
|
|
}
|
|
}
|