diff --git a/src/backend/render/mod.rs b/src/backend/render/mod.rs index 88b34d09..5a51f37e 100644 --- a/src/backend/render/mod.rs +++ b/src/backend/render/mod.rs @@ -142,6 +142,21 @@ impl IndicatorShader { .clone() } + pub fn focus_element( + renderer: &R, + key: impl Into, + mut element_geo: Rectangle, + thickness: u8, + alpha: f32, + color: [f32; 3], + ) -> PixelShaderElement { + let t = thickness as i32; + element_geo.loc -= (t, t).into(); + element_geo.size += (t * 2, t * 2).into(); + + IndicatorShader::element(renderer, key, element_geo, thickness, alpha, color) + } + pub fn element( renderer: &R, key: impl Into, @@ -174,12 +189,6 @@ impl IndicatorShader { .is_none() { let thickness: f32 = thickness as f32; - let thickness_loc = (thickness as i32, thickness as i32); - let thickness_size = ((thickness * 2.0) as i32, (thickness * 2.0) as i32); - let geo = Rectangle::from_loc_and_size( - geo.loc - Point::from(thickness_loc), - geo.size + Size::from(thickness_size), - ); let shader = Self::get(renderer); let elem = PixelShaderElement::new( diff --git a/src/backend/render/shaders/focus_indicator.frag b/src/backend/render/shaders/focus_indicator.frag index cebaf8db..f94aa116 100644 --- a/src/backend/render/shaders/focus_indicator.frag +++ b/src/backend/render/shaders/focus_indicator.frag @@ -15,12 +15,12 @@ float rounded_box(vec2 center, vec2 size, float radius) { } void main() { - vec2 center = size / 2.0 - vec2(0.5); + vec2 center = size / 2.0; vec2 location = v_coords * size; vec4 mix_color; float distance = rounded_box(location - center, size / 2.0 - vec2(thickness / 2.0), radius); - float smoothedAlpha = 1.0 - smoothstep(0.0, 2.0, abs(distance) - (thickness / 2.0)); + float smoothedAlpha = 1.0 - smoothstep(0.0, 1.0, abs(distance) - (thickness / 2.0)); mix_color = mix(vec4(0.0, 0.0, 0.0, 0.0), vec4(color, alpha), smoothedAlpha); diff --git a/src/shell/layout/floating/mod.rs b/src/shell/layout/floating/mod.rs index 73c1b173..8e88bb60 100644 --- a/src/shell/layout/floating/mod.rs +++ b/src/shell/layout/floating/mod.rs @@ -379,7 +379,7 @@ impl FloatingLayout { ); if focused == Some(elem) { if indicator_thickness > 0 { - let element = IndicatorShader::element( + let element = IndicatorShader::focus_element( renderer, elem.clone(), Rectangle::from_loc_and_size( diff --git a/src/shell/layout/tiling/mod.rs b/src/shell/layout/tiling/mod.rs index 5fcb7683..619c312a 100644 --- a/src/shell/layout/tiling/mod.rs +++ b/src/shell/layout/tiling/mod.rs @@ -2148,7 +2148,7 @@ where if focused == Some(mapped) { if indicator_thickness > 0 { - let element = IndicatorShader::element( + let element = IndicatorShader::focus_element( renderer, mapped.clone(), geo,