mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-24 02:01:18 +07:00
tab indicator: Add corner-radius setting
This commit is contained in:
@@ -697,6 +697,8 @@ pub struct TabIndicator {
|
|||||||
pub position: TabIndicatorPosition,
|
pub position: TabIndicatorPosition,
|
||||||
#[knuffel(child, unwrap(argument), default = Self::default().gaps_between_tabs)]
|
#[knuffel(child, unwrap(argument), default = Self::default().gaps_between_tabs)]
|
||||||
pub gaps_between_tabs: FloatOrInt<0, 65535>,
|
pub gaps_between_tabs: FloatOrInt<0, 65535>,
|
||||||
|
#[knuffel(child, unwrap(argument), default = Self::default().corner_radius)]
|
||||||
|
pub corner_radius: FloatOrInt<0, 65535>,
|
||||||
#[knuffel(child)]
|
#[knuffel(child)]
|
||||||
pub active_color: Option<Color>,
|
pub active_color: Option<Color>,
|
||||||
#[knuffel(child)]
|
#[knuffel(child)]
|
||||||
@@ -720,6 +722,7 @@ impl Default for TabIndicator {
|
|||||||
},
|
},
|
||||||
position: TabIndicatorPosition::Left,
|
position: TabIndicatorPosition::Left,
|
||||||
gaps_between_tabs: FloatOrInt(0.),
|
gaps_between_tabs: FloatOrInt(0.),
|
||||||
|
corner_radius: FloatOrInt(0.),
|
||||||
active_color: None,
|
active_color: None,
|
||||||
inactive_color: None,
|
inactive_color: None,
|
||||||
active_gradient: None,
|
active_gradient: None,
|
||||||
@@ -1234,6 +1237,17 @@ impl From<CornerRadius> for [f32; 4] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<f32> for CornerRadius {
|
||||||
|
fn from(value: f32) -> Self {
|
||||||
|
Self {
|
||||||
|
top_left: value,
|
||||||
|
top_right: value,
|
||||||
|
bottom_right: value,
|
||||||
|
bottom_left: value,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(knuffel::DecodeScalar, Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(knuffel::DecodeScalar, Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub enum BlockOutFrom {
|
pub enum BlockOutFrom {
|
||||||
Screencast,
|
Screencast,
|
||||||
|
|||||||
@@ -180,6 +180,11 @@ impl TabIndicator {
|
|||||||
self.shaders.resize_with(count, Default::default);
|
self.shaders.resize_with(count, Default::default);
|
||||||
self.shader_locs.resize_with(count, Default::default);
|
self.shader_locs.resize_with(count, Default::default);
|
||||||
|
|
||||||
|
let position = self.config.position;
|
||||||
|
let radius = self.config.corner_radius.0 as f32;
|
||||||
|
let shared_rounded_corners = self.config.gaps_between_tabs.0 == 0.;
|
||||||
|
let mut tabs_left = tab_count;
|
||||||
|
|
||||||
let rects = self.tab_rects(area, count, scale);
|
let rects = self.tab_rects(area, count, scale);
|
||||||
for ((shader, loc), (tab, rect)) in zip(
|
for ((shader, loc), (tab, rect)) in zip(
|
||||||
zip(&mut self.shaders, &mut self.shader_locs),
|
zip(&mut self.shaders, &mut self.shader_locs),
|
||||||
@@ -200,6 +205,50 @@ impl TabIndicator {
|
|||||||
color_to *= 0.5;
|
color_to *= 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let radius = if shared_rounded_corners && tab_count > 1 {
|
||||||
|
if tabs_left == tab_count {
|
||||||
|
// First tab.
|
||||||
|
match position {
|
||||||
|
TabIndicatorPosition::Left | TabIndicatorPosition::Right => CornerRadius {
|
||||||
|
top_left: radius,
|
||||||
|
top_right: radius,
|
||||||
|
bottom_right: 0.,
|
||||||
|
bottom_left: 0.,
|
||||||
|
},
|
||||||
|
TabIndicatorPosition::Top | TabIndicatorPosition::Bottom => CornerRadius {
|
||||||
|
top_left: radius,
|
||||||
|
top_right: 0.,
|
||||||
|
bottom_right: 0.,
|
||||||
|
bottom_left: radius,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
} else if tabs_left == 1 {
|
||||||
|
// Last tab.
|
||||||
|
match position {
|
||||||
|
TabIndicatorPosition::Left | TabIndicatorPosition::Right => CornerRadius {
|
||||||
|
top_left: 0.,
|
||||||
|
top_right: 0.,
|
||||||
|
bottom_right: radius,
|
||||||
|
bottom_left: radius,
|
||||||
|
},
|
||||||
|
TabIndicatorPosition::Top | TabIndicatorPosition::Bottom => CornerRadius {
|
||||||
|
top_left: 0.,
|
||||||
|
top_right: radius,
|
||||||
|
bottom_right: radius,
|
||||||
|
bottom_left: 0.,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Tab in the middle.
|
||||||
|
CornerRadius::default()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Separate tabs, or the only tab.
|
||||||
|
CornerRadius::from(radius)
|
||||||
|
};
|
||||||
|
let radius = radius.fit_to(rect.size.w as f32, rect.size.h as f32);
|
||||||
|
tabs_left -= 1;
|
||||||
|
|
||||||
shader.update(
|
shader.update(
|
||||||
rect.size,
|
rect.size,
|
||||||
gradient_area,
|
gradient_area,
|
||||||
@@ -209,7 +258,7 @@ impl TabIndicator {
|
|||||||
((tab.gradient.angle as f32) - 90.).to_radians(),
|
((tab.gradient.angle as f32) - 90.).to_radians(),
|
||||||
Rectangle::from_size(rect.size),
|
Rectangle::from_size(rect.size),
|
||||||
0.,
|
0.,
|
||||||
CornerRadius::default(),
|
radius,
|
||||||
scale as f32,
|
scale as f32,
|
||||||
1.,
|
1.,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ layout {
|
|||||||
length total-proportion=1.0
|
length total-proportion=1.0
|
||||||
position "right"
|
position "right"
|
||||||
gaps-between-tabs 2
|
gaps-between-tabs 2
|
||||||
|
corner-radius 8
|
||||||
active-color "red"
|
active-color "red"
|
||||||
inactive-color "gray"
|
inactive-color "gray"
|
||||||
// active-gradient from="#80c8ff" to="#bbddff" angle=45
|
// active-gradient from="#80c8ff" to="#bbddff" angle=45
|
||||||
@@ -439,6 +440,9 @@ It can be `left`, `right`, `top`, or `bottom`.
|
|||||||
|
|
||||||
`gaps-between-tabs` controls the gap between individual tabs in logical pixels.
|
`gaps-between-tabs` controls the gap between individual tabs in logical pixels.
|
||||||
|
|
||||||
|
`corner-radius` sets the rounded corner radius for tabs in the indicator in logical pixels.
|
||||||
|
When `gaps-between-tabs` is zero, only the first and the last tabs have rounded corners, otherwise all tabs do.
|
||||||
|
|
||||||
`active-color`, `inactive-color`, `active-gradient`, `inactive-gradient` let you override the colors for the tabs.
|
`active-color`, `inactive-color`, `active-gradient`, `inactive-gradient` let you override the colors for the tabs.
|
||||||
They have the same semantics as the border and focus ring colors and gradients.
|
They have the same semantics as the border and focus ring colors and gradients.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user