WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 5d3abab

Browse files
committed
Add set_mouse_cursor for MacOS
Based on: RustAudio#128
1 parent 3724a00 commit 5d3abab

File tree

3 files changed

+89
-2
lines changed

3 files changed

+89
-2
lines changed

src/macos/cursor.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
use cocoa::base::id;
2+
use objc::{runtime::Sel, msg_send, sel, sel_impl, class};
3+
4+
use crate::MouseCursor;
5+
6+
#[derive(Debug)]
7+
pub enum Cursor {
8+
Native(&'static str),
9+
Undocumented(&'static str),
10+
}
11+
12+
impl From<MouseCursor> for Cursor {
13+
fn from(cursor: MouseCursor) -> Self {
14+
match cursor {
15+
MouseCursor::Default => Cursor::Native("arrowCursor"),
16+
MouseCursor::Hand => Cursor::Native("pointingHandCursor"),
17+
MouseCursor::HandGrabbing => Cursor::Native("closedHandCursor"),
18+
MouseCursor::Text => Cursor::Native("IBeamCursor"),
19+
MouseCursor::VerticalText => Cursor::Native("IBeamCursorForVerticalLayout"),
20+
MouseCursor::Copy => Cursor::Native("dragCopyCursor"),
21+
MouseCursor::Alias => Cursor::Native("dragLinkCursor"),
22+
MouseCursor::NotAllowed | MouseCursor::PtrNotAllowed => {
23+
Cursor::Native("operationNotAllowedCursor")
24+
}
25+
// MouseCursor:: => Cursor::Native("contextualMenuCursor"),
26+
MouseCursor::Crosshair => Cursor::Native("crosshairCursor"),
27+
MouseCursor::EResize => Cursor::Native("resizeRightCursor"),
28+
MouseCursor::NResize => Cursor::Native("resizeUpCursor"),
29+
MouseCursor::WResize => Cursor::Native("resizeLeftCursor"),
30+
MouseCursor::SResize => Cursor::Native("resizeDownCursor"),
31+
MouseCursor::EwResize | MouseCursor::ColResize => Cursor::Native("resizeLeftRightCursor"),
32+
MouseCursor::NsResize | MouseCursor::RowResize => Cursor::Native("resizeUpDownCursor"),
33+
34+
MouseCursor::Help => Cursor::Undocumented("_helpCursor"),
35+
MouseCursor::ZoomIn => Cursor::Undocumented("_zoomInCursor"),
36+
MouseCursor::ZoomOut => Cursor::Undocumented("_zoomOutCursor"),
37+
MouseCursor::NeResize => Cursor::Undocumented("_windowResizeNorthEastCursor"),
38+
MouseCursor::NwResize => Cursor::Undocumented("_windowResizeNorthWestCursor"),
39+
MouseCursor::SeResize => Cursor::Undocumented("_windowResizeSouthEastCursor"),
40+
MouseCursor::SwResize => Cursor::Undocumented("_windowResizeSouthWestCursor"),
41+
MouseCursor::NeswResize => Cursor::Undocumented("_windowResizeNorthEastSouthWestCursor"),
42+
MouseCursor::NwseResize => Cursor::Undocumented("_windowResizeNorthWestSouthEastCursor"),
43+
44+
MouseCursor::Working | MouseCursor::PtrWorking => {
45+
Cursor::Undocumented("busyButClickableCursor")
46+
}
47+
48+
_ => Cursor::Native("arrowCursor"),
49+
50+
// MouseCursor::Hidden => todo!(),
51+
// MouseCursor::Move => todo!(),
52+
// MouseCursor::AllScroll => todo!(),
53+
// MouseCursor::Cell => todo!(),
54+
}
55+
}
56+
}
57+
58+
impl Cursor {
59+
pub unsafe fn load(&self) -> id {
60+
match self {
61+
Cursor::Native(cursor_name) => {
62+
let sel = Sel::register(cursor_name);
63+
msg_send![class!(NSCursor), performSelector: sel]
64+
}
65+
Cursor::Undocumented(cursor_name) => {
66+
let class = class!(NSCursor);
67+
let sel = Sel::register(cursor_name);
68+
let sel = if msg_send![class, respondsToSelector: sel] {
69+
sel
70+
} else {
71+
sel!(arrowCursor)
72+
};
73+
msg_send![class, performSelector: sel]
74+
}
75+
}
76+
}
77+
}

src/macos/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Eventually we should migrate to the objc2 crate and remove this.
33
#![allow(unexpected_cfgs)]
44

5+
mod cursor;
56
mod keyboard;
67
mod view;
78
mod window;

src/macos/window.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use crate::{
2626
WindowScalePolicy,
2727
};
2828

29+
use super::cursor::Cursor;
2930
use super::keyboard::KeyboardState;
3031
use super::view::{create_view, BASEVIEW_STATE_IVAR};
3132

@@ -334,8 +335,16 @@ impl<'a> Window<'a> {
334335
}
335336
}
336337

337-
pub fn set_mouse_cursor(&mut self, _mouse_cursor: MouseCursor) {
338-
todo!()
338+
pub fn set_mouse_cursor(&mut self, mouse_cursor: MouseCursor) {
339+
let native_cursor = Cursor::from(mouse_cursor);
340+
unsafe {
341+
let bounds: NSRect = msg_send![self.inner.ns_view as id, bounds];
342+
let cursor = native_cursor.load();
343+
let _: () = msg_send![self.inner.ns_view as id,
344+
addCursorRect:bounds
345+
cursor:cursor
346+
];
347+
}
339348
}
340349

341350
#[cfg(feature = "opengl")]

0 commit comments

Comments
 (0)