aboutsummaryrefslogtreecommitdiff
path: root/src/handlers
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-04-13 11:07:23 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-04-13 11:07:23 +0400
commit71be19b234d58f4ec447e921633506beb81a52c0 (patch)
treea6b69d57a3e2edc9d8dac4c969548f227cbf341a /src/handlers
parent4fd9300bdb07e90c26df28461f9bd6591c3d1d41 (diff)
downloadniri-71be19b234d58f4ec447e921633506beb81a52c0.tar.gz
niri-71be19b234d58f4ec447e921633506beb81a52c0.tar.bz2
niri-71be19b234d58f4ec447e921633506beb81a52c0.zip
Implement window resize animations
Diffstat (limited to 'src/handlers')
-rw-r--r--src/handlers/xdg_shell.rs33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/handlers/xdg_shell.rs b/src/handlers/xdg_shell.rs
index 85ce5915..ab9d7072 100644
--- a/src/handlers/xdg_shell.rs
+++ b/src/handlers/xdg_shell.rs
@@ -815,16 +815,34 @@ fn unconstrain_with_padding(
pub fn add_mapped_toplevel_pre_commit_hook(toplevel: &ToplevelSurface) -> HookId {
add_pre_commit_hook::<State, _>(toplevel.wl_surface(), move |state, _dh, surface| {
+ let _span = tracy_client::span!("mapped toplevel pre-commit");
+
let Some((mapped, _)) = state.niri.layout.find_window_and_output_mut(surface) else {
error!("pre-commit hook for mapped surfaces must be removed upon unmapping");
return;
};
- let got_unmapped = with_states(surface, |states| {
- let attrs = states.cached_state.current::<SurfaceAttributes>();
- matches!(attrs.buffer, Some(BufferAssignment::Removed))
+ let (got_unmapped, commit_serial) = with_states(surface, |states| {
+ let attrs = states.cached_state.pending::<SurfaceAttributes>();
+ let got_unmapped = matches!(attrs.buffer, Some(BufferAssignment::Removed));
+
+ let role = states
+ .data_map
+ .get::<XdgToplevelSurfaceData>()
+ .unwrap()
+ .lock()
+ .unwrap();
+
+ (got_unmapped, role.configure_serial)
});
+ let animate = if let Some(serial) = commit_serial {
+ mapped.should_animate_commit(serial)
+ } else {
+ error!("commit on a mapped surface without a configured serial");
+ false
+ };
+
if got_unmapped {
state.backend.with_primary_renderer(|renderer| {
mapped.render_and_store_snapshot(renderer);
@@ -832,6 +850,15 @@ pub fn add_mapped_toplevel_pre_commit_hook(toplevel: &ToplevelSurface) -> HookId
} else {
// The toplevel remains mapped; clear any cached render snapshot.
let _ = mapped.take_last_render();
+
+ if animate {
+ state.backend.with_primary_renderer(|renderer| {
+ mapped.store_animation_snapshot(renderer);
+ });
+
+ let window = mapped.window.clone();
+ state.niri.layout.prepare_for_resize_animation(&window);
+ }
}
})
}