From 045e154915d2491f0036a2b6220d007be7d8446f Mon Sep 17 00:00:00 2001 From: Mayank Verma Date: Mon, 22 Dec 2025 03:37:30 +0530 Subject: [PATCH] gpui: Fix hover state getting stuck when rapidly hovering over elements (#45437) Closes #45436 Release Notes: - N/A --------- Co-authored-by: MrSubidubi --- crates/gpui/src/elements/div.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/crates/gpui/src/elements/div.rs b/crates/gpui/src/elements/div.rs index 547d967620d68c309563af1d2e56d2ab3f194d4f..952cef7f58e6628c71b517ff74735b092edc37f7 100644 --- a/crates/gpui/src/elements/div.rs +++ b/crates/gpui/src/elements/div.rs @@ -2154,7 +2154,6 @@ impl Interactivity { || cx.active_drag.is_some() && !self.drag_over_styles.is_empty() { let hitbox = hitbox.clone(); - let was_hovered = hitbox.is_hovered(window); let hover_state = self.hover_style.as_ref().and_then(|_| { element_state .as_ref() @@ -2162,8 +2161,12 @@ impl Interactivity { .cloned() }); let current_view = window.current_view(); + window.on_mouse_event(move |_: &MouseMoveEvent, phase, window, cx| { let hovered = hitbox.is_hovered(window); + let was_hovered = hover_state + .as_ref() + .is_some_and(|state| state.borrow().element); if phase == DispatchPhase::Capture && hovered != was_hovered { if let Some(hover_state) = &hover_state { hover_state.borrow_mut().element = hovered; @@ -2179,12 +2182,13 @@ impl Interactivity { .as_ref() .and_then(|element| element.hover_state.as_ref()) .cloned(); - - let was_group_hovered = group_hitbox_id.is_hovered(window); let current_view = window.current_view(); window.on_mouse_event(move |_: &MouseMoveEvent, phase, window, cx| { let group_hovered = group_hitbox_id.is_hovered(window); + let was_group_hovered = hover_state + .as_ref() + .is_some_and(|state| state.borrow().group); if phase == DispatchPhase::Capture && group_hovered != was_group_hovered { if let Some(hover_state) = &hover_state { hover_state.borrow_mut().group = group_hovered;