Focus/blur views when application windows become active/inactive

This commit is contained in:
Max Brunsfeld 2022-04-22 14:18:50 -07:00
parent f881c2aa92
commit 7f64076f8d
4 changed files with 99 additions and 2 deletions

View file

@ -73,6 +73,14 @@ unsafe fn build_classes() {
sel!(windowDidResize:),
window_did_resize as extern "C" fn(&Object, Sel, id),
);
decl.add_method(
sel!(windowDidBecomeKey:),
window_did_become_key as extern "C" fn(&Object, Sel, id),
);
decl.add_method(
sel!(windowDidResignKey:),
window_did_resign_key as extern "C" fn(&Object, Sel, id),
);
decl.add_method(sel!(close), close_window as extern "C" fn(&Object, Sel));
decl.register()
};
@ -157,6 +165,7 @@ struct WindowState {
id: usize,
native_window: id,
event_callback: Option<Box<dyn FnMut(Event)>>,
activate_callback: Option<Box<dyn FnMut(bool)>>,
resize_callback: Option<Box<dyn FnMut()>>,
close_callback: Option<Box<dyn FnOnce()>>,
synthetic_drag_counter: usize,
@ -234,6 +243,7 @@ impl Window {
event_callback: None,
resize_callback: None,
close_callback: None,
activate_callback: None,
synthetic_drag_counter: 0,
executor,
scene_to_render: Default::default(),
@ -333,6 +343,10 @@ impl platform::Window for Window {
self.0.as_ref().borrow_mut().close_callback = Some(callback);
}
fn on_active_status_change(&mut self, callback: Box<dyn FnMut(bool)>) {
self.0.as_ref().borrow_mut().activate_callback = Some(callback);
}
fn prompt(
&self,
level: platform::PromptLevel,
@ -598,6 +612,26 @@ extern "C" fn window_did_resize(this: &Object, _: Sel, _: id) {
window_state.as_ref().borrow().move_traffic_light();
}
extern "C" fn window_did_become_key(this: &Object, _: Sel, _: id) {
let window_state = unsafe { get_window_state(this) };
let mut window_state_borrow = window_state.as_ref().borrow_mut();
if let Some(mut callback) = window_state_borrow.activate_callback.take() {
drop(window_state_borrow);
callback(true);
window_state.borrow_mut().activate_callback = Some(callback);
};
}
extern "C" fn window_did_resign_key(this: &Object, _: Sel, _: id) {
let window_state = unsafe { get_window_state(this) };
let mut window_state_borrow = window_state.as_ref().borrow_mut();
if let Some(mut callback) = window_state_borrow.activate_callback.take() {
drop(window_state_borrow);
callback(false);
window_state.borrow_mut().activate_callback = Some(callback);
};
}
extern "C" fn close_window(this: &Object, _: Sel) {
unsafe {
let close_callback = {