102 lines
3.3 KiB
Rust
102 lines
3.3 KiB
Rust
|
|
use cocoa::base::id;
|
||
|
|
use objc::{runtime::{Class, Object, Sel, BOOL, YES}, declare::ClassDecl};
|
||
|
|
|
||
|
|
use platform_impl::platform::app_state::AppState;
|
||
|
|
|
||
|
|
pub struct AppDelegateClass(pub *const Class);
|
||
|
|
unsafe impl Send for AppDelegateClass {}
|
||
|
|
unsafe impl Sync for AppDelegateClass {}
|
||
|
|
|
||
|
|
lazy_static! {
|
||
|
|
pub static ref APP_DELEGATE_CLASS: AppDelegateClass = unsafe {
|
||
|
|
let superclass = class!(NSResponder);
|
||
|
|
let mut decl = ClassDecl::new("WinitAppDelegate", superclass).unwrap();
|
||
|
|
|
||
|
|
decl.add_method(
|
||
|
|
sel!(applicationDidFinishLaunching:),
|
||
|
|
did_finish_launching as extern fn(&Object, Sel, id) -> BOOL,
|
||
|
|
);
|
||
|
|
decl.add_method(
|
||
|
|
sel!(applicationDidBecomeActive:),
|
||
|
|
did_become_active as extern fn(&Object, Sel, id),
|
||
|
|
);
|
||
|
|
decl.add_method(
|
||
|
|
sel!(applicationWillResignActive:),
|
||
|
|
will_resign_active as extern fn(&Object, Sel, id),
|
||
|
|
);
|
||
|
|
decl.add_method(
|
||
|
|
sel!(applicationWillEnterForeground:),
|
||
|
|
will_enter_foreground as extern fn(&Object, Sel, id),
|
||
|
|
);
|
||
|
|
decl.add_method(
|
||
|
|
sel!(applicationDidEnterBackground:),
|
||
|
|
did_enter_background as extern fn(&Object, Sel, id),
|
||
|
|
);
|
||
|
|
decl.add_method(
|
||
|
|
sel!(applicationWillTerminate:),
|
||
|
|
will_terminate as extern fn(&Object, Sel, id),
|
||
|
|
);
|
||
|
|
|
||
|
|
AppDelegateClass(decl.register())
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
extern fn did_finish_launching(_: &Object, _: Sel, _: id) -> BOOL {
|
||
|
|
trace!("Triggered `didFinishLaunching`");
|
||
|
|
AppState::launched();
|
||
|
|
trace!("Completed `didFinishLaunching`");
|
||
|
|
YES
|
||
|
|
}
|
||
|
|
|
||
|
|
extern fn did_become_active(_: &Object, _: Sel, _: id) {
|
||
|
|
trace!("Triggered `didBecomeActive`");
|
||
|
|
/*unsafe {
|
||
|
|
HANDLER.lock().unwrap().handle_nonuser_event(Event::Suspended(false))
|
||
|
|
}*/
|
||
|
|
trace!("Completed `didBecomeActive`");
|
||
|
|
}
|
||
|
|
|
||
|
|
extern fn will_resign_active(_: &Object, _: Sel, _: id) {
|
||
|
|
trace!("Triggered `willResignActive`");
|
||
|
|
/*unsafe {
|
||
|
|
HANDLER.lock().unwrap().handle_nonuser_event(Event::Suspended(true))
|
||
|
|
}*/
|
||
|
|
trace!("Completed `willResignActive`");
|
||
|
|
}
|
||
|
|
|
||
|
|
extern fn will_enter_foreground(_: &Object, _: Sel, _: id) {
|
||
|
|
trace!("Triggered `willEnterForeground`");
|
||
|
|
trace!("Completed `willEnterForeground`");
|
||
|
|
}
|
||
|
|
|
||
|
|
extern fn did_enter_background(_: &Object, _: Sel, _: id) {
|
||
|
|
trace!("Triggered `didEnterBackground`");
|
||
|
|
trace!("Completed `didEnterBackground`");
|
||
|
|
}
|
||
|
|
|
||
|
|
extern fn will_terminate(_: &Object, _: Sel, _: id) {
|
||
|
|
trace!("Triggered `willTerminate`");
|
||
|
|
/*unsafe {
|
||
|
|
let app: id = msg_send![class!(UIApplication), sharedApplication];
|
||
|
|
let windows: id = msg_send![app, windows];
|
||
|
|
let windows_enum: id = msg_send![windows, objectEnumerator];
|
||
|
|
let mut events = Vec::new();
|
||
|
|
loop {
|
||
|
|
let window: id = msg_send![windows_enum, nextObject];
|
||
|
|
if window == nil {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
let is_winit_window: BOOL = msg_send![window, isKindOfClass:class!(WinitUIWindow)];
|
||
|
|
if is_winit_window == YES {
|
||
|
|
events.push(Event::WindowEvent {
|
||
|
|
window_id: RootWindowId(window.into()),
|
||
|
|
event: WindowEvent::Destroyed,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
HANDLER.lock().unwrap().handle_nonuser_events(events);
|
||
|
|
HANDLER.lock().unwrap().terminated();
|
||
|
|
}*/
|
||
|
|
trace!("Completed `willTerminate`");
|
||
|
|
}
|