cosmic-comp/src/wayland/handlers/corner_radius.rs

59 lines
1.8 KiB
Rust
Raw Normal View History

2025-09-25 09:10:00 -04:00
use cosmic_protocols::corner_radius::v1::server::cosmic_corner_radius_toplevel_v1;
use smithay::reexports::wayland_protocols::xdg::shell::server::xdg_toplevel;
2025-09-24 15:11:16 -04:00
use smithay::wayland::shell::xdg::ToplevelSurface;
use crate::wayland::protocols::corner_radius::{
2025-09-25 09:10:00 -04:00
delegate_corner_radius, CornerRadiusData, CornerRadiusHandler, CornerRadiusState,
2025-09-24 15:11:16 -04:00
};
use crate::state::State;
impl CornerRadiusHandler for State {
2025-09-25 09:10:00 -04:00
fn corner_radius_state(&mut self) -> &mut CornerRadiusState {
2025-09-24 15:11:16 -04:00
&mut self.common.corner_radius_state
}
fn toplevel_from_resource(
&mut self,
2025-09-25 09:10:00 -04:00
toplevel: &xdg_toplevel::XdgToplevel,
2025-09-24 15:11:16 -04:00
) -> Option<ToplevelSurface> {
self.common.xdg_shell_state.get_toplevel(toplevel)
}
fn set_corner_radius(
&mut self,
_: &cosmic_corner_radius_toplevel_v1::CosmicCornerRadiusToplevelV1,
data: &CornerRadiusData,
2025-09-24 15:11:16 -04:00
) {
if force_redraw(self, data).is_none() {
tracing::warn!("Failed to force redraw for corner radius change.");
}
2025-09-24 15:11:16 -04:00
}
fn unset_corner_radius(
&mut self,
_: &cosmic_corner_radius_toplevel_v1::CosmicCornerRadiusToplevelV1,
data: &CornerRadiusData,
2025-09-24 15:11:16 -04:00
) {
if force_redraw(self, data).is_none() {
tracing::warn!("Failed to force redraw for corner radius reset.");
}
2025-09-24 15:11:16 -04:00
}
}
fn force_redraw(state: &mut State, data: &CornerRadiusData) -> Option<()> {
let guard = data.lock().unwrap();
let toplevel = guard.toplevel.upgrade().ok()?;
let surface = state.common.xdg_shell_state.get_toplevel(&toplevel)?;
let guard = state.common.shell.read();
let output = guard.visible_output_for_surface(surface.wl_surface())?;
state.backend.schedule_render(output);
Some(())
}
2025-09-24 15:11:16 -04:00
delegate_corner_radius!(State);