diff options
Diffstat (limited to 'src/app/theme_sync.rs')
| -rw-r--r-- | src/app/theme_sync.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/app/theme_sync.rs b/src/app/theme_sync.rs new file mode 100644 index 00000000..df47f6a3 --- /dev/null +++ b/src/app/theme_sync.rs @@ -0,0 +1,51 @@ +use std::sync::atomic::Ordering; + +use super::App; + +impl App { + pub(super) fn query_host_terminal_theme(&self) { + use std::io::Write; + + let _ = std::io::stdout() + .write_all(crate::terminal_theme::HOST_COLOR_QUERY_SEQUENCE.as_bytes()); + let _ = std::io::stdout().flush(); + } + + pub(super) fn update_host_terminal_theme( + &mut self, + kind: crate::terminal_theme::DefaultColorKind, + color: crate::terminal_theme::RgbColor, + ) -> bool { + let next_theme = self.state.host_terminal_theme.with_color(kind, color); + self.set_host_terminal_theme(next_theme) + } + + pub(crate) fn set_host_terminal_theme( + &mut self, + theme: crate::terminal_theme::TerminalTheme, + ) -> bool { + if theme.is_empty() || theme == self.state.host_terminal_theme { + return false; + } + self.state.host_terminal_theme = theme; + self.apply_host_terminal_theme_to_panes(); + true + } + + fn apply_host_terminal_theme_to_panes(&self) { + if self.state.host_terminal_theme.is_empty() { + return; + } + + for workspace in &self.state.workspaces { + for tab in &workspace.tabs { + for runtime in tab.runtimes.values() { + runtime.apply_host_terminal_theme(self.state.host_terminal_theme); + } + } + } + + self.render_dirty.store(true, Ordering::Release); + self.render_notify.notify_one(); + } +} |
