Clear pending keystrokes when an action is dispatched (#3750)

This prevents the `cmd-k` keystroke, which clears the terminal, from
staying around as a pending keystroke on the parent workspace.

Release Notes:

- N/A
This commit is contained in:
Nathan Sobo 2023-12-20 20:50:59 -07:00 committed by GitHub
commit e5ce5e8692
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 5 deletions

View File

@ -103,6 +103,8 @@ impl DispatchTree {
.keystroke_matchers
.remove_entry(self.context_stack.as_slice())
{
dbg!("preserve matcher", matcher.has_pending_keystrokes());
self.keystroke_matchers.insert(context_stack, matcher);
}
}

View File

@ -19,11 +19,6 @@ impl KeystrokeMatcher {
}
}
// todo!("replace with a function that calls an FnMut for every binding matching the action")
// pub fn bindings_for_action(&self, action_id: TypeId) -> impl Iterator<Item = &Binding> {
// self.keymap.lock().bindings_for_action(action_id)
// }
pub fn clear_pending(&mut self) {
self.pending_keystrokes.clear();
}

View File

@ -572,6 +572,17 @@ impl<'a> WindowContext<'a> {
});
}
pub(crate) fn clear_pending_keystrokes(&mut self) {
self.window
.rendered_frame
.dispatch_tree
.clear_pending_keystrokes();
self.window
.next_frame
.dispatch_tree
.clear_pending_keystrokes();
}
/// Schedules the given function to be run at the end of the current effect cycle, allowing entities
/// that are currently on the stack to be returned to the app.
pub fn defer(&mut self, f: impl FnOnce(&mut WindowContext) + 'static) {
@ -1626,6 +1637,10 @@ impl<'a> WindowContext<'a> {
}
}
if !actions.is_empty() {
self.clear_pending_keystrokes();
}
for action in actions {
self.dispatch_action_on_node(node_id, action.boxed_clone());
if !self.propagate_event {