diff --git a/docs/src/pages/changelog.md b/docs/src/pages/changelog.md index 5345d5c1..e15f26f5 100644 --- a/docs/src/pages/changelog.md +++ b/docs/src/pages/changelog.md @@ -15,6 +15,7 @@ language: 'en' ## 0.2.37 +- Support window bg color via OSC. - Fix font loader for fallbacks and extra. - Fix font size updating through config. diff --git a/frontends/rioterm/src/application.rs b/frontends/rioterm/src/application.rs index a61204c5..11cf00b0 100644 --- a/frontends/rioterm/src/application.rs +++ b/frontends/rioterm/src/application.rs @@ -1356,29 +1356,41 @@ impl ApplicationHandler for Application<'_> { } RoutePath::Terminal => { if let Some(window_update) = route.window.screen.render() { - #[cfg(target_os = "macos")] - { - use crate::context::renderable::{ - BackgroundState, WindowUpdate, - }; - match window_update { - WindowUpdate::Background(bg_state) => { - let bg_color = match bg_state { - BackgroundState::Set(color) => color, - BackgroundState::Reset => { - self.config.colors.background.1 - } - }; + use crate::context::renderable::{ + BackgroundState, WindowUpdate, + }; + match window_update { + WindowUpdate::Background(bg_state) => { + let bg_color = match bg_state { + BackgroundState::Set(color) => color, + BackgroundState::Reset => { + self.config.colors.background.1 + } + }; + + #[cfg(target_os = "macos")] + { route.window.winit_window.set_background_color( - bg_color.r, - bg_color.g, - bg_color.b, + bg_color.r, bg_color.g, bg_color.b, bg_color.a, ); } + + #[cfg(target_os = "windows")] + { + use rio_window::platform::windows::WindowExtWindows; + route + .window + .winit_window + .set_title_bar_background_color( + bg_color.r, bg_color.g, bg_color.b, + bg_color.a, + ); + } } } } + // Update IME cursor position after rendering to ensure it's current route.window.screen.update_ime_cursor_position_if_needed( &route.window.winit_window, diff --git a/frontends/rioterm/src/renderer/mod.rs b/frontends/rioterm/src/renderer/mod.rs index 8d12c678..24e61636 100644 --- a/frontends/rioterm/src/renderer/mod.rs +++ b/frontends/rioterm/src/renderer/mod.rs @@ -1134,21 +1134,24 @@ impl Renderer { // Apply background color from current context if changed let current_context = context_manager.current_grid_mut().current_mut(); - let window_update = - if let Some(bg_state) = current_context.renderable_content.background.take() { - use crate::context::renderable::BackgroundState; - match bg_state { - BackgroundState::Set(color) => { - sugarloaf.set_background_color(Some(color)); - } - BackgroundState::Reset => { - sugarloaf.set_background_color(None); - } + let window_update = if let Some(bg_state) = + current_context.renderable_content.background.take() + { + use crate::context::renderable::BackgroundState; + match bg_state { + BackgroundState::Set(color) => { + sugarloaf.set_background_color(Some(color)); } - Some(crate::context::renderable::WindowUpdate::Background(bg_state)) - } else { - None - }; + BackgroundState::Reset => { + sugarloaf.set_background_color(None); + } + } + Some(crate::context::renderable::WindowUpdate::Background( + bg_state, + )) + } else { + None + }; sugarloaf.render(); diff --git a/frontends/rioterm/src/screen/mod.rs b/frontends/rioterm/src/screen/mod.rs index 224642a0..9842af3a 100644 --- a/frontends/rioterm/src/screen/mod.rs +++ b/frontends/rioterm/src/screen/mod.rs @@ -2511,9 +2511,7 @@ impl Screen<'_> { self.sugarloaf.render(); } - pub fn render( - &mut self, - ) -> Option { + pub fn render(&mut self) -> Option { // let screen_render_start = std::time::Instant::now(); let is_search_active = self.search_active(); if is_search_active { diff --git a/rio-backend/src/crosswords/mod.rs b/rio-backend/src/crosswords/mod.rs index c9f4b308..db86bf7d 100644 --- a/rio-backend/src/crosswords/mod.rs +++ b/rio-backend/src/crosswords/mod.rs @@ -2442,8 +2442,10 @@ impl Handler for Crosswords { } self.colors[index] = Some(color_arr); - self.event_proxy - .send_event(RioEvent::ColorChange(self.route_id, index, Some(color)), self.window_id); + self.event_proxy.send_event( + RioEvent::ColorChange(self.route_id, index, Some(color)), + self.window_id, + ); } #[inline] @@ -2454,8 +2456,10 @@ impl Handler for Crosswords { } self.colors[index] = None; - self.event_proxy - .send_event(RioEvent::ColorChange(self.route_id, index, None), self.window_id); + self.event_proxy.send_event( + RioEvent::ColorChange(self.route_id, index, None), + self.window_id, + ); } #[inline] diff --git a/rio-window/src/platform/windows.rs b/rio-window/src/platform/windows.rs index 8e032fa9..704b0690 100644 --- a/rio-window/src/platform/windows.rs +++ b/rio-window/src/platform/windows.rs @@ -253,6 +253,12 @@ impl EventLoopBuilderExtWindows for EventLoopBuilder { /// Additional methods on `Window` that are specific to Windows. pub trait WindowExtWindows { + /// Sets the background color of the title bar using RGBA values (0.0-1.0 range). + /// + /// This is a convenience method that converts f64 RGBA values to the Windows Color format. + /// Supported starting with Windows 11 Build 22000. + fn set_title_bar_background_color(&self, r: f64, g: f64, b: f64, a: f64); + /// Enables or disables mouse and keyboard input to the specified window. /// /// A window must be enabled before it can be activated. @@ -366,6 +372,16 @@ pub trait WindowExtWindows { } impl WindowExtWindows for Window { + #[inline] + fn set_title_bar_background_color(&self, r: f64, g: f64, b: f64, _a: f64) { + // Convert from 0.0-1.0 range to 0-255 range + let r = (r * 255.0) as u8; + let g = (g * 255.0) as u8; + let b = (b * 255.0) as u8; + self.window + .set_title_background_color(Color::from_rgb(r, g, b)) + } + #[inline] fn set_enable(&self, enabled: bool) { self.window.set_enable(enabled)