Implement window closing animations

This commit is contained in:
Ivan Molodetskikh
2024-04-09 22:37:10 +04:00
parent 301a2c0661
commit dd011f1012
12 changed files with 683 additions and 24 deletions
+46 -1
View File
@@ -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);