diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-12-28 12:06:22 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-12-30 20:12:37 +0300 |
| commit | 3c0705b0ae4af6452a06fb9e7b806be4a0d74094 (patch) | |
| tree | b1080ecad7595968a266cc44dc11e555ec496f88 /src | |
| parent | 4ea4d2bd3bea5407c6ddc0ee33f55025ffc1bf38 (diff) | |
| download | niri-3c0705b0ae4af6452a06fb9e7b806be4a0d74094.tar.gz niri-3c0705b0ae4af6452a06fb9e7b806be4a0d74094.tar.bz2 niri-3c0705b0ae4af6452a06fb9e7b806be4a0d74094.zip | |
Implement buffer delta for toplevels
Diffstat (limited to 'src')
| -rw-r--r-- | src/handlers/compositor.rs | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/handlers/compositor.rs b/src/handlers/compositor.rs index ed55ae94..ff927531 100644 --- a/src/handlers/compositor.rs +++ b/src/handlers/compositor.rs @@ -1,5 +1,6 @@ use std::collections::hash_map::Entry; +use niri_ipc::PositionChange; use smithay::backend::renderer::utils::{on_commit_buffer_handler, with_renderer_surface_state}; use smithay::input::pointer::{CursorImageStatus, CursorImageSurfaceData}; use smithay::reexports::calloop::Interest; @@ -279,14 +280,21 @@ impl CompositorHandler for State { return; } - let serial = with_states(surface, |states| { + let (serial, buffer_delta) = with_states(surface, |states| { + let buffer_delta = states + .cached_state + .get::<SurfaceAttributes>() + .current() + .buffer_delta + .take(); + let role = states .data_map .get::<XdgToplevelSurfaceData>() .unwrap() .lock() .unwrap(); - role.configure_serial + (role.configure_serial, buffer_delta) }); if serial.is_none() { error!("commit on a mapped surface without a configured serial"); @@ -295,6 +303,19 @@ impl CompositorHandler for State { // The toplevel remains mapped. self.niri.layout.update_window(&window, serial); + // Move the toplevel according to the attach offset. + if let Some(delta) = buffer_delta { + if delta.x != 0 || delta.y != 0 { + let (x, y) = delta.to_f64().into(); + self.niri.layout.move_floating_window( + Some(&window), + PositionChange::AdjustFixed(x), + PositionChange::AdjustFixed(y), + false, + ); + } + } + // Popup placement depends on window size which might have changed. self.update_reactive_popups(&window); |
