diff options
author | Hendrik Norkowski | 2023-11-27 19:11:16 +0000 |
---|---|---|
committer | GitHub | 2023-11-27 19:11:16 +0000 |
commit | 71fd85894b71e4be3298fcb09b2165caee2968e0 (patch) | |
tree | c08254bc6dbbf3aea32d0c5942694e6edabc2527 | |
parent | b7f98d1d9930b15f07342f67d2560aecd4ebc401 (diff) |
use crossterm cursor in editor when out of focus (#6858)
Use crossterm cursor in the editor when the terminal is out of focus to achieve consistent out-of-focus cursor behaviour
-rw-r--r-- | helix-term/src/ui/editor.rs | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 6b85d9a3..2a4169be 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -158,6 +158,7 @@ impl EditorView { view, theme, &config.cursor_shape, + self.terminal_focused, ), ); let focused_view_elements = Self::highlight_focused_view_elements(view, doc, theme); @@ -420,6 +421,7 @@ impl EditorView { view: &View, theme: &Theme, cursor_shape_config: &CursorShapeConfig, + is_terminal_focused: bool, ) -> Vec<(usize, std::ops::Range<usize>)> { let text = doc.text().slice(..); let selection = doc.selection(view.id); @@ -490,13 +492,17 @@ impl EditorView { cursor_start }; spans.push((selection_scope, range.anchor..selection_end)); - if !selection_is_primary || cursor_is_block { + // add block cursors + // skip primary cursor if terminal is unfocused - crossterm cursor is used in that case + if !selection_is_primary || (cursor_is_block && is_terminal_focused) { spans.push((cursor_scope, cursor_start..range.head)); } } else { // Reverse case. let cursor_end = next_grapheme_boundary(text, range.head); - if !selection_is_primary || cursor_is_block { + // add block cursors + // skip primary cursor if terminal is unfocused - crossterm cursor is used in that case + if !selection_is_primary || (cursor_is_block && is_terminal_focused) { spans.push((cursor_scope, range.head..cursor_end)); } // non block cursors look like they exclude the cursor @@ -1520,8 +1526,15 @@ impl Component for EditorView { fn cursor(&self, _area: Rect, editor: &Editor) -> (Option<Position>, CursorKind) { match editor.cursor() { - // All block cursors are drawn manually - (pos, CursorKind::Block) => (pos, CursorKind::Hidden), + // all block cursors are drawn manually + (pos, CursorKind::Block) => { + if self.terminal_focused { + (pos, CursorKind::Hidden) + } else { + // use crossterm cursor when terminal loses focus + (pos, CursorKind::Underline) + } + } cursor => cursor, } } |