Skip to content

Commit

Permalink
Fix bug with keymaps flickering in mouse menu (#11795)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
babyccino and ConradIrwin committed May 14, 2024
1 parent 3da625e commit edadc6f
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 6 deletions.
6 changes: 6 additions & 0 deletions crates/editor/src/editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
10 changes: 8 additions & 2 deletions crates/editor/src/mouse_context_menu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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);
Expand Down
7 changes: 3 additions & 4 deletions crates/vim/src/vim.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
});
}
Expand Down

0 comments on commit edadc6f

Please sign in to comment.