aboutsummaryrefslogtreecommitdiff
path: root/src/server/headless.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/headless.rs')
-rw-r--r--src/server/headless.rs154
1 files changed, 150 insertions, 4 deletions
diff --git a/src/server/headless.rs b/src/server/headless.rs
index 67a876f9..b162b8fe 100644
--- a/src/server/headless.rs
+++ b/src/server/headless.rs
@@ -778,6 +778,8 @@ impl HeadlessServer {
let terminal_size = client.terminal_size;
let outer_terminal_focus = client.outer_terminal_focus;
let host_terminal_theme = client.host_terminal_theme;
+ let host_terminal_appearance = client.host_terminal_appearance;
+ let host_terminal_appearance_explicit = client.host_terminal_appearance_explicit;
let uses_local_keybindings = client.keybindings.is_some();
let keybindings = client
.keybindings
@@ -792,9 +794,11 @@ impl HeadlessServer {
if outer_terminal_focus == Some(true) {
self.app.state.mark_active_tab_seen();
}
- if !host_terminal_theme.is_empty() {
- self.app.set_host_terminal_theme(host_terminal_theme);
- }
+ self.app.set_host_terminal_appearance_state(
+ host_terminal_appearance,
+ host_terminal_appearance_explicit,
+ );
+ self.app.set_host_terminal_theme(host_terminal_theme);
}
#[cfg(unix)]
@@ -1229,7 +1233,11 @@ impl HeadlessServer {
}
if self.foreground_client_id == Some(client_id) {
- let changed = self.app.set_host_terminal_theme(client.host_terminal_theme);
+ let mut changed = self.app.set_host_terminal_appearance_state(
+ client.host_terminal_appearance,
+ client.host_terminal_appearance_explicit,
+ );
+ changed |= self.app.set_host_terminal_theme(client.host_terminal_theme);
if changed {
self.resize_shared_runtime_to_effective_size_before_input();
}
@@ -5490,6 +5498,144 @@ next_tab = ""
}
#[test]
+ fn foreground_client_without_host_theme_clears_previous_host_theme() {
+ let mut server = test_headless_server();
+ let known_theme = crate::terminal_theme::TerminalTheme {
+ foreground: Some(crate::terminal_theme::RgbColor {
+ r: 0x10,
+ g: 0x20,
+ b: 0x30,
+ }),
+ background: Some(crate::terminal_theme::RgbColor {
+ r: 0x40,
+ g: 0x50,
+ b: 0x60,
+ }),
+ };
+ server.clients.insert(
+ 1,
+ ClientConnection::new(
+ (120, 40),
+ crate::kitty_graphics::HostCellSize::default(),
+ known_theme,
+ None,
+ 1,
+ RenderEncoding::SemanticFrame,
+ None,
+ ),
+ );
+ server.clients.insert(
+ 2,
+ ClientConnection::new(
+ (120, 40),
+ crate::kitty_graphics::HostCellSize::default(),
+ crate::terminal_theme::TerminalTheme::default(),
+ None,
+ 2,
+ RenderEncoding::SemanticFrame,
+ None,
+ ),
+ );
+
+ assert!(server.promote_client_to_foreground(1));
+ assert_eq!(server.app.state.host_terminal_theme, known_theme);
+
+ assert!(server.promote_client_to_foreground(2));
+ assert_eq!(
+ server.app.state.host_terminal_theme,
+ crate::terminal_theme::TerminalTheme::default()
+ );
+ }
+
+ #[test]
+ fn foreground_client_appearance_controls_auto_theme() {
+ let mut server = test_headless_server();
+ server.app.state.theme_runtime.auto_switch = true;
+ server.app.state.theme_runtime.dark_name = "catppuccin".to_string();
+ server.app.state.theme_runtime.light_name = "catppuccin-latte".to_string();
+ server.clients.insert(
+ 1,
+ ClientConnection::new(
+ (120, 40),
+ crate::kitty_graphics::HostCellSize::default(),
+ crate::terminal_theme::TerminalTheme {
+ foreground: None,
+ background: Some(crate::terminal_theme::RgbColor { r: 0, g: 0, b: 0 }),
+ },
+ None,
+ 1,
+ RenderEncoding::SemanticFrame,
+ None,
+ ),
+ );
+ server.clients.insert(
+ 2,
+ ClientConnection::new(
+ (120, 40),
+ crate::kitty_graphics::HostCellSize::default(),
+ crate::terminal_theme::TerminalTheme {
+ foreground: None,
+ background: Some(crate::terminal_theme::RgbColor {
+ r: 255,
+ g: 255,
+ b: 255,
+ }),
+ },
+ None,
+ 2,
+ RenderEncoding::SemanticFrame,
+ None,
+ ),
+ );
+
+ assert!(server.promote_client_to_foreground(1));
+ assert_eq!(server.app.state.theme_name, "catppuccin");
+
+ assert!(server.promote_client_to_foreground(2));
+ assert_eq!(server.app.state.theme_name, "catppuccin-latte");
+ }
+
+ #[test]
+ fn color_scheme_change_event_is_inert_on_server() {
+ let mut server = test_headless_server();
+ let initial_theme = crate::terminal_theme::TerminalTheme {
+ foreground: Some(crate::terminal_theme::RgbColor {
+ r: 0x10,
+ g: 0x20,
+ b: 0x30,
+ }),
+ background: Some(crate::terminal_theme::RgbColor {
+ r: 0x40,
+ g: 0x50,
+ b: 0x60,
+ }),
+ };
+ server.app.state.host_terminal_theme = initial_theme;
+ server.clients.insert(
+ 1,
+ ClientConnection::new(
+ (120, 40),
+ crate::kitty_graphics::HostCellSize::default(),
+ initial_theme,
+ None,
+ 1,
+ RenderEncoding::SemanticFrame,
+ None,
+ ),
+ );
+
+ let changed = server.handle_server_event(ServerEvent::ClientInput {
+ client_id: 1,
+ data: crate::raw_input::GHOSTTY_COLOR_SCHEME_DARK_REPORT.to_vec(),
+ });
+
+ assert!(!changed);
+ assert_eq!(server.foreground_client_id, None);
+ assert_eq!(server.clients[&1].host_terminal_theme, initial_theme);
+ assert_eq!(server.app.state.host_terminal_theme, initial_theme);
+ }
+
+ #[test]
fn focus_lost_updates_client_without_promoting_foreground() {
let mut server = test_headless_server();