Unnamed repository; edit this file 'description' to name the repository.
Emit OSC11/111 when suspending and restoring
C-z would not correctly reset the terminal's background color (OSC111) and resuming the suspended process would not emit OSC11. We can track the background color in the terminal backend so that when we reclaim the terminal we can set the background color in `claim` before we flush to minimize the visual gap.
Michael Davis 4 months ago
parent 75e6472 · commit 8778401
-rw-r--r--helix-tui/src/backend/termina.rs29
1 files changed, 26 insertions, 3 deletions
diff --git a/helix-tui/src/backend/termina.rs b/helix-tui/src/backend/termina.rs
index 97880ca5..784b93d5 100644
--- a/helix-tui/src/backend/termina.rs
+++ b/helix-tui/src/backend/termina.rs
@@ -77,6 +77,7 @@ pub struct TerminaBackend {
capabilities: Capabilities,
reset_cursor_command: String,
is_synchronized_output_set: bool,
+ background_color: Option<RgbColor>,
}
impl TerminaBackend {
@@ -114,6 +115,7 @@ impl TerminaBackend {
capabilities,
reset_cursor_command,
is_synchronized_output_set: false,
+ background_color: None,
})
}
@@ -392,6 +394,16 @@ impl Backend for TerminaBackend {
// things like mosh are buggy. See <https://github.com/helix-editor/helix/pull/1944>.
Csi::Edit(csi::Edit::EraseInDisplay(csi::EraseInDisplay::EraseDisplay)),
)?;
+ if let Some(color) = self.background_color {
+ write!(
+ self.terminal,
+ "{}",
+ Osc::ChangeDynamicColors(
+ osc::DynamicColorNumber::TextBackgroundColor,
+ vec![color.into()]
+ )
+ )?;
+ }
self.enable_mouse_capture()?;
self.enable_extensions()?;
@@ -422,6 +434,13 @@ impl Backend for TerminaBackend {
decreset!(FocusTracking),
decreset!(ClearAndEnableAlternateScreen),
)?;
+ if self.background_color.is_some() {
+ write!(
+ self.terminal,
+ "{}",
+ Osc::ResetDynamicColor(osc::DynamicColorNumber::TextBackgroundColor)
+ )?;
+ }
self.terminal.flush()?;
self.terminal.enter_cooked_mode()?;
Ok(())
@@ -575,13 +594,17 @@ impl Backend for TerminaBackend {
}
fn set_background_color(&mut self, color: Option<Color>) -> io::Result<()> {
+ self.background_color = match color {
+ Some(Color::Rgb(r, g, b)) => Some(RgbColor::new(r, g, b)),
+ _ => None,
+ };
write!(
self.terminal,
"{}",
- match color {
- Some(Color::Rgb(r, g, b)) => Osc::ChangeDynamicColors(
+ match self.background_color {
+ Some(color) => Osc::ChangeDynamicColors(
osc::DynamicColorNumber::TextBackgroundColor,
- vec![RgbColor::new(r, g, b).into()]
+ vec![color.into()]
),
_ => Osc::ResetDynamicColor(osc::DynamicColorNumber::TextBackgroundColor),
}