diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-04-13 11:07:23 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-04-13 11:07:23 +0400 |
| commit | 71be19b234d58f4ec447e921633506beb81a52c0 (patch) | |
| tree | a6b69d57a3e2edc9d8dac4c969548f227cbf341a /src/handlers | |
| parent | 4fd9300bdb07e90c26df28461f9bd6591c3d1d41 (diff) | |
| download | niri-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.rs | 33 |
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); + } } }) } |
