Fix bug with keymaps flickering in mouse menu (#11795)

Fixes a bug where Vim bindings would flash in the mouse context menu and
then be replaced by the default keybindings. Also fixes those bindings
not being usable while the mouse context menu was open.

Release Notes:

- Fixed bug where Vim bindings were not available when mouse context
menu was open

---------

Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
This commit is contained in:
Gus 2024-05-14 16:18:21 -07:00 committed by GitHub
parent 3da625e538
commit edadc6f938
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 17 additions and 6 deletions

View File

@ -1721,6 +1721,12 @@ impl Editor {
this
}
pub fn mouse_menu_is_focused(&self, cx: &mut WindowContext) -> bool {
self.mouse_context_menu
.as_ref()
.is_some_and(|menu| menu.context_menu.focus_handle(cx).is_focused(cx))
}
fn key_context(&self, cx: &AppContext) -> KeyContext {
let mut key_context = KeyContext::new_with_defaults();
key_context.add("Editor");

View File

@ -70,8 +70,10 @@ pub fn deploy_context_menu(
s.set_pending_display_range(point..point, SelectMode::Character);
});
let focus = cx.focused();
ui::ContextMenu::build(cx, |menu, _cx| {
menu.action("Rename Symbol", Box::new(Rename))
let builder = menu
.action("Rename Symbol", Box::new(Rename))
.action("Go to Definition", Box::new(GoToDefinition))
.action("Go to Type Definition", Box::new(GoToTypeDefinition))
.action("Go to Implementation", Box::new(GoToImplementation))
@ -84,7 +86,11 @@ pub fn deploy_context_menu(
)
.separator()
.action("Reveal in Finder", Box::new(RevealInFinder))
.action("Open in Terminal", Box::new(OpenInTerminal))
.action("Open in Terminal", Box::new(OpenInTerminal));
match focus {
Some(focus) => builder.context(focus),
None => builder,
}
})
};
let mouse_context_menu = MouseContextMenu::new(position, context_menu, cx);

View File

@ -813,12 +813,11 @@ impl Vim {
editor.set_input_enabled(!state.vim_controlled());
editor.set_autoindent(state.should_autoindent());
editor.selections.line_mode = matches!(state.mode, Mode::VisualLine);
if editor.is_focused(cx) {
if editor.is_focused(cx) || editor.mouse_menu_is_focused(cx) {
editor.set_keymap_context_layer::<Self>(state.keymap_context_layer(), cx);
// disables vim if the rename editor is focused,
// but not if the command palette is open.
// disable vim mode if a sub-editor (inline assist, rename, etc.) is focused
} else if editor.focus_handle(cx).contains_focused(cx) {
editor.remove_keymap_context_layer::<Self>(cx)
editor.remove_keymap_context_layer::<Self>(cx);
}
});
}