@@ -12,7 +12,7 @@ use core_graphics::display::CGDisplay;
12
12
use objc:: runtime:: { BOOL , Class , Object , Sel , YES } ;
13
13
14
14
pub use util:: * ;
15
- use dpi:: LogicalSize ;
15
+ use { dpi:: LogicalSize , window :: MouseCursor } ;
16
16
use platform_impl:: platform:: { dispatch:: * , ffi, window:: SharedState } ;
17
17
18
18
pub const EMPTY_RANGE : ffi:: NSRange = ffi:: NSRange {
@@ -402,6 +402,87 @@ pub unsafe fn create_input_context(view: id) -> IdRef {
402
402
IdRef :: new ( input_context)
403
403
}
404
404
405
+ pub enum CursorType {
406
+ Native ( & ' static str ) ,
407
+ Undocumented ( & ' static str ) ,
408
+ WebKit ( & ' static str ) ,
409
+ }
410
+
411
+ impl From < MouseCursor > for CursorType {
412
+ fn from ( cursor : MouseCursor ) -> Self {
413
+ match cursor {
414
+ MouseCursor :: Arrow | MouseCursor :: Default => CursorType :: Native ( "arrowCursor" ) ,
415
+ MouseCursor :: Hand => CursorType :: Native ( "pointingHandCursor" ) ,
416
+ MouseCursor :: Grabbing | MouseCursor :: Grab => CursorType :: Native ( "closedHandCursor" ) ,
417
+ MouseCursor :: Text => CursorType :: Native ( "IBeamCursor" ) ,
418
+ MouseCursor :: VerticalText => CursorType :: Native ( "IBeamCursorForVerticalLayout" ) ,
419
+ MouseCursor :: Copy => CursorType :: Native ( "dragCopyCursor" ) ,
420
+ MouseCursor :: Alias => CursorType :: Native ( "dragLinkCursor" ) ,
421
+ MouseCursor :: NotAllowed | MouseCursor :: NoDrop => CursorType :: Native ( "operationNotAllowedCursor" ) ,
422
+ MouseCursor :: ContextMenu => CursorType :: Native ( "contextualMenuCursor" ) ,
423
+ MouseCursor :: Crosshair => CursorType :: Native ( "crosshairCursor" ) ,
424
+ MouseCursor :: EResize => CursorType :: Native ( "resizeRightCursor" ) ,
425
+ MouseCursor :: NResize => CursorType :: Native ( "resizeUpCursor" ) ,
426
+ MouseCursor :: WResize => CursorType :: Native ( "resizeLeftCursor" ) ,
427
+ MouseCursor :: SResize => CursorType :: Native ( "resizeDownCursor" ) ,
428
+ MouseCursor :: EwResize | MouseCursor :: ColResize => CursorType :: Native ( "resizeLeftRightCursor" ) ,
429
+ MouseCursor :: NsResize | MouseCursor :: RowResize => CursorType :: Native ( "resizeUpDownCursor" ) ,
430
+
431
+ // Undocumented cursors: https://stackoverflow.com/a/46635398/5435443
432
+ MouseCursor :: Help => CursorType :: Undocumented ( "_helpCursor" ) ,
433
+ MouseCursor :: ZoomIn => CursorType :: Undocumented ( "_zoomInCursor" ) ,
434
+ MouseCursor :: ZoomOut => CursorType :: Undocumented ( "_zoomOutCursor" ) ,
435
+ MouseCursor :: NeResize => CursorType :: Undocumented ( "_windowResizeNorthEastCursor" ) ,
436
+ MouseCursor :: NwResize => CursorType :: Undocumented ( "_windowResizeNorthWestCursor" ) ,
437
+ MouseCursor :: SeResize => CursorType :: Undocumented ( "_windowResizeSouthEastCursor" ) ,
438
+ MouseCursor :: SwResize => CursorType :: Undocumented ( "_windowResizeSouthWestCursor" ) ,
439
+ MouseCursor :: NeswResize => CursorType :: Undocumented ( "_windowResizeNorthEastSouthWestCursor" ) ,
440
+ MouseCursor :: NwseResize => CursorType :: Undocumented ( "_windowResizeNorthWestSouthEastCursor" ) ,
441
+
442
+ // While these are available, the former just loads a white arrow,
443
+ // and the latter loads an ugly deflated beachball!
444
+ // MouseCursor::Move => CursorType::Undocumented("_moveCursor"),
445
+ // MouseCursor::Wait => CursorType::Undocumented("_waitCursor"),
446
+
447
+ // An even more undocumented cursor...
448
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=522349
449
+ // This is the wrong semantics for `Wait`, but it's the same as
450
+ // what's used in Safari and Chrome.
451
+ MouseCursor :: Wait | MouseCursor :: Progress => CursorType :: Undocumented ( "busyButClickableCursor" ) ,
452
+
453
+ // For the rest, we can just snatch the cursors from WebKit...
454
+ // They fit the style of the native cursors, and will seem
455
+ // completely standard to macOS users.
456
+ // https://stackoverflow.com/a/21786835/5435443
457
+ MouseCursor :: Move | MouseCursor :: AllScroll => CursorType :: WebKit ( "move" ) ,
458
+ MouseCursor :: Cell => CursorType :: WebKit ( "cell" ) ,
459
+ }
460
+ }
461
+ }
462
+
463
+ impl CursorType {
464
+ pub unsafe fn load ( self ) -> id {
465
+ match self {
466
+ CursorType :: Native ( cursor_name) => {
467
+ let sel = Sel :: register ( cursor_name) ;
468
+ msg_send ! [ class!( NSCursor ) , performSelector: sel]
469
+ } ,
470
+ CursorType :: Undocumented ( cursor_name) => {
471
+ let class = class ! ( NSCursor ) ;
472
+ let sel = Sel :: register ( cursor_name) ;
473
+ let sel = if msg_send ! [ class, respondsToSelector: sel] {
474
+ sel
475
+ } else {
476
+ warn ! ( "Cursor `{}` appears to be invalid" , cursor_name) ;
477
+ sel ! ( arrowCursor)
478
+ } ;
479
+ msg_send ! [ class, performSelector: sel]
480
+ } ,
481
+ CursorType :: WebKit ( cursor_name) => load_webkit_cursor ( cursor_name) ,
482
+ }
483
+ }
484
+ }
485
+
405
486
// Note that loading `busybutclickable` with this code won't animate the frames;
406
487
// instead you'll just get them all in a column.
407
488
pub unsafe fn load_webkit_cursor ( cursor_name : & str ) -> id {
0 commit comments