From 41754e268fc945b98a18830884c38cdc3b98cb64 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 23 Feb 2024 15:03:59 +0100 Subject: [PATCH] render: force black background color for fullscreen nodes --- src/backends/metal/video.rs | 1 + src/gfx_api.rs | 30 ++++++++++++++++++++++++++++-- src/screenshoter.rs | 1 + src/state.rs | 4 ++-- src/theme.rs | 7 +++++++ src/tree/output.rs | 7 +++++++ 6 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/backends/metal/video.rs b/src/backends/metal/video.rs index 6c132ee2..ea5df493 100644 --- a/src/backends/metal/video.rs +++ b/src/backends/metal/video.rs @@ -505,6 +505,7 @@ impl MetalConnector { Some(rr), output.global.preferred_scale.get(), render_hw_cursor, + output.has_fullscreen(), ); let try_direct_scanout = try_direct_scanout && !output.global.have_shm_screencopies() diff --git a/src/gfx_api.rs b/src/gfx_api.rs index 1d67dd9b..b0725afc 100644 --- a/src/gfx_api.rs +++ b/src/gfx_api.rs @@ -8,7 +8,7 @@ use { scale::Scale, state::State, theme::Color, - tree::Node, + tree::{Node, OutputNode}, utils::numcell::NumCell, video::{dmabuf::DmaBuf, gbm::GbmDevice, Modifier}, }, @@ -211,6 +211,7 @@ impl dyn GfxFramebuffer { result: Option<&mut RenderResult>, scale: Scale, render_hardware_cursor: bool, + black_background: bool, ) -> GfxRenderPass { let mut ops = self.take_render_ops(); let (width, height) = self.size(); @@ -251,7 +252,10 @@ impl dyn GfxFramebuffer { } } } - let c = state.theme.colors.background.get(); + let c = match black_background { + true => Color::SOLID_BLACK, + false => state.theme.colors.background.get(), + }; GfxRenderPass { ops, clear: Some(c), @@ -262,6 +266,26 @@ impl dyn GfxFramebuffer { self.render(pass.ops, pass.clear.as_ref()) } + pub fn render_output( + &self, + node: &OutputNode, + state: &State, + cursor_rect: Option, + result: Option<&mut RenderResult>, + scale: Scale, + render_hardware_cursor: bool, + ) { + self.render_node( + node, + state, + cursor_rect, + result, + scale, + render_hardware_cursor, + node.has_fullscreen(), + ) + } + pub fn render_node( &self, node: &dyn Node, @@ -270,6 +294,7 @@ impl dyn GfxFramebuffer { result: Option<&mut RenderResult>, scale: Scale, render_hardware_cursor: bool, + black_background: bool, ) { let pass = self.create_render_pass( node, @@ -278,6 +303,7 @@ impl dyn GfxFramebuffer { result, scale, render_hardware_cursor, + black_background, ); self.perform_render_pass(pass); } diff --git a/src/screenshoter.rs b/src/screenshoter.rs index 89d46146..e7c83298 100644 --- a/src/screenshoter.rs +++ b/src/screenshoter.rs @@ -75,6 +75,7 @@ pub fn take_screenshot(state: &State) -> Result None, Scale::from_int(1), true, + false, ); let drm = gbm.drm.dup_render()?.fd().clone(); Ok(Screenshot { drm, bo }) diff --git a/src/state.rs b/src/state.rs index a570ea37..62e15dda 100644 --- a/src/state.rs +++ b/src/state.rs @@ -743,7 +743,7 @@ impl State { rr: &mut RenderResult, render_hw_cursor: bool, ) { - fb.render_node( + fb.render_output( output, self, Some(output.global.pos.get()), @@ -794,7 +794,7 @@ impl State { } } } - let clear = target.format().has_alpha.then_some(&Color::TRANSPARENT); + let clear = target.format().has_alpha.then_some(&Color::SOLID_BLACK); target.render(ops, clear); } } diff --git a/src/theme.rs b/src/theme.rs index 5601167b..35380133 100644 --- a/src/theme.rs +++ b/src/theme.rs @@ -45,6 +45,13 @@ impl Color { a: 0.0, }; + pub const SOLID_BLACK: Self = Self { + r: 0.0, + g: 0.0, + b: 0.0, + a: 1.0, + }; + pub fn from_gray(g: u8) -> Self { Self::from_rgb(g, g, g) } diff --git a/src/tree/output.rs b/src/tree/output.rs index c18c2f87..3e286160 100644 --- a/src/tree/output.rs +++ b/src/tree/output.rs @@ -477,6 +477,13 @@ impl OutputNode { fn pointer_move(self: &Rc, seat: &Rc, x: i32, y: i32) { self.pointer_positions.set(seat.id(), (x, y)); } + + pub fn has_fullscreen(&self) -> bool { + self.workspace + .get() + .map(|w| w.fullscreen.get().is_some()) + .unwrap_or(false) + } } pub struct OutputTitle {