chore: theme-v2 libcosmic update
This commit is contained in:
parent
667414bd92
commit
55d57ddba2
19 changed files with 609 additions and 386 deletions
|
|
@ -4,8 +4,14 @@ use super::{
|
|||
};
|
||||
use crate::{
|
||||
backend::render::{
|
||||
IndicatorShader, Key, Usage, cursor::CursorState, element::AsGlowRenderer,
|
||||
shadow::ShadowShader, wayland::SurfaceRenderElement,
|
||||
IndicatorShader, Key, Usage,
|
||||
cursor::CursorState,
|
||||
element::AsGlowRenderer,
|
||||
shadow::ShadowShader,
|
||||
wayland::{
|
||||
SurfaceRenderElement,
|
||||
blur_effect::{BlurElement, BlurState},
|
||||
},
|
||||
},
|
||||
hooks::{Decorations, HOOKS},
|
||||
shell::{
|
||||
|
|
@ -23,10 +29,13 @@ use crate::{
|
|||
use calloop::LoopHandle;
|
||||
use cosmic::{
|
||||
Apply, Element as CosmicElement, Theme,
|
||||
iced::{Alignment, id::Id, widget as iced_widget},
|
||||
iced_core::{Background, Border, Color, Length, border::Radius},
|
||||
iced_runtime::Task,
|
||||
iced_widget::scrollable::AbsoluteOffset,
|
||||
iced::{
|
||||
Alignment,
|
||||
core::{Background, Border, Color, Length, border::Radius},
|
||||
id::Id,
|
||||
runtime::Task,
|
||||
widget::{self as iced_widget, scrollable::AbsoluteOffset},
|
||||
},
|
||||
theme, widget as cosmic_widget,
|
||||
};
|
||||
use cosmic_comp_config::AppearanceConfig;
|
||||
|
|
@ -120,6 +129,7 @@ pub struct CosmicStackInternal {
|
|||
tiled: AtomicBool,
|
||||
theme: Mutex<cosmic::Theme>,
|
||||
appearance_conf: Mutex<AppearanceConfig>,
|
||||
blur_state: Mutex<BlurState>,
|
||||
}
|
||||
|
||||
impl CosmicStackInternal {
|
||||
|
|
@ -178,6 +188,7 @@ impl CosmicStack {
|
|||
tiled: AtomicBool::new(false),
|
||||
theme: Mutex::new(theme.clone()),
|
||||
appearance_conf: Mutex::new(appearance),
|
||||
blur_state: Default::default(),
|
||||
},
|
||||
(width, TAB_HEIGHT),
|
||||
handle,
|
||||
|
|
@ -661,6 +672,12 @@ impl CosmicStack {
|
|||
self.0.with_program(|p| {
|
||||
let windows = p.windows.lock().unwrap();
|
||||
let active = p.active.load(Ordering::SeqCst);
|
||||
let theme = p.theme.lock().unwrap();
|
||||
let frosted = if theme.cosmic().frosted_windows {
|
||||
(theme.cosmic().frosted as u8 + 1) as usize
|
||||
} else {
|
||||
0
|
||||
};
|
||||
|
||||
windows[active].push_popup_render_elements(
|
||||
renderer,
|
||||
|
|
@ -668,7 +685,7 @@ impl CosmicStack {
|
|||
scale,
|
||||
alpha,
|
||||
scanout_node,
|
||||
9, // TODO
|
||||
frosted,
|
||||
&mut |elem| push(elem.into()),
|
||||
)
|
||||
})
|
||||
|
|
@ -769,6 +786,30 @@ impl CosmicStack {
|
|||
.to_physical_precise_round(scale);
|
||||
let stack_loc = location + geometry.loc;
|
||||
let window_loc = location + Point::from((0, (TAB_HEIGHT as f64 * scale.y) as i32));
|
||||
let frosted = self.0.with_program(|p| {
|
||||
let theme = p.theme.lock().unwrap();
|
||||
if theme.cosmic().frosted_windows {
|
||||
(theme.cosmic().frosted as u8 + 1) as usize
|
||||
} else {
|
||||
0
|
||||
}
|
||||
});
|
||||
let radii = self.0.with_program(|p| {
|
||||
let windows = p.windows.lock().unwrap();
|
||||
let active = p.active.load(Ordering::SeqCst);
|
||||
let appearance = p.appearance_conf.lock().unwrap();
|
||||
let theme = p.theme.lock().unwrap();
|
||||
let tiled = p.tiled.load(Ordering::Acquire);
|
||||
let maximized = windows[active].is_maximized(false);
|
||||
let round = (appearance.clip_tiled_windows || !tiled) && !maximized;
|
||||
round.then(|| {
|
||||
theme
|
||||
.cosmic()
|
||||
.radius_s()
|
||||
.map(|x| if x < 4.0 { x } else { x + 4.0 })
|
||||
.map(|x| x.round() as u8)
|
||||
})
|
||||
});
|
||||
|
||||
self.0
|
||||
.push_render_elements(renderer, stack_loc, scale, alpha, &mut |elem| {
|
||||
|
|
@ -779,19 +820,8 @@ impl CosmicStack {
|
|||
let windows = p.windows.lock().unwrap();
|
||||
let active = p.active.load(Ordering::SeqCst);
|
||||
let theme = p.theme.lock().unwrap();
|
||||
let appearance = p.appearance_conf.lock().unwrap();
|
||||
let tiled = p.tiled.load(Ordering::Acquire);
|
||||
let maximized = windows[active].is_maximized(false);
|
||||
|
||||
let round = (appearance.clip_tiled_windows || !tiled) && !maximized;
|
||||
let radii = round.then(|| {
|
||||
theme
|
||||
.cosmic()
|
||||
.radius_s()
|
||||
.map(|x| if x < 4.0 { x } else { x + 4.0 })
|
||||
.map(|x| x.round() as u8)
|
||||
});
|
||||
|
||||
let mut geo = SpaceElement::geometry(&windows[active]).to_f64();
|
||||
geo.loc += location.to_f64().to_logical(scale);
|
||||
geo.size.h += TAB_HEIGHT as f64;
|
||||
|
|
@ -809,7 +839,7 @@ impl CosmicStack {
|
|||
Key::Window(Usage::Border, window_key.clone()),
|
||||
geo.to_i32_round().as_local(),
|
||||
1,
|
||||
radii.unwrap_or([0, 0, 0, 0]),
|
||||
radii.unwrap_or([0; 4]),
|
||||
a * alpha,
|
||||
scale.x,
|
||||
[r, g, b],
|
||||
|
|
@ -826,11 +856,34 @@ impl CosmicStack {
|
|||
scanout_node,
|
||||
radii.is_some(),
|
||||
radii.unwrap_or([0; 4]),
|
||||
9, // as TODO
|
||||
frosted,
|
||||
&mut |elem| push_above(elem.into()),
|
||||
Some(&mut |elem| push_below(elem.into())),
|
||||
);
|
||||
});
|
||||
|
||||
if frosted > 0 {
|
||||
let geometry = Rectangle::new(
|
||||
stack_loc.to_f64().to_logical(scale),
|
||||
Size::new(
|
||||
geometry.size.to_f64().to_logical(scale).w,
|
||||
TAB_HEIGHT as f64,
|
||||
),
|
||||
);
|
||||
if let Ok(Some(elem)) = self.0.with_program(|p| {
|
||||
let mut state = p.blur_state.lock().unwrap();
|
||||
BlurElement::from_state(
|
||||
renderer,
|
||||
&mut state,
|
||||
geometry,
|
||||
scale.x,
|
||||
radii.map(|[_, b, _, d]| [0, b, 0, d]).unwrap_or([0; 4]),
|
||||
frosted,
|
||||
)
|
||||
}) {
|
||||
push_below(elem.into());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn set_theme(&self, theme: cosmic::Theme) {
|
||||
|
|
@ -1342,16 +1395,29 @@ impl Decorations<CosmicStackInternal, Message> for DefaultDecorations {
|
|||
.class(theme::Container::custom(move |theme| {
|
||||
let cosmic_theme = theme.cosmic();
|
||||
|
||||
let background = if group_focused {
|
||||
let mut background = if group_focused {
|
||||
cosmic_theme.accent_color()
|
||||
} else {
|
||||
cosmic_theme.primary_container_color()
|
||||
};
|
||||
if cosmic_theme.frosted_windows {
|
||||
background.alpha = cosmic_theme.alpha_map.blurred_alpha(cosmic_theme.frosted);
|
||||
}
|
||||
|
||||
iced_widget::container::Style {
|
||||
snap: true,
|
||||
icon_color: Some(cosmic_theme.background.on.into()),
|
||||
text_color: Some(cosmic_theme.background.on.into()),
|
||||
icon_color: Some(
|
||||
cosmic_theme
|
||||
.background(cosmic_theme.frosted_windows)
|
||||
.on
|
||||
.into(),
|
||||
),
|
||||
text_color: Some(
|
||||
cosmic_theme
|
||||
.background(cosmic_theme.frosted_windows)
|
||||
.on
|
||||
.into(),
|
||||
),
|
||||
background: Some(Background::Color(background.into())),
|
||||
border: Border {
|
||||
radius,
|
||||
|
|
@ -1864,6 +1930,7 @@ impl TouchTarget<State> for CosmicStack {
|
|||
|
||||
pub enum CosmicStackRenderElement<R: Renderer + ImportAll + ImportMem> {
|
||||
Header(MemoryRenderBufferRenderElement<R>),
|
||||
HeaderBlur(BlurElement),
|
||||
Shadow(PixelShaderElement),
|
||||
Border(PixelShaderElement),
|
||||
Window(SurfaceRenderElement<R>),
|
||||
|
|
@ -1877,6 +1944,12 @@ impl<R: Renderer + ImportAll + ImportMem> From<MemoryRenderBufferRenderElement<R
|
|||
}
|
||||
}
|
||||
|
||||
impl<R: Renderer + AsGlowRenderer> From<BlurElement> for CosmicStackRenderElement<R> {
|
||||
fn from(value: BlurElement) -> Self {
|
||||
Self::HeaderBlur(value)
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: Renderer + ImportAll + ImportMem> From<SurfaceRenderElement<R>>
|
||||
for CosmicStackRenderElement<R>
|
||||
{
|
||||
|
|
@ -1893,6 +1966,7 @@ where
|
|||
fn id(&self) -> &RendererId {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.id(),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.id(),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.id(),
|
||||
CosmicStackRenderElement::Border(elem) => elem.id(),
|
||||
CosmicStackRenderElement::Window(elem) => elem.id(),
|
||||
|
|
@ -1902,6 +1976,7 @@ where
|
|||
fn current_commit(&self) -> CommitCounter {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.current_commit(),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.current_commit(),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.current_commit(),
|
||||
CosmicStackRenderElement::Border(elem) => elem.current_commit(),
|
||||
CosmicStackRenderElement::Window(elem) => elem.current_commit(),
|
||||
|
|
@ -1911,6 +1986,7 @@ where
|
|||
fn src(&self) -> Rectangle<f64, Buffer> {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.src(),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.src(),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.src(),
|
||||
CosmicStackRenderElement::Border(elem) => elem.src(),
|
||||
CosmicStackRenderElement::Window(elem) => elem.src(),
|
||||
|
|
@ -1920,6 +1996,7 @@ where
|
|||
fn geometry(&self, scale: Scale<f64>) -> Rectangle<i32, Physical> {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.geometry(scale),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.geometry(scale),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.geometry(scale),
|
||||
CosmicStackRenderElement::Border(elem) => elem.geometry(scale),
|
||||
CosmicStackRenderElement::Window(elem) => elem.geometry(scale),
|
||||
|
|
@ -1929,6 +2006,7 @@ where
|
|||
fn location(&self, scale: Scale<f64>) -> Point<i32, Physical> {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.location(scale),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.location(scale),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.location(scale),
|
||||
CosmicStackRenderElement::Border(elem) => elem.location(scale),
|
||||
CosmicStackRenderElement::Window(elem) => elem.location(scale),
|
||||
|
|
@ -1938,6 +2016,7 @@ where
|
|||
fn transform(&self) -> Transform {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.transform(),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.transform(),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.transform(),
|
||||
CosmicStackRenderElement::Border(elem) => elem.transform(),
|
||||
CosmicStackRenderElement::Window(elem) => elem.transform(),
|
||||
|
|
@ -1951,6 +2030,7 @@ where
|
|||
) -> DamageSet<i32, Physical> {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.damage_since(scale, commit),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.damage_since(scale, commit),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.damage_since(scale, commit),
|
||||
CosmicStackRenderElement::Border(elem) => elem.damage_since(scale, commit),
|
||||
CosmicStackRenderElement::Window(elem) => elem.damage_since(scale, commit),
|
||||
|
|
@ -1960,6 +2040,7 @@ where
|
|||
fn opaque_regions(&self, scale: Scale<f64>) -> OpaqueRegions<i32, Physical> {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.opaque_regions(scale),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.opaque_regions(scale),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.opaque_regions(scale),
|
||||
CosmicStackRenderElement::Border(elem) => elem.opaque_regions(scale),
|
||||
CosmicStackRenderElement::Window(elem) => elem.opaque_regions(scale),
|
||||
|
|
@ -1969,6 +2050,7 @@ where
|
|||
fn alpha(&self) -> f32 {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.alpha(),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.alpha(),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.alpha(),
|
||||
CosmicStackRenderElement::Border(elem) => elem.alpha(),
|
||||
CosmicStackRenderElement::Window(elem) => elem.alpha(),
|
||||
|
|
@ -1978,6 +2060,7 @@ where
|
|||
fn kind(&self) -> Kind {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.kind(),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.kind(),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.kind(),
|
||||
CosmicStackRenderElement::Border(elem) => elem.kind(),
|
||||
CosmicStackRenderElement::Window(elem) => elem.kind(),
|
||||
|
|
@ -1987,6 +2070,7 @@ where
|
|||
fn is_framebuffer_effect(&self) -> bool {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.is_framebuffer_effect(),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.is_framebuffer_effect(),
|
||||
CosmicStackRenderElement::Shadow(elem) => elem.is_framebuffer_effect(),
|
||||
CosmicStackRenderElement::Border(elem) => elem.is_framebuffer_effect(),
|
||||
CosmicStackRenderElement::Window(elem) => elem.is_framebuffer_effect(),
|
||||
|
|
@ -2012,6 +2096,9 @@ where
|
|||
CosmicStackRenderElement::Header(elem) => {
|
||||
elem.draw(frame, src, dst, damage, opaque_regions, cache)
|
||||
}
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => {
|
||||
RenderElement::<R>::draw(elem, frame, src, dst, damage, opaque_regions, cache)
|
||||
}
|
||||
CosmicStackRenderElement::Shadow(elem) | CosmicStackRenderElement::Border(elem) => {
|
||||
RenderElement::<GlowRenderer>::draw(
|
||||
elem,
|
||||
|
|
@ -2033,6 +2120,7 @@ where
|
|||
fn underlying_storage(&self, renderer: &mut R) -> Option<UnderlyingStorage<'_>> {
|
||||
match self {
|
||||
CosmicStackRenderElement::Header(elem) => elem.underlying_storage(renderer),
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => elem.underlying_storage(renderer),
|
||||
CosmicStackRenderElement::Shadow(elem) | CosmicStackRenderElement::Border(elem) => {
|
||||
elem.underlying_storage(renderer.glow_renderer_mut())
|
||||
}
|
||||
|
|
@ -2051,6 +2139,9 @@ where
|
|||
CosmicStackRenderElement::Header(elem) => {
|
||||
elem.capture_framebuffer(frame, src, dst, cache)
|
||||
}
|
||||
CosmicStackRenderElement::HeaderBlur(elem) => {
|
||||
RenderElement::<R>::capture_framebuffer(elem, frame, src, dst, cache)
|
||||
}
|
||||
CosmicStackRenderElement::Shadow(elem) | CosmicStackRenderElement::Border(elem) => {
|
||||
RenderElement::<GlowRenderer>::capture_framebuffer(
|
||||
elem,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue