diff --git a/gpui/src/elements/mouse_event_handler.rs b/gpui/src/elements/mouse_event_handler.rs index 997331545436b53f6b33a32211f5033f2f57e62f..9336c8b84a20178c10f57cb5632359b108d98d5c 100644 --- a/gpui/src/elements/mouse_event_handler.rs +++ b/gpui/src/elements/mouse_event_handler.rs @@ -94,24 +94,29 @@ impl Element for MouseEventHandler { let handled_in_child = self.child.dispatch_event(event, cx); self.state.update(cx, |state, cx| match event { - Event::MouseMoved { position } => { - let mouse_in = bounds.contains_point(*position); - if state.hovered != mouse_in { - state.hovered = mouse_in; - if let Some(cursor_style) = cursor_style { - if !state.clicked { - if state.hovered { - state.cursor_style_handle = Some(cx.set_cursor_style(cursor_style)); - } else { - state.cursor_style_handle = None; + Event::MouseMoved { + position, + left_mouse_down, + } => { + if !left_mouse_down { + let mouse_in = bounds.contains_point(*position); + if state.hovered != mouse_in { + state.hovered = mouse_in; + if let Some(cursor_style) = cursor_style { + if !state.clicked { + if state.hovered { + state.cursor_style_handle = + Some(cx.set_cursor_style(cursor_style)); + } else { + state.cursor_style_handle = None; + } } } + cx.notify(); + return true; } - cx.notify(); - true - } else { - handled_in_child } + handled_in_child } Event::LeftMouseDown { position, .. } => { if !handled_in_child && bounds.contains_point(*position) { diff --git a/gpui/src/platform/event.rs b/gpui/src/platform/event.rs index 15ee7172f67084595793e2a607a2930d49d3eb78..fba7b812e6c8ac87479932f9556a267581551dfe 100644 --- a/gpui/src/platform/event.rs +++ b/gpui/src/platform/event.rs @@ -24,5 +24,6 @@ pub enum Event { }, MouseMoved { position: Vector2F, + left_mouse_down: bool, }, } diff --git a/gpui/src/platform/mac/event.rs b/gpui/src/platform/mac/event.rs index d3f9d9accd8ef69dbbb92d51d7fdfd6a8dea8c6a..04712d599ffc85de2a98e9af761f6764d2a3b0c4 100644 --- a/gpui/src/platform/mac/event.rs +++ b/gpui/src/platform/mac/event.rs @@ -6,8 +6,8 @@ use cocoa::appkit::{ NSUpArrowFunctionKey as ARROW_UP_KEY, }; use cocoa::{ - appkit::{NSEvent as _, NSEventModifierFlags, NSEventType}, - base::{id, YES}, + appkit::{NSEvent, NSEventModifierFlags, NSEventType}, + base::{id, nil, YES}, foundation::NSString as _, }; use std::{ffi::CStr, os::raw::c_char}; @@ -116,6 +116,7 @@ impl Event { native_event.locationInWindow().x as f32, window_height - native_event.locationInWindow().y as f32, ), + left_mouse_down: NSEvent::pressedMouseButtons(nil) & 1 != 0, }), _ => None, } diff --git a/gpui/src/presenter.rs b/gpui/src/presenter.rs index 92f47b0399dbac2329c7440e8531add09fb9a4b8..c2c670f1e706a010f452b2e7fec6277e5497030a 100644 --- a/gpui/src/presenter.rs +++ b/gpui/src/presenter.rs @@ -145,8 +145,14 @@ impl Presenter { pub fn dispatch_event(&mut self, event: Event, cx: &mut MutableAppContext) { if let Some(root_view_id) = cx.root_view_id(self.window_id) { match event { - Event::MouseMoved { position, .. } | Event::LeftMouseDragged { position } => { - self.last_mouse_moved_event = Some(Event::MouseMoved { position }); + Event::MouseMoved { .. } => { + self.last_mouse_moved_event = Some(event.clone()); + } + Event::LeftMouseDragged { position } => { + self.last_mouse_moved_event = Some(Event::MouseMoved { + position, + left_mouse_down: true, + }); } _ => {} }