aboutsummaryrefslogtreecommitdiff
path: root/src/layout/mod.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-04-09 22:37:10 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-04-09 23:42:01 +0400
commitdd011f1012e10b1e3a1dbe100cb603a457bba12a (patch)
tree2fb853be8bbe1ee5afdf3dea4974768874a5e793 /src/layout/mod.rs
parent301a2c06613c76d2c16a85ab21ad132e5618454b (diff)
downloadniri-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.rs47
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);