Return true in the `Window::on_event` callback if event was handled

Antonio Scandurra created

Change summary

crates/gpui/src/app.rs                 | 6 ++++--
crates/gpui/src/platform.rs            | 2 +-
crates/gpui/src/platform/mac/window.rs | 4 ++--
crates/gpui/src/platform/test.rs       | 4 ++--
crates/gpui/src/presenter.rs           | 8 ++++++--
5 files changed, 15 insertions(+), 9 deletions(-)

Detailed changes

crates/gpui/src/app.rs 🔗

@@ -1774,11 +1774,13 @@ impl MutableAppContext {
                                 presenter.borrow().dispatch_path(cx.as_ref()),
                                 keystroke,
                             ) {
-                                return;
+                                return true;
                             }
                         }
 
-                        presenter.borrow_mut().dispatch_event(event, cx);
+                        presenter.borrow_mut().dispatch_event(event, cx)
+                    } else {
+                        false
                     }
                 })
             }));

crates/gpui/src/platform.rs 🔗

@@ -90,7 +90,7 @@ pub trait Dispatcher: Send + Sync {
 
 pub trait Window: WindowContext {
     fn as_any_mut(&mut self) -> &mut dyn Any;
-    fn on_event(&mut self, callback: Box<dyn FnMut(Event)>);
+    fn on_event(&mut self, callback: Box<dyn FnMut(Event) -> bool>);
     fn on_active_status_change(&mut self, callback: Box<dyn FnMut(bool)>);
     fn on_resize(&mut self, callback: Box<dyn FnMut()>);
     fn on_close(&mut self, callback: Box<dyn FnOnce()>);

crates/gpui/src/platform/mac/window.rs 🔗

@@ -164,7 +164,7 @@ pub struct Window(Rc<RefCell<WindowState>>);
 struct WindowState {
     id: usize,
     native_window: id,
-    event_callback: Option<Box<dyn FnMut(Event)>>,
+    event_callback: Option<Box<dyn FnMut(Event) -> bool>>,
     activate_callback: Option<Box<dyn FnMut(bool)>>,
     resize_callback: Option<Box<dyn FnMut()>>,
     close_callback: Option<Box<dyn FnOnce()>>,
@@ -331,7 +331,7 @@ impl platform::Window for Window {
         self
     }
 
-    fn on_event(&mut self, callback: Box<dyn FnMut(Event)>) {
+    fn on_event(&mut self, callback: Box<dyn FnMut(Event) -> bool>) {
         self.0.as_ref().borrow_mut().event_callback = Some(callback);
     }
 

crates/gpui/src/platform/test.rs 🔗

@@ -34,7 +34,7 @@ pub struct Window {
     size: Vector2F,
     scale_factor: f32,
     current_scene: Option<crate::Scene>,
-    event_handlers: Vec<Box<dyn FnMut(super::Event)>>,
+    event_handlers: Vec<Box<dyn FnMut(super::Event) -> bool>>,
     resize_handlers: Vec<Box<dyn FnMut()>>,
     close_handlers: Vec<Box<dyn FnOnce()>>,
     pub(crate) title: Option<String>,
@@ -233,7 +233,7 @@ impl super::Window for Window {
         self
     }
 
-    fn on_event(&mut self, callback: Box<dyn FnMut(crate::Event)>) {
+    fn on_event(&mut self, callback: Box<dyn FnMut(crate::Event) -> bool>) {
         self.event_handlers.push(callback);
     }
 

crates/gpui/src/presenter.rs 🔗

@@ -224,7 +224,7 @@ impl Presenter {
         }
     }
 
-    pub fn dispatch_event(&mut self, event: Event, cx: &mut MutableAppContext) {
+    pub fn dispatch_event(&mut self, event: Event, cx: &mut MutableAppContext) -> bool {
         if let Some(root_view_id) = cx.root_view_id(self.window_id) {
             let mut invalidated_views = Vec::new();
             let mut mouse_down_out_handlers = Vec::new();
@@ -366,7 +366,7 @@ impl Presenter {
             }
 
             if !handled {
-                event_cx.dispatch_event(root_view_id, &event);
+                handled = event_cx.dispatch_event(root_view_id, &event);
             }
 
             invalidated_views.extend(event_cx.invalidated_views);
@@ -384,6 +384,10 @@ impl Presenter {
                 }
                 cx.dispatch_action_any(self.window_id, &dispatch_path, directive.action.as_ref());
             }
+
+            handled
+        } else {
+            false
         }
     }