From b7015f17a49501e99642009ebadabcbefc0fbad0 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Tue, 30 Jun 2026 15:55:13 +0300 Subject: fix: render ansi undercurl styles refs #895 --- src/pane/xtgettcap.rs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'src/pane/xtgettcap.rs') diff --git a/src/pane/xtgettcap.rs b/src/pane/xtgettcap.rs index f0a91df5..7d2dfc5d 100644 --- a/src/pane/xtgettcap.rs +++ b/src/pane/xtgettcap.rs @@ -174,8 +174,7 @@ fn xtgettcap_response(cap_hex: &[u8]) -> Option { } fn xtgettcap_value(cap_hex: &[u8]) -> Option> { - // Mirror only the Ghostty terminfo capabilities that this pane path can - // stand behind. Smulx is intentionally absent until underline shapes render. + // Mirror only the Ghostty terminfo capabilities that this pane path can stand behind. match cap_hex { b"5463" => Some(None), b"524742" => Some(Some(b"8")), @@ -183,6 +182,7 @@ fn xtgettcap_value(cap_hex: &[u8]) -> Option> { b"73657472676262" => Some(Some(b"\\E[48:2:%p1%d:%p2%d:%p3%dm")), b"4D73" => Some(Some(b"\\E]52;%p1%s;%p2%s\\007")), b"5375" => Some(None), + b"536D756C78" => Some(Some(b"\\E[4:%p1%dm")), b"536574756C63" => Some(Some( b"\\E[58:2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%d%;m", )), @@ -255,11 +255,25 @@ mod tests { fn tracker_ignores_unsupported_capabilities() { let mut tracker = XtgettcapQueryTracker::default(); - tracker.observe(b"\x1bP+q536D756C78;6E6F7065\x1b\\"); + tracker.observe(b"\x1bP+q6E6F7065\x1b\\"); assert!(response_bytes(tracker.drain_pending()).is_empty()); } + #[test] + fn tracker_returns_underline_style_capability() { + let mut tracker = XtgettcapQueryTracker::default(); + + tracker.observe(b"\x1bP+q536D756C78\x1b\\"); + + assert_eq!( + response_bytes(tracker.drain_pending()), + vec![Bytes::from_static( + b"\x1bP1+r536D756C78=5C455B343A25703125646D\x1b\\" + )] + ); + } + #[test] fn tracker_keeps_split_query_until_string_terminator() { let mut tracker = XtgettcapQueryTracker::default(); -- cgit v1.2.3