cosmic-comp/examples/customized-window-decorations.rs
2026-03-13 15:56:42 -04:00

79 lines
2.4 KiB
Rust

use cosmic::iced::{Color, Rectangle, Size};
use cosmic::widget;
use cosmic::widget::canvas;
use cosmic_comp::hooks::{Decorations, Hooks};
use cosmic_comp::shell::element::stack::{
DefaultDecorations as DefaultStackDecorations, TAB_HEIGHT,
};
use cosmic_comp::shell::element::window::{
DefaultDecorations as DefaultWindowDecorations, SSD_HEIGHT,
};
use std::sync::Arc;
/// The struct implementing Decorations hook
#[derive(Debug)]
struct AddIndicator<Lower> {
lower: Lower,
height: i32,
}
/// An iced program drawing a circle, which we'll add to the window decorations
struct Circle {
radius: f32,
color: Color,
}
impl<Message, Theme, Renderer: cosmic::iced_renderer::geometry::Renderer>
canvas::Program<Message, Theme, Renderer> for Circle
{
type State = ();
fn draw(
&self,
_state: &(),
renderer: &Renderer,
_theme: &Theme,
bounds: Rectangle,
_cursor: cosmic::iced::mouse::Cursor,
) -> Vec<Renderer::Geometry> {
let bounds = bounds.size();
let min = bounds.height.min(bounds.width);
let mut frame = canvas::Frame::new(renderer, Size::new(min, min));
let circle = canvas::Path::circle(frame.center(), self.radius);
frame.fill(&circle, self.color);
vec![frame.into_geometry()]
}
}
impl<Internal, Message: std::clone::Clone + 'static, Lower: Decorations<Internal, Message>>
Decorations<Internal, Message> for AddIndicator<Lower>
{
fn view(&self, window: &Internal) -> cosmic::Element<'_, Message> {
let orig = self.lower.view(window);
widget::row()
.push(
widget::column()
.push(canvas(Circle {
radius: (self.height as f32 / 2.) * 0.8,
color: Color::from_rgba(1.0, 0.0, 0.0, 1.0),
}))
.width(self.height as f32),
)
.push(orig)
.into()
}
}
/// The customized cosmic-comp entrypoint
fn main() -> Result<(), Box<dyn std::error::Error>> {
cosmic_comp::run(Hooks {
window_decorations: Some(Arc::new(AddIndicator {
height: SSD_HEIGHT,
lower: DefaultWindowDecorations,
})),
stack_decorations: Some(Arc::new(AddIndicator {
height: TAB_HEIGHT,
lower: DefaultStackDecorations,
})),
})
}