diff --git a/crates/gpui/src/app/window.rs b/crates/gpui/src/app/window.rs index 51eb3b8fa61bf5d3c558d7d0e07ce2f3eb5481de..12a9adafcbac3289e87f03ac55a450af289ca7b2 100644 --- a/crates/gpui/src/app/window.rs +++ b/crates/gpui/src/app/window.rs @@ -52,8 +52,8 @@ pub struct Window { cursor_regions: Vec, mouse_regions: Vec<(MouseRegion, usize)>, last_mouse_moved_event: Option, - pub(crate) hovered_region_ids: HashSet, - pub(crate) clicked_region_ids: HashSet, + pub(crate) hovered_region_ids: Vec, + pub(crate) clicked_region_ids: Vec, pub(crate) clicked_region: Option<(MouseRegionId, MouseButton)>, mouse_position: Vector2F, text_layout_cache: TextLayoutCache, @@ -678,6 +678,7 @@ impl<'a> WindowContext<'a> { let mut highest_z_index = None; let mouse_position = self.window.mouse_position.clone(); let window = &mut *self.window; + let prev_hovered_regions = mem::take(&mut window.hovered_region_ids); for (region, z_index) in window.mouse_regions.iter().rev() { // Allow mouse regions to appear transparent to hovers if !region.hoverable { @@ -696,7 +697,11 @@ impl<'a> WindowContext<'a> { // highest_z_index is set. if contains_mouse && z_index == highest_z_index.unwrap() { //Ensure that hover entrance events aren't sent twice - if window.hovered_region_ids.insert(region.id()) { + if let Err(ix) = window.hovered_region_ids.binary_search(®ion.id()) { + window.hovered_region_ids.insert(ix, region.id()); + } + // window.hovered_region_ids.insert(region.id()); + if !prev_hovered_regions.contains(®ion.id()) { valid_regions.push(region.clone()); if region.notify_on_hover { notified_views.insert(region.id().view_id()); @@ -704,7 +709,7 @@ impl<'a> WindowContext<'a> { } } else { // Ensure that hover exit events aren't sent twice - if window.hovered_region_ids.remove(®ion.id()) { + if prev_hovered_regions.contains(®ion.id()) { valid_regions.push(region.clone()); if region.notify_on_hover { notified_views.insert(region.id().view_id()); diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index 022346ea67b24e99a9644b9dce77b843d05a6fd0..f62c33e9f5587c5632d86f5e897d9235e62e8e6d 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -1087,7 +1087,10 @@ extern "C" fn handle_view_event(this: &Object, _: Sel, native_event: id) { button: MouseButton::Left, modifiers: Modifiers { ctrl: true, .. }, .. - }) => return, + }) => { + window_state_borrow.synthetic_drag_counter += 1; + return; + } _ => None, }; diff --git a/crates/gpui/src/scene/mouse_region.rs b/crates/gpui/src/scene/mouse_region.rs index ca2cc04b9d1cf75c54ee9593705172f93c6f8ec4..cf39ac782fca327a627105a8ebe88f0f29f95ca5 100644 --- a/crates/gpui/src/scene/mouse_region.rs +++ b/crates/gpui/src/scene/mouse_region.rs @@ -177,7 +177,7 @@ impl MouseRegion { } } -#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] +#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, PartialOrd, Ord)] pub struct MouseRegionId { view_id: usize, tag: TypeId,