Fix sluggish experience when dragging tabs

The problem was caused by a missing call to `WindowContext::notify` when
moving the mouse. Actually, we *did* notify as part of a `MouseMoveEvent`
listener registered in `Interactivity` but that code path was never
exercised because we were clearing the `pending_mouse_down`.

This commit fixes the issue by automatically redrawing the window in gpui
when there is an active drag and the mouse moves.
This commit is contained in:
Antonio Scandurra 2023-12-20 11:21:55 +01:00
parent dfed171627
commit 00927db711
2 changed files with 18 additions and 10 deletions

View File

@ -1186,14 +1186,13 @@ impl Interactivity {
cx.on_mouse_event({
let pending_mouse_down = pending_mouse_down.clone();
move |event: &MouseMoveEvent, phase, cx| {
let mut pending_mouse_down = pending_mouse_down.borrow_mut();
if phase == DispatchPhase::Capture {
return;
}
let mut pending_mouse_down = pending_mouse_down.borrow_mut();
if let Some(mouse_down) = pending_mouse_down.clone() {
if cx.active_drag.is_some() {
if phase == DispatchPhase::Capture {
cx.notify();
}
} else if phase == DispatchPhase::Bubble
if !cx.has_active_drag()
&& (event.position - mouse_down.position).magnitude()
> DRAG_THRESHOLD
{

View File

@ -1516,15 +1516,24 @@ impl<'a> WindowContext<'a> {
}
}
if self.app.propagate_event && event.downcast_ref::<MouseUpEvent>().is_some() {
self.active_drag = None;
}
self.window
.rendered_frame
.mouse_listeners
.insert(event.type_id(), handlers);
}
if self.app.propagate_event && self.has_active_drag() {
if event.is::<MouseMoveEvent>() {
// If this was a mouse move event, redraw the window so that the
// active drag can follow the mouse cursor.
self.notify();
} else if event.is::<MouseUpEvent>() {
// If this was a mouse up event, cancel the active drag and redraw
// the window.
self.active_drag = None;
self.notify();
}
}
}
fn dispatch_key_event(&mut self, event: &dyn Any) {