1
0
Fork 0
forked from wry/wry

render: force black background color for fullscreen nodes

This commit is contained in:
Julian Orth 2024-02-23 15:03:59 +01:00
parent 609f6f99cd
commit 41754e268f
6 changed files with 46 additions and 4 deletions

View file

@ -505,6 +505,7 @@ impl MetalConnector {
Some(rr), Some(rr),
output.global.preferred_scale.get(), output.global.preferred_scale.get(),
render_hw_cursor, render_hw_cursor,
output.has_fullscreen(),
); );
let try_direct_scanout = try_direct_scanout let try_direct_scanout = try_direct_scanout
&& !output.global.have_shm_screencopies() && !output.global.have_shm_screencopies()

View file

@ -8,7 +8,7 @@ use {
scale::Scale, scale::Scale,
state::State, state::State,
theme::Color, theme::Color,
tree::Node, tree::{Node, OutputNode},
utils::numcell::NumCell, utils::numcell::NumCell,
video::{dmabuf::DmaBuf, gbm::GbmDevice, Modifier}, video::{dmabuf::DmaBuf, gbm::GbmDevice, Modifier},
}, },
@ -211,6 +211,7 @@ impl dyn GfxFramebuffer {
result: Option<&mut RenderResult>, result: Option<&mut RenderResult>,
scale: Scale, scale: Scale,
render_hardware_cursor: bool, render_hardware_cursor: bool,
black_background: bool,
) -> GfxRenderPass { ) -> GfxRenderPass {
let mut ops = self.take_render_ops(); let mut ops = self.take_render_ops();
let (width, height) = self.size(); 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 { GfxRenderPass {
ops, ops,
clear: Some(c), clear: Some(c),
@ -262,6 +266,26 @@ impl dyn GfxFramebuffer {
self.render(pass.ops, pass.clear.as_ref()) self.render(pass.ops, pass.clear.as_ref())
} }
pub fn render_output(
&self,
node: &OutputNode,
state: &State,
cursor_rect: Option<Rect>,
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( pub fn render_node(
&self, &self,
node: &dyn Node, node: &dyn Node,
@ -270,6 +294,7 @@ impl dyn GfxFramebuffer {
result: Option<&mut RenderResult>, result: Option<&mut RenderResult>,
scale: Scale, scale: Scale,
render_hardware_cursor: bool, render_hardware_cursor: bool,
black_background: bool,
) { ) {
let pass = self.create_render_pass( let pass = self.create_render_pass(
node, node,
@ -278,6 +303,7 @@ impl dyn GfxFramebuffer {
result, result,
scale, scale,
render_hardware_cursor, render_hardware_cursor,
black_background,
); );
self.perform_render_pass(pass); self.perform_render_pass(pass);
} }

View file

@ -75,6 +75,7 @@ pub fn take_screenshot(state: &State) -> Result<Screenshot, ScreenshooterError>
None, None,
Scale::from_int(1), Scale::from_int(1),
true, true,
false,
); );
let drm = gbm.drm.dup_render()?.fd().clone(); let drm = gbm.drm.dup_render()?.fd().clone();
Ok(Screenshot { drm, bo }) Ok(Screenshot { drm, bo })

View file

@ -743,7 +743,7 @@ impl State {
rr: &mut RenderResult, rr: &mut RenderResult,
render_hw_cursor: bool, render_hw_cursor: bool,
) { ) {
fb.render_node( fb.render_output(
output, output,
self, self,
Some(output.global.pos.get()), 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); target.render(ops, clear);
} }
} }

View file

@ -45,6 +45,13 @@ impl Color {
a: 0.0, 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 { pub fn from_gray(g: u8) -> Self {
Self::from_rgb(g, g, g) Self::from_rgb(g, g, g)
} }

View file

@ -477,6 +477,13 @@ impl OutputNode {
fn pointer_move(self: &Rc<Self>, seat: &Rc<WlSeatGlobal>, x: i32, y: i32) { fn pointer_move(self: &Rc<Self>, seat: &Rc<WlSeatGlobal>, x: i32, y: i32) {
self.pointer_positions.set(seat.id(), (x, y)); 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 { pub struct OutputTitle {