Mercurial > forks > helix
changeset 5783:ae032eb18198
avoid cnorm on certain terminals (#10769)
using a terminfo's cnorm doesn't reset the cursor for many terminals,
see issue: #10089
author | Christopher Bayliss <cjbdev@icloud.com> |
---|---|
date | Tue, 28 May 2024 21:15:53 +1000 |
parents | e49c8b7616f3 |
children | 416c736004e1 |
files | helix-tui/src/backend/crossterm.rs |
diffstat | 1 files changed, 22 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/helix-tui/src/backend/crossterm.rs Sun May 26 21:22:40 2024 -0400 +++ b/helix-tui/src/backend/crossterm.rs Tue May 28 21:15:53 2024 +1000 @@ -23,13 +23,33 @@ fmt, io::{self, Write}, }; +use termini::TermInfo; fn term_program() -> Option<String> { - std::env::var("TERM_PROGRAM").ok() + // Some terminals don't set $TERM_PROGRAM + match std::env::var("TERM_PROGRAM") { + Err(_) => std::env::var("TERM").ok(), + Ok(term_program) => Some(term_program), + } } fn vte_version() -> Option<usize> { std::env::var("VTE_VERSION").ok()?.parse().ok() } +fn reset_cursor_approach(terminfo: TermInfo) -> String { + let mut reset_str = "\x1B[0 q".to_string(); + + if let Some(termini::Value::Utf8String(se_str)) = terminfo.extended_cap("Se") { + reset_str.push_str(se_str); + }; + + reset_str.push_str( + terminfo + .utf8_string_cap(termini::StringCapability::CursorNormal) + .unwrap_or(""), + ); + + reset_str +} /// Describes terminal capabilities like extended underline, truecolor, etc. #[derive(Clone, Debug)] @@ -69,10 +89,7 @@ || t.extended_cap("Su").is_some() || vte_version() >= Some(5102) || matches!(term_program().as_deref(), Some("WezTerm")), - reset_cursor_command: t - .utf8_string_cap(termini::StringCapability::CursorNormal) - .unwrap_or("\x1B[0 q") - .to_string(), + reset_cursor_command: reset_cursor_approach(t), }, } }