atagen

monolith

public
Star0
Watch0

Commit 2a9ba5d3d11d

tarball

atagen <boss@atagen.co>2026-10-19 08:55 UTC

1 file changed+31-15
scene: multiply window alpha by the opacity rule

Windows were only ever drawn at the alpha their transition gave, so config could not dim one. The opacity reaches the surface elements, the effect shader's draw alpha and the border strips, so a window does not pop to full opacity while it spawns.
Modified file: crates/monolith/src/scene.rs+31 additions−15 deletions
@@ -169,7 +169,17 @@ pub fn build(
169169 };
170170 let effect = anim.effect(id, now);
171171 let first = out.len();
172- window_elements(&mut out, renderer, &state.window, r, effect, gliding, scale);
172+ let opacity = state.rule.opacity.unwrap_or(1.0);
173+ window_elements(
174+ &mut out,
175+ renderer,
176+ &state.window,
177+ r,
178+ effect,
179+ gliding,
180+ scale,
181+ opacity,
182+ );
173183 let clip = framed.then(|| corner_clip(r, deco, scale)).flatten();
174184 if let Some(clip) = clip {
175185 clip_window(&mut out, first, clip);
@@ -182,7 +192,7 @@ pub fn build(
182192 } else {
183193 deco.unfocused.0
184194 };
185- let alpha = effect.map_or(1.0, |e| e.progress);
195+ let alpha = effect.map_or(1.0, |e| e.progress) * opacity;
186196 let borders = &mut state.borders;
187197 let first = out.len();
188198 border_elements(&mut out, borders, r, deco, color, alpha, scale);
@@ -219,6 +229,7 @@ fn window_elements(
219229 effect: Option<Effect>,
220230 scaled: bool,
221231 scale: f64,
232+ opacity: f32,
222233 ) {
223234 let Some(((x, y), (w, h))) = pixels(r, scale) else {
224235 return;
@@ -227,7 +238,7 @@ fn window_elements(
227238 let inset = geo.loc.to_physical_precise_round::<_, i32>(scale);
228239 let drawn: Size<i32, Physical> = geo.size.to_physical_precise_round(scale);
229240 let loc = Point::<i32, Physical>::from((x - inset.x, y - inset.y));
230- let alpha = effect.map_or(1.0, |e| e.progress);
241+ let alpha = effect.map_or(1.0, |e| e.progress) * opacity;
231242 let elems: Vec<WaylandSurfaceRenderElement<VulkanRenderer>> = match window.toplevel() {
232243 Some(t) => render_elements_from_surface_tree(
233244 renderer,
@@ -248,6 +259,7 @@ fn window_elements(
248259 ((x, y), (w, h)),
249260 effect,
250261 scale,
262+ opacity,
251263 );
252264 return;
253265 }
@@ -414,6 +426,7 @@ fn effect_elements(
414426 (at, size): ((i32, i32), (i32, i32)),
415427 effect: Effect,
416428 scale: f64,
429+ opacity: f32,
417430 ) {
418431 let Some(root) = crate::wm::root(window) else {
419432 return;
@@ -444,14 +457,9 @@ fn effect_elements(
444457 );
445458 let bounds = tex.size().to_logical(buffer_scale, transform).to_f64();
446459 let src = src.to_buffer(f64::from(buffer_scale), transform, &bounds);
447- out.push(Draw::Texture(PlacedTexture::new(
448- &tex,
449- transform,
450- src,
451- at,
452- size,
453- Some(effect),
454- )));
460+ let mut placed = PlacedTexture::new(&tex, transform, src, at, size, Some(effect));
461+ placed.alpha = opacity;
462+ out.push(Draw::Texture(placed));
455463 }
456464 }
457465
@@ -464,6 +472,7 @@ pub struct PlacedTexture {
464472 geometry: Rectangle<i32, Physical>,
465473 transform: Transform,
466474 effect: Option<Effect>,
475+ alpha: f32,
467476 }
468477
469478 impl PlacedTexture {
@@ -482,6 +491,7 @@ impl PlacedTexture {
482491 geometry: Rectangle::new(at.into(), size.into()),
483492 transform,
484493 effect,
494+ alpha: 1.0,
485495 }
486496 }
487497 }
@@ -519,9 +529,15 @@ impl RenderElement<VulkanRenderer> for PlacedTexture {
519529 _cache: Option<&UserDataMap>,
520530 ) -> Result<(), monolith_render_vk::Error> {
521531 match self.effect {
522- Some(effect) => {
523- frame.render_effect(&self.texture, src, dst, damage, self.transform, 1.0, effect)
524- }
532+ Some(effect) => frame.render_effect(
533+ &self.texture,
534+ src,
535+ dst,
536+ damage,
537+ self.transform,
538+ self.alpha,
539+ effect,
540+ ),
525541 None => frame.render_texture_from_to(
526542 &self.texture,
527543 src,
@@ -529,7 +545,7 @@ impl RenderElement<VulkanRenderer> for PlacedTexture {
529545 damage,
530546 opaque_regions,
531547 self.transform,
532- 1.0,
548+ self.alpha,
533549 ),
534550 }
535551 }