mirror of
https://github.com/helix-editor/helix
synced 2024-11-10 10:34:45 +01:00
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
This commit is contained in:
parent
b7f98d1d99
commit
71fd85894b
@ -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,
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user