diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-04-09 22:37:10 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-04-09 23:42:01 +0400 |
| commit | dd011f1012e10b1e3a1dbe100cb603a457bba12a (patch) | |
| tree | 2fb853be8bbe1ee5afdf3dea4974768874a5e793 /src/layout/mod.rs | |
| parent | 301a2c06613c76d2c16a85ab21ad132e5618454b (diff) | |
| download | niri-dd011f1012e10b1e3a1dbe100cb603a457bba12a.tar.gz niri-dd011f1012e10b1e3a1dbe100cb603a457bba12a.tar.bz2 niri-dd011f1012e10b1e3a1dbe100cb603a457bba12a.zip | |
Implement window closing animations
Diffstat (limited to 'src/layout/mod.rs')
| -rw-r--r-- | src/layout/mod.rs | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 9db7b140..18870025 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -39,6 +39,7 @@ use niri_ipc::SizeChange; use smithay::backend::renderer::element::solid::SolidColorRenderElement; use smithay::backend::renderer::element::surface::WaylandSurfaceRenderElement; use smithay::backend::renderer::element::Id; +use smithay::backend::renderer::gles::GlesRenderer; use smithay::output::Output; use smithay::reexports::wayland_server::protocol::wl_surface::WlSurface; use smithay::utils::{Logical, Point, Scale, Size, Transform}; @@ -47,11 +48,13 @@ use self::monitor::Monitor; pub use self::monitor::MonitorRenderElement; use self::workspace::{compute_working_area, Column, ColumnWidth, OutputId, Workspace}; use crate::niri_render_elements; +use crate::render_helpers::primary_gpu_texture::PrimaryGpuTextureRenderElement; use crate::render_helpers::renderer::NiriRenderer; -use crate::render_helpers::RenderTarget; +use crate::render_helpers::{RenderSnapshot, RenderTarget}; use crate::utils::output_size; use crate::window::ResolvedWindowRules; +pub mod closing_window; pub mod focus_ring; pub mod monitor; pub mod tile; @@ -64,6 +67,13 @@ niri_render_elements! { } } +niri_render_elements! { + LayoutElementSnapshotRenderElements => { + Texture = PrimaryGpuTextureRenderElement, + SolidColor = SolidColorRenderElement, + } +} + pub trait LayoutElement { /// Type that can be used as a unique ID of this element. type Id: PartialEq; @@ -100,6 +110,8 @@ pub trait LayoutElement { target: RenderTarget, ) -> Vec<LayoutElementRenderElement<R>>; + fn take_last_render(&self) -> RenderSnapshot<LayoutElementSnapshotRenderElements>; + fn request_size(&self, size: Size<i32, Logical>); fn request_fullscreen(&self, size: Size<i32, Logical>); fn min_size(&self) -> Size<i32, Logical>; @@ -1750,6 +1762,35 @@ impl<W: LayoutElement> Layout<W> { } } + pub fn start_close_animation_for_window( + &mut self, + renderer: &mut GlesRenderer, + window: &W::Id, + ) { + let _span = tracy_client::span!("Layout::start_close_animation_for_window"); + + match &mut self.monitor_set { + MonitorSet::Normal { monitors, .. } => { + for mon in monitors { + for ws in &mut mon.workspaces { + if ws.has_window(window) { + ws.start_close_animation_for_window(renderer, window); + return; + } + } + } + } + MonitorSet::NoOutputs { workspaces, .. } => { + for ws in workspaces { + if ws.has_window(window) { + ws.start_close_animation_for_window(renderer, window); + return; + } + } + } + } + } + pub fn refresh(&mut self) { let _span = tracy_client::span!("Layout::refresh"); @@ -1889,6 +1930,10 @@ mod tests { vec![] } + fn take_last_render(&self) -> RenderSnapshot<LayoutElementSnapshotRenderElements> { + RenderSnapshot::default() + } + fn request_size(&self, size: Size<i32, Logical>) { self.0.requested_size.set(Some(size)); self.0.pending_fullscreen.set(false); |
