aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-12-28 12:06:22 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2024-12-30 20:12:37 +0300
commit3c0705b0ae4af6452a06fb9e7b806be4a0d74094 (patch)
treeb1080ecad7595968a266cc44dc11e555ec496f88 /src
parent4ea4d2bd3bea5407c6ddc0ee33f55025ffc1bf38 (diff)
downloadniri-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.rs25
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);