Attempt to run keystroke actions before attempting key listeners

Julia created

Change summary

crates/gpui/src/window.rs | 46 +++++++++++++++++++++++-----------------
1 file changed, 26 insertions(+), 20 deletions(-)

Detailed changes

crates/gpui/src/window.rs 🔗

@@ -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);
     }