From ac8b22f2bba8f502097bc358166d89f6049cc62f Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Wed, 10 Jul 2024 20:03:20 +0200 Subject: [PATCH] toplevel-drag: correctly update surface positions --- src/ifs/wl_seat/event_handling.rs | 14 ++++++++++++-- src/ifs/xdg_toplevel_drag_v1.rs | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/ifs/wl_seat/event_handling.rs b/src/ifs/wl_seat/event_handling.rs index f64ab341..51bcb5a4 100644 --- a/src/ifs/wl_seat/event_handling.rs +++ b/src/ifs/wl_seat/event_handling.rs @@ -410,6 +410,16 @@ impl WlSeatGlobal { } } + fn set_pointer_cursor_position(&self, x: Fixed, y: Fixed) -> (Fixed, Fixed) { + let (x, y) = self.pointer_cursor.set_position(x, y); + if let Some(td) = self.pointer_owner.toplevel_drag() { + let x_int = x.round_down(); + let y_int = y.round_down(); + td.move_(x_int, y_int); + } + (x, y) + } + fn connector_position_event( self: &Rc, time_usec: u64, @@ -424,7 +434,7 @@ impl WlSeatGlobal { let pos = output.global.pos.get(); x += Fixed::from_int(pos.x1()); y += Fixed::from_int(pos.y1()); - (x, y) = self.pointer_cursor.set_position(x, y); + (x, y) = self.set_pointer_cursor_position(x, y); if let Some(c) = self.constraint.get() { if c.ty == ConstraintType::Lock || !c.contains(x.round_down(), y.round_down()) { c.deactivate(); @@ -484,7 +494,7 @@ impl WlSeatGlobal { dy_unaccelerated, ); }); - self.pointer_cursor.set_position(x, y); + self.set_pointer_cursor_position(x, y); self.cursor_moved(time_usec); } diff --git a/src/ifs/xdg_toplevel_drag_v1.rs b/src/ifs/xdg_toplevel_drag_v1.rs index f6f062cd..df34ec09 100644 --- a/src/ifs/xdg_toplevel_drag_v1.rs +++ b/src/ifs/xdg_toplevel_drag_v1.rs @@ -9,6 +9,7 @@ use { object::{Object, Version}, rect::Rect, renderer::Renderer, + tree::ToplevelNode, utils::clonecell::CloneCell, wire::{xdg_toplevel_drag_v1::*, XdgToplevelDragV1Id}, }, @@ -52,6 +53,18 @@ impl XdgToplevelDragV1 { } } + fn move2(&self, x: i32, y: i32) { + if let Some(tl) = self.toplevel.get() { + let extents = tl.xdg.absolute_desired_extents.get(); + let extents = extents.at_point(x - self.x_off.get(), y - self.y_off.get()); + tl.clone().tl_change_extents(&extents); + } + } + + pub fn move_(&self, x: i32, y: i32) { + self.move2(x, y); + } + pub fn render(&self, renderer: &mut Renderer<'_>, cursor_rect: &Rect, x: i32, y: i32) { if let Some(tl) = self.toplevel.get() { if tl.xdg.surface.buffer.get().is_some() { @@ -107,6 +120,10 @@ impl XdgToplevelDragV1 { }; tl.prepare_toplevel_drag(); self.client.state.tree_changed(); + if let Some(seat) = self.source.data.seat.get() { + let (x, y) = seat.pointer_cursor().position_int(); + self.move2(x, y) + } } pub fn finish_drag(&self, seat: &Rc) {