aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Norkowski2023-11-27 19:11:16 +0000
committerGitHub2023-11-27 19:11:16 +0000
commit71fd85894b71e4be3298fcb09b2165caee2968e0 (patch)
treec08254bc6dbbf3aea32d0c5942694e6edabc2527
parentb7f98d1d9930b15f07342f67d2560aecd4ebc401 (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.rs21
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,
}
}