From e9e00994cf79350a11be4032e084462b7f35fb60 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Mon, 21 Feb 2022 16:09:34 +0200 Subject: [PATCH] app: [macos] add missing cursors Signed-off-by: Egon Elbre --- app/os_darwin.go | 17 ++++++++++++++++ app/os_macos.m | 51 +++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/app/os_darwin.go b/app/os_darwin.go index 1614cad6..039194a9 100644 --- a/app/os_darwin.go +++ b/app/os_darwin.go @@ -237,6 +237,23 @@ func windowSetCursor(from, to pointer.CursorName) pointer.CursorName { curID = 6 case pointer.CursorGrab: curID = 7 + case pointer.CursorTopLeftResize: + curID = 8 + case pointer.CursorTopRightResize: + curID = 9 + case pointer.CursorBottomLeftResize: + curID = 10 + case pointer.CursorBottomRightResize: + curID = 11 + case pointer.CursorLeftResize: + curID = 12 + case pointer.CursorRightResize: + curID = 13 + case pointer.CursorTopResize: + curID = 14 + case pointer.CursorBottomResize: + curID = 15 + case pointer.CursorNone: C.gio_hideCursor() return to diff --git a/app/os_macos.m b/app/os_macos.m index 99624085..4ebe250c 100644 --- a/app/os_macos.m +++ b/app/os_macos.m @@ -232,30 +232,67 @@ void gio_showCursor() { } } +// some cursors are not public, this tries to use a private cursor +// and uses fallback when the use of private cursor fails. +void gio_trySetPrivateCursor(SEL cursorName, NSCursor* fallback) { + if ([NSCursor respondsToSelector:cursorName]) { + id object = [NSCursor performSelector:cursorName]; + if ([object isKindOfClass:[NSCursor class]]) { + [(NSCursor*)object set]; + return; + } + } + [fallback set]; +} + void gio_setCursor(NSUInteger curID) { @autoreleasepool { switch (curID) { - case 1: + case 1: // pointer.CursorDefault [NSCursor.arrowCursor set]; break; - case 2: + case 2: // pointer.CursorText [NSCursor.IBeamCursor set]; break; - case 3: + case 3: // pointer.CursorPointer [NSCursor.pointingHandCursor set]; break; - case 4: + case 4: // pointer.CursorCrossHair [NSCursor.crosshairCursor set]; break; - case 5: + case 5: // pointer.CursorColResize [NSCursor.resizeLeftRightCursor set]; break; - case 6: + case 6: // pointer.CursorRowResize [NSCursor.resizeUpDownCursor set]; break; - case 7: + case 7: // pointer.CursorGrab [NSCursor.openHandCursor set]; break; + case 8: // pointer.CursorTopLeftResize + gio_trySetPrivateCursor(@selector(_windowResizeNorthWestCursor), NSCursor.resizeUpDownCursor); + break; + case 9: // pointer.CursorTopRightResize + gio_trySetPrivateCursor(@selector(_windowResizeNorthEastCursor), NSCursor.resizeUpDownCursor); + break; + case 10: // pointer.CursorBottomLeftResize + gio_trySetPrivateCursor(@selector(_windowResizeSouthWestCursor), NSCursor.resizeUpDownCursor); + break; + case 11: // pointer.CursorBottomRightResize + gio_trySetPrivateCursor(@selector(_windowResizeSouthEastCursor), NSCursor.resizeUpDownCursor); + break; + case 12: // pointer.CursorLeftResize + [NSCursor.resizeLeftCursor set]; + break; + case 13: // pointer.CursorRightResize + [NSCursor.resizeRightCursor set]; + break; + case 14: // pointer.CursorTopResize + [NSCursor.resizeUpCursor set]; + break; + case 15: // pointer.CursorBottomResize + [NSCursor.resizeDownCursor set]; + break; default: [NSCursor.arrowCursor set]; break;