Skip to content

Commit b45d4c2

Browse files
committed
config: [blur] add blur-when-keyboard-focused
1 parent 47e8380 commit b45d4c2

6 files changed

Lines changed: 47 additions & 39 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ layer-rule{
4949
passes 1
5050
radius 4
5151
ignore-alpha 0.1 // 透明度剔除
52+
blur-when-keyboard-focused true // 只在键盘聚焦时进行模糊
5253
}
5354
}
5455
```

niri-config/src/appearance.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ pub struct Blur {
319319
pub radius: FloatOrInt<0, 1024>,
320320
pub noise: FloatOrInt<0, 1024>,
321321
pub ignore_alpha: FloatOrInt<0, 1>,
322+
pub blur_when_keyboard_focused: bool,
322323
}
323324

324325
impl Default for Blur {
@@ -330,6 +331,7 @@ impl Default for Blur {
330331
radius: FloatOrInt(0.0),
331332
noise: FloatOrInt(0.0),
332333
ignore_alpha: FloatOrInt(0.),
334+
blur_when_keyboard_focused: false,
333335
}
334336
}
335337
}
@@ -341,7 +343,7 @@ impl MergeWith<BlurRule> for Blur {
341343
self.on = false;
342344
}
343345

344-
merge_clone!((self, part), passes, radius, noise, ignore_alpha);
346+
merge_clone!((self, part), passes, radius, noise, ignore_alpha, blur_when_keyboard_focused);
345347
}
346348
}
347349

@@ -700,6 +702,8 @@ pub struct BlurRule {
700702
pub noise: Option<FloatOrInt<0, 1024>>,
701703
#[knuffel(child, unwrap(argument))]
702704
pub ignore_alpha: Option<FloatOrInt<0, 1>>,
705+
#[knuffel(child, unwrap(argument))]
706+
pub blur_when_keyboard_focused: Option<bool>,
703707
}
704708

705709
#[derive(knuffel::Decode, Debug, Default, Clone, Copy, PartialEq)]

src/layer/mapped.rs

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,6 @@ impl MappedLayer {
201201
fx_buffers: Option<EffectsFramebufffersUserData>,
202202
push: &mut dyn FnMut(LayerSurfaceRenderElement<R>),
203203
) {
204-
let mut gles_elems: Option<Vec<LayerSurfaceRenderElement<GlesRenderer>>> = None;
205-
206204
let scale = Scale::from(self.scale);
207205
let alpha = self.rules.opacity.unwrap_or(1.).clamp(0., 1.);
208206
let location = location + self.bob_offset();
@@ -236,23 +234,26 @@ impl MappedLayer {
236234
&mut |elem| push(elem.into()),
237235
);
238236

239-
gles_elems = Some(render_elements_from_surface_tree(
240-
renderer.as_gles_renderer(),
241-
surface,
242-
buf_pos.to_physical_precise_round(scale),
243-
scale,
244-
alpha,
245-
Kind::ScanoutCandidate,
246-
));
247-
248237
if self.blur_config.on
238+
&& (!self.blur_config.blur_when_keyboard_focused
239+
|| self.blur_config.blur_when_keyboard_focused
240+
&& self.surface.can_receive_keyboard_focus())
249241
/* && matches!(self.surface.layer(), Layer::Top | Layer::Overlay) */
250242
{
251243
if let Some(fx_buffers) = fx_buffers {
252244
let fx_buffers_rc = fx_buffers;
253245
let fx_buffers = fx_buffers_rc.borrow();
254246

255-
// debug!("render layer blur {:?}", self.rules.blur);
247+
let gles_elems: Option<Vec<LayerSurfaceRenderElement<GlesRenderer>>> =
248+
Some(render_elements_from_surface_tree(
249+
renderer.as_gles_renderer(),
250+
surface,
251+
buf_pos.to_physical_precise_round(scale),
252+
scale,
253+
alpha,
254+
Kind::ScanoutCandidate,
255+
));
256+
256257
// TODO: respect sync point?
257258
let alpha_tex = gles_elems
258259
.and_then(|gles_elems| {
@@ -328,8 +329,6 @@ impl MappedLayer {
328329

329330
let size = popup.geometry().size.to_f64();
330331

331-
let mut gles_elems: Option<Vec<LayerSurfaceRenderElement<GlesRenderer>>> = None;
332-
333332
{
334333
push_elements_from_surface_tree(
335334
renderer,
@@ -342,18 +341,20 @@ impl MappedLayer {
342341
);
343342
}
344343

345-
gles_elems = Some(render_elements_from_surface_tree(
346-
renderer.as_gles_renderer(),
347-
popup.wl_surface(),
348-
(buf_pos + offset.to_f64()).to_physical_precise_round(scale),
349-
scale,
350-
alpha,
351-
Kind::ScanoutCandidate,
352-
));
353-
354344
if self.blur_config.on {
355345
if let Some(fx_buffers_rc) = fx_buffers.as_ref() {
356346
let fx_buffers = fx_buffers_rc.borrow();
347+
348+
let gles_elems: Option<Vec<LayerSurfaceRenderElement<GlesRenderer>>> =
349+
Some(render_elements_from_surface_tree(
350+
renderer.as_gles_renderer(),
351+
popup.wl_surface(),
352+
(buf_pos + offset.to_f64()).to_physical_precise_round(scale),
353+
scale,
354+
alpha,
355+
Kind::ScanoutCandidate,
356+
));
357+
357358
let alpha_tex = gles_elems
358359
.and_then(|gles_elems| {
359360
let transform = fx_buffers.transform();

src/layer/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ impl ResolvedLayerRules {
5959
radius: None,
6060
noise: None,
6161
ignore_alpha: None,
62+
blur_when_keyboard_focused: None,
6263
},
6364
geometry_corner_radius: None,
6465
place_within_backdrop: false,

src/render_helpers/blur/element.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use smithay::backend::renderer::element::texture::TextureRenderElement;
66
use smithay::backend::renderer::element::{Element, Id, Kind, RenderElement, UnderlyingStorage};
77
use smithay::backend::renderer::gles::{GlesError, GlesFrame, GlesRenderer, GlesTexture, Uniform};
88
use smithay::backend::renderer::utils::{CommitCounter, DamageSet, OpaqueRegions};
9-
use smithay::backend::renderer::Renderer;
9+
use smithay::backend::renderer::{Renderer, Texture};
1010
use smithay::output::Output;
1111
use smithay::utils::{Buffer, Logical, Physical, Point, Rectangle, Scale, Size, Transform};
1212

src/render_helpers/blur/mod.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ impl EffectsFramebuffers {
130130
size.to_logical(1).to_buffer(1, Transform::Normal),
131131
)
132132
}
133-
133+
134134
let mut sample_effects: Vec<GlesTexture> = Vec::new();
135135
let mut sample_fbos: Vec<u32> = Vec::new();
136136
for i in 0..8 {
@@ -441,10 +441,11 @@ pub(super) unsafe fn get_main_buffer_blur(
441441

442442
let dst_expanded = {
443443
let mut dst = dst;
444-
let size =
445-
(2f32.powi(blur_config.passes as i32 + 1) * blur_config.radius.0 as f32).ceil() as i32;
446-
dst.loc -= Point::from((size, size)).upscale(8);
447-
dst.size += Size::from((size, size)).upscale(16);
444+
// let size =
445+
// (2f32.powi(blur_config.passes as i32 + 1) * blur_config.radius.0 as f32).ceil() as i32;
446+
let size= blur_config.radius.0 as i32;
447+
dst.loc -= Point::from((size, size));
448+
dst.size += Size::from((size, size)).upscale(2);
448449
dst
449450
};
450451

@@ -547,13 +548,13 @@ pub(super) unsafe fn get_main_buffer_blur(
547548
// ];
548549
for i in 0..passes {
549550
let (sample_buffer, render_buffer, render_buffer_fbo) = fx_buffers.sample_buffers(i);
550-
let damage = dst_expanded.downscale(1 << (i + 1));
551+
// let damage = dst_expanded.downscale(1 << (i + 1));
551552
let tex_size_down = sample_buffer.size(); // 当前 FBO 尺寸
552553
let half_pixel = [0.5 / tex_size_down.w as f32, 0.5 / tex_size_down.h as f32];
553-
debug!(
554-
"dst_expanded {:?} tex_size_down {:?}",
555-
dst_expanded, tex_size_down
556-
);
554+
// debug!(
555+
// "dst_expanded {:?} tex_size_down {:?}",
556+
// dst_expanded, tex_size_down
557+
// );
557558
render_blur_pass_with_gl(
558559
gl,
559560
vbos,
@@ -567,7 +568,7 @@ pub(super) unsafe fn get_main_buffer_blur(
567568
&shaders.down,
568569
half_pixel,
569570
blur_config.clone(),
570-
damage,
571+
// damage,
571572
render_buffer_fbo,
572573
i,
573574
)?;
@@ -582,7 +583,7 @@ pub(super) unsafe fn get_main_buffer_blur(
582583
// let (sample_buffer, render_buffer) = fx_buffers.buffers();
583584
let (render_buffer, sample_buffer, render_buffer_fbo) =
584585
fx_buffers.sample_buffers_rev(i);
585-
let damage = dst_expanded.downscale(1 << (passes - 1 - i));
586+
// let damage = dst_expanded.downscale(1 << (passes - 1 - i));
586587
let tex_size_down = sample_buffer.size(); // 当前 FBO 尺寸
587588
let half_pixel = [0.5 / tex_size_down.w as f32, 0.5 / tex_size_down.h as f32];
588589
render_blur_pass_with_gl(
@@ -598,7 +599,7 @@ pub(super) unsafe fn get_main_buffer_blur(
598599
&shaders.up,
599600
half_pixel,
600601
blur_config.clone(),
601-
damage,
602+
// damage,
602603
render_buffer_fbo,
603604
i,
604605
)?;
@@ -800,7 +801,7 @@ unsafe fn render_blur_pass_with_gl(
800801
config: Blur,
801802
// dst is the region that should have blur
802803
// it gets up/downscaled with passes
803-
_damage: Rectangle<i32, Physical>,
804+
// _damage: Rectangle<i32, Physical>,
804805
render_buffer_fbo: u32,
805806
i: usize,
806807
) -> Result<(), GlesError> {

0 commit comments

Comments
 (0)