diff --git a/crates/gpui/src/app/window.rs b/crates/gpui/src/app/window.rs index b1a758b049..2edb2af8a1 100644 --- a/crates/gpui/src/app/window.rs +++ b/crates/gpui/src/app/window.rs @@ -59,10 +59,10 @@ pub struct Window { mouse_regions: Vec<(MouseRegion, usize)>, event_handlers: Vec, last_mouse_moved_event: Option, + last_mouse_position: Vector2F, 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, } @@ -94,10 +94,10 @@ impl Window { event_handlers: Default::default(), text_layout_cache: TextLayoutCache::new(cx.font_system.clone()), last_mouse_moved_event: None, + last_mouse_position: Vector2F::zero(), hovered_region_ids: Default::default(), clicked_region_ids: Default::default(), clicked_region: None, - mouse_position: Default::default(), titlebar_height, appearance, }; @@ -259,7 +259,7 @@ impl<'a> WindowContext<'a> { } pub fn mouse_position(&self) -> Vector2F { - self.window.mouse_position + self.window.platform_window.mouse_position() } pub fn text_layout_cache(&self) -> &TextLayoutCache { @@ -578,7 +578,7 @@ impl<'a> WindowContext<'a> { // Synthesize one last drag event to end the drag mouse_events.push(MouseEvent::Drag(MouseDrag { region: Default::default(), - prev_mouse_position: self.window.mouse_position, + prev_mouse_position: self.window.last_mouse_position, platform_event: MouseMovedEvent { position: e.position, pressed_button: Some(e.button), @@ -631,14 +631,14 @@ impl<'a> WindowContext<'a> { if pressed_button.is_some() { mouse_events.push(MouseEvent::Drag(MouseDrag { region: Default::default(), - prev_mouse_position: self.window.mouse_position, + prev_mouse_position: self.window.last_mouse_position, platform_event: e.clone(), end: false, })); } else if let Some((_, clicked_button)) = self.window.clicked_region { mouse_events.push(MouseEvent::Drag(MouseDrag { region: Default::default(), - prev_mouse_position: self.window.mouse_position, + prev_mouse_position: self.window.last_mouse_position, platform_event: e.clone(), end: true, })); @@ -698,7 +698,7 @@ impl<'a> WindowContext<'a> { } if let Some(position) = event.position() { - self.window.mouse_position = position; + self.window.last_mouse_position = position; } // 2. Dispatch mouse events on regions @@ -712,7 +712,7 @@ impl<'a> WindowContext<'a> { match &mouse_event { MouseEvent::Hover(_) => { let mut highest_z_index = None; - let mouse_position = self.window.mouse_position.clone(); + let mouse_position = self.mouse_position(); 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() { @@ -757,7 +757,7 @@ impl<'a> WindowContext<'a> { MouseEvent::Down(_) | MouseEvent::Up(_) => { for (region, _) in self.window.mouse_regions.iter().rev() { - if region.bounds.contains_point(self.window.mouse_position) { + if region.bounds.contains_point(self.mouse_position()) { valid_regions.push(region.clone()); if region.notify_on_click { notified_views.insert(region.id().view_id()); @@ -784,10 +784,7 @@ impl<'a> WindowContext<'a> { // Find regions which still overlap with the mouse since the last MouseDown happened for (mouse_region, _) in self.window.mouse_regions.iter().rev() { if clicked_region_ids.contains(&mouse_region.id()) { - if mouse_region - .bounds - .contains_point(self.window.mouse_position) - { + if mouse_region.bounds.contains_point(self.mouse_position()) { valid_regions.push(mouse_region.clone()); } } @@ -809,10 +806,7 @@ impl<'a> WindowContext<'a> { | MouseEvent::ClickOut(_) => { for (mouse_region, _) in self.window.mouse_regions.iter().rev() { // NOT contains - if !mouse_region - .bounds - .contains_point(self.window.mouse_position) - { + if !mouse_region.bounds.contains_point(self.mouse_position()) { valid_regions.push(mouse_region.clone()); } } @@ -821,10 +815,7 @@ impl<'a> WindowContext<'a> { _ => { for (mouse_region, _) in self.window.mouse_regions.iter().rev() { // Contains - if mouse_region - .bounds - .contains_point(self.window.mouse_position) - { + if mouse_region.bounds.contains_point(self.mouse_position()) { valid_regions.push(mouse_region.clone()); } }