Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/app/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,8 @@ impl App {
changes_view
}
crate::raw_input::RawInputEvent::OuterFocusGained => {
#[cfg(not(windows))]
self.query_host_terminal_appearance();
self.send_outer_focus_event(crate::ghostty::FocusEvent::Gained);
if self.state.redraw_on_focus_gained {
self.request_repaint();
Expand Down
9 changes: 9 additions & 0 deletions src/app/theme_sync.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
use super::App;

impl App {
#[cfg(not(windows))]
pub(super) fn query_host_terminal_appearance(&self) {
use std::io::Write;

let _ = std::io::stdout()
.write_all(crate::terminal_theme::HOST_COLOR_SCHEME_QUERY_SEQUENCE.as_bytes());
let _ = std::io::stdout().flush();
}

pub(super) fn query_host_terminal_theme(&self) {
use std::io::Write;

Expand Down
25 changes: 25 additions & 0 deletions src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1442,6 +1442,9 @@ async fn run_client_loop(
) {
state.request_repaint();
}
if crate::raw_input::events_require_host_terminal_appearance_query(&events) {
query_host_terminal_appearance();
Comment thread
greptile-apps[bot] marked this conversation as resolved.
}
if crate::raw_input::events_require_host_terminal_theme_query(&events) {
query_host_terminal_theme();
}
Expand Down Expand Up @@ -2281,6 +2284,17 @@ fn resize_poll_loop(
// Logging
// ---------------------------------------------------------------------------

#[cfg(any(not(windows), test))]
fn query_host_terminal_appearance() {
let _ = write_host_terminal_appearance_query(io::stdout());
}

#[cfg(any(not(windows), test))]
fn write_host_terminal_appearance_query(mut writer: impl io::Write) -> io::Result<()> {
writer.write_all(crate::terminal_theme::HOST_COLOR_SCHEME_QUERY_SEQUENCE.as_bytes())?;
writer.flush()
}

/// Initialize logging for the client process.
fn query_host_terminal_theme() {
let _ = write_host_terminal_theme_query(io::stdout());
Expand Down Expand Up @@ -2672,6 +2686,13 @@ mod tests {
assert!(!text.contains("d=A"));
}

#[test]
fn write_host_terminal_appearance_query_emits_mode_2031_query() {
let mut output = Vec::new();
write_host_terminal_appearance_query(&mut output).unwrap();
assert_eq!(output, b"\x1b[?996n");
}

#[test]
fn write_host_terminal_theme_query_emits_osc_queries() {
let mut output = Vec::new();
Expand All @@ -2680,6 +2701,10 @@ mod tests {
output,
crate::terminal_theme::host_terminal_theme_query_sequence().as_bytes()
);
assert!(!output
.windows(crate::terminal_theme::HOST_COLOR_SCHEME_QUERY_SEQUENCE.len())
.any(|window| window
== crate::terminal_theme::HOST_COLOR_SCHEME_QUERY_SEQUENCE.as_bytes()));
}

#[test]
Expand Down
21 changes: 21 additions & 0 deletions src/raw_input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,13 @@ pub(crate) fn events_require_host_surface_redraw(
.any(|event| matches!(event, RawInputEvent::OuterFocusGained))
}

#[cfg(any(not(windows), test))]
pub(crate) fn events_require_host_terminal_appearance_query(events: &[RawInputEvent]) -> bool {
events
.iter()
.any(|event| matches!(event, RawInputEvent::OuterFocusGained))
}

#[cfg(any(not(windows), test))]
pub(crate) fn events_require_host_terminal_theme_query(events: &[RawInputEvent]) -> bool {
events
Expand Down Expand Up @@ -1544,6 +1551,20 @@ mod tests {
assert!(!events_require_host_surface_redraw(&events, true));
}

#[test]
fn outer_focus_gained_requests_host_appearance_query() {
let gained = parse_raw_input_bytes_sync(b"\x1b[I");
let lost = parse_raw_input_bytes_sync(b"\x1b[O");
let scheme_report = parse_raw_input_bytes_sync(b"\x1b[?997;1n");

assert!(events_require_host_terminal_appearance_query(&gained));
assert!(!events_require_host_terminal_appearance_query(&lost));
assert!(!events_require_host_terminal_appearance_query(
&scheme_report
));
assert!(events_require_host_terminal_theme_query(&scheme_report));
}

#[test]
fn parses_ghostty_color_scheme_reports() {
for bytes in [
Expand Down
2 changes: 2 additions & 0 deletions src/terminal_theme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ pub enum DefaultColorKind {
}

pub const HOST_COLOR_QUERY_SEQUENCE: &str = "\x1b]10;?\x1b\\\x1b]11;?\x1b\\";
#[cfg(any(not(windows), test))]
pub const HOST_COLOR_SCHEME_QUERY_SEQUENCE: &str = "\x1b[?996n";
pub const HOST_COLOR_SCHEME_REPORT_ENABLE_SEQUENCE: &str = "\x1b[?2031h";
pub const HOST_COLOR_SCHEME_REPORT_DISABLE_SEQUENCE: &str = "\x1b[?2031l";

Expand Down
Loading