Work around st terminal resetting cursor on CSI ? u

The st terminal wrongly parses CSI ? u as DECRC. A fix has been
proposed upstream.  Let's also work around it I guess (not to mention
that querying in the first place is also sort of a workaround).
This commit is contained in:
Johannes Altmanninger 2025-01-26 11:00:35 +01:00
parent 95d61ea0fb
commit 630a06cf8f
3 changed files with 12 additions and 7 deletions

View File

@ -19,9 +19,9 @@ use crate::{
env::env_init,
input::input_terminfo_get_name,
input_common::{
enable_kitty_progressive_enhancements, terminal_protocol_hacks,
terminal_protocols_enable_ifn, CharEvent, ImplicitEvent, InputEventQueue, InputEventQueuer,
KITTY_PROGRESSIVE_ENHANCEMENTS_QUERY,
enable_kitty_progressive_enhancements, kitty_progressive_enhancements_query,
terminal_protocol_hacks, terminal_protocols_enable_ifn, CharEvent, ImplicitEvent,
InputEventQueue, InputEventQueuer,
},
key::{char_to_symbol, Key},
nix::isatty,
@ -144,7 +144,7 @@ fn setup_and_process_keys(streams: &mut IoStreams, continuous_mode: bool, verbos
terminal_protocol_hacks();
streams
.out
.append(str2wcstring(KITTY_PROGRESSIVE_ENHANCEMENTS_QUERY));
.append(str2wcstring(kitty_progressive_enhancements_query()));
if continuous_mode {
streams.err.append(L!("\n"));

View File

@ -458,7 +458,12 @@ macro_rules! kitty_progressive_enhancements {
};
}
pub const KITTY_PROGRESSIVE_ENHANCEMENTS_QUERY: &[u8] = b"\x1b[?u";
pub fn kitty_progressive_enhancements_query() -> &'static [u8] {
if std::env::var_os("TERM").is_some_and(|term| term.as_os_str().as_bytes() == b"st-256color") {
return b"";
}
b"\x1b[?u"
}
pub(crate) fn enable_kitty_progressive_enhancements() -> bool {
if IN_MIDNIGHT_COMMANDER_PRE_CSI_U.load() || IN_ITERM_PRE_CSI_U.load() {

View File

@ -82,12 +82,12 @@ use crate::history::{
};
use crate::input::init_input;
use crate::input_common::enable_kitty_progressive_enhancements;
use crate::input_common::kitty_progressive_enhancements_query;
use crate::input_common::CursorPositionBlockingWait;
use crate::input_common::CursorPositionWait;
use crate::input_common::ImplicitEvent;
use crate::input_common::InputEventQueuer;
use crate::input_common::IN_MIDNIGHT_COMMANDER_PRE_CSI_U;
use crate::input_common::KITTY_PROGRESSIVE_ENHANCEMENTS_QUERY;
use crate::input_common::{
terminal_protocol_hacks, terminal_protocols_enable_ifn, CharEvent, CharInputStyle, InputData,
ReadlineCmd,
@ -2163,7 +2163,7 @@ impl<'a> Reader<'a> {
let mut out = Outputter::stdoutput().borrow_mut();
out.begin_buffering();
// Query for kitty keyboard protocol support.
let _ = out.write(KITTY_PROGRESSIVE_ENHANCEMENTS_QUERY);
let _ = out.write(kitty_progressive_enhancements_query());
// Query for cursor position reporting support.
zelf.request_cursor_position(&mut out, CursorPositionWait::InitialFeatureProbe);
// Query for synchronized output support.