Change summary
crates/gpui/src/window.rs | 46 +++++++++++++++++++++++-----------------
1 file changed, 26 insertions(+), 20 deletions(-)
Detailed changes
@@ -1583,36 +1583,16 @@ impl<'a> WindowContext<'a> {
let mut actions: Vec<Box<dyn Action>> = Vec::new();
- // Capture phase
let mut context_stack: SmallVec<[KeyContext; 16]> = SmallVec::new();
- self.propagate_event = true;
-
for node_id in &dispatch_path {
let node = self.window.rendered_frame.dispatch_tree.node(*node_id);
if let Some(context) = node.context.clone() {
context_stack.push(context);
}
-
- for key_listener in node.key_listeners.clone() {
- key_listener(event, DispatchPhase::Capture, self);
- if !self.propagate_event {
- return;
- }
- }
}
- // Bubble phase
for node_id in dispatch_path.iter().rev() {
- // Handle low level key events
- let node = self.window.rendered_frame.dispatch_tree.node(*node_id);
- for key_listener in node.key_listeners.clone() {
- key_listener(event, DispatchPhase::Bubble, self);
- if !self.propagate_event {
- return;
- }
- }
-
// Match keystrokes
let node = self.window.rendered_frame.dispatch_tree.node(*node_id);
if node.context.is_some() {
@@ -1633,6 +1613,7 @@ impl<'a> WindowContext<'a> {
self.clear_pending_keystrokes();
}
+ self.propagate_event = true;
for action in actions {
self.dispatch_action_on_node(node_id, action.boxed_clone());
if !self.propagate_event {
@@ -1640,6 +1621,31 @@ impl<'a> WindowContext<'a> {
return;
}
}
+
+ // Capture phase
+ for node_id in &dispatch_path {
+ let node = self.window.rendered_frame.dispatch_tree.node(*node_id);
+
+ for key_listener in node.key_listeners.clone() {
+ key_listener(event, DispatchPhase::Capture, self);
+ if !self.propagate_event {
+ return;
+ }
+ }
+ }
+
+ // Bubble phase
+ for node_id in dispatch_path.iter().rev() {
+ // Handle low level key events
+ let node = self.window.rendered_frame.dispatch_tree.node(*node_id);
+ for key_listener in node.key_listeners.clone() {
+ key_listener(event, DispatchPhase::Bubble, self);
+ if !self.propagate_event {
+ return;
+ }
+ }
+ }
+
self.dispatch_keystroke_observers(event, None);
}