diff --git a/.changes/cursor.md b/.changes/cursor.md new file mode 100644 index 00000000..7d2d78c1 --- /dev/null +++ b/.changes/cursor.md @@ -0,0 +1,6 @@ +--- +"tao": patch +--- + +On macOS, Fix `cursor_position` return incorrect position. + diff --git a/src/platform_impl/macos/util/mod.rs b/src/platform_impl/macos/util/mod.rs index e989045e..4c16610b 100644 --- a/src/platform_impl/macos/util/mod.rs +++ b/src/platform_impl/macos/util/mod.rs @@ -17,7 +17,11 @@ use cocoa::{ base::{id, nil}, foundation::{NSAutoreleasePool, NSPoint, NSRect, NSString, NSUInteger}, }; -use core_graphics::display::CGDisplay; +use core_graphics::{ + display::CGDisplay, + event::CGEvent, + event_source::{CGEventSource, CGEventSourceStateID}, +}; use objc::runtime::{Class, Object, Sel, BOOL, YES}; use crate::{ @@ -124,11 +128,17 @@ pub fn window_position(position: LogicalPosition) -> NSPoint { ) } +// FIXME: This is actually logical position. pub fn cursor_position() -> Result, ExternalError> { - unsafe { - let pt: NSPoint = msg_send![class!(NSEvent), mouseLocation]; - Ok((pt.x, pt.y).into()) + if let Ok(s) = CGEventSource::new(CGEventSourceStateID::CombinedSessionState) { + if let Ok(e) = CGEvent::new(s) { + let pt = e.location(); + let pos = PhysicalPosition::new(pt.x, pt.y); + return Ok(pos); + } } + + return Err(ExternalError::Os(os_error!(super::OsError::CGError(0)))); } pub unsafe fn ns_string_id_ref(s: &str) -> IdRef {