shell: Fix repeated window grabs in more scenarios

This commit is contained in:
Victoria Brekenfeld 2023-04-20 16:19:52 +02:00
parent 33eedb0b58
commit 8943aa5a15
2 changed files with 8 additions and 4 deletions

View file

@ -435,6 +435,7 @@ impl PointerTarget<State> for CosmicWindow {
PointerTarget::enter(&p.window, seat, data, &event) PointerTarget::enter(&p.window, seat, data, &event)
} }
} else { } else {
p.swap_focus(Focus::Window);
PointerTarget::enter(&p.window, seat, data, event) PointerTarget::enter(&p.window, seat, data, event)
} }
false false

View file

@ -222,7 +222,7 @@ impl MoveSurfaceGrab {
// No more buttons are pressed, release the grab. // No more buttons are pressed, release the grab.
let output = self.seat.active_output(); let output = self.seat.active_output();
let offset = if let Some(grab_state) = self let position = if let Some(grab_state) = self
.seat .seat
.user_data() .user_data()
.get::<SeatMoveGrabState>() .get::<SeatMoveGrabState>()
@ -266,7 +266,10 @@ impl MoveSurfaceGrab {
.active_space_mut(&output) .active_space_mut(&output)
.floating_layer .floating_layer
.map_internal(grab_state.window, &output, Some(window_location + offset)); .map_internal(grab_state.window, &output, Some(window_location + offset));
Some(grab_state.window_offset)
let pointer_pos = handle.current_location();
let relative_pos = state.common.shell.map_global_to_space(pointer_pos, &output);
Some(window_location + offset + (pointer_pos - relative_pos).to_i32_round())
} else { } else {
None None
} }
@ -276,10 +279,10 @@ impl MoveSurfaceGrab {
handle.unset_grab(state, serial, time); handle.unset_grab(state, serial, time);
if self.window.alive() { if self.window.alive() {
if let Some(offset) = offset { if let Some(position) = position {
handle.motion( handle.motion(
state, state,
Some((PointerFocusTarget::from(self.window.clone()), offset)), Some((PointerFocusTarget::from(self.window.clone()), position - self.window.geometry().loc)),
&MotionEvent { &MotionEvent {
location: handle.current_location(), location: handle.current_location(),
serial: serial, serial: serial,