From 93768f36f1bfe4578bf5d1280270c6df412d7fe0 Mon Sep 17 00:00:00 2001 From: cxl Date: Sat, 28 Jul 2018 12:57:24 +0000 Subject: [PATCH] CtrlCore: Undocumented Cocoa cursors git-svn-id: svn://ultimatepp.org/upp/trunk@12110 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/CtrlCore/CocoApp.mm | 2 +- uppsrc/CtrlCore/CocoCreate.mm | 5 +-- uppsrc/CtrlCore/CocoImage.mm | 62 +++++++++++++++++++++++++---------- uppsrc/CtrlLib/MenuBar.cpp | 2 +- 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/uppsrc/CtrlCore/CocoApp.mm b/uppsrc/CtrlCore/CocoApp.mm index 5e686e7a8..cce95d3be 100644 --- a/uppsrc/CtrlCore/CocoApp.mm +++ b/uppsrc/CtrlCore/CocoApp.mm @@ -217,7 +217,7 @@ Upp::Rect Upp::Ctrl::GetPrimaryWorkArea() for (NSScreen *screen in [NSScreen screens]) { Rect f = MakeRect([screen frame]); Rect v = MakeRect([screen visibleFrame], f.GetHeight()); -// double scale = [screen backingScaleFactor]; +// double scale = [screen backingScaleFactor]; // TODO DPI return v; } return Rect(0, 0, 1024, 768); diff --git a/uppsrc/CtrlCore/CocoCreate.mm b/uppsrc/CtrlCore/CocoCreate.mm index 4e95469e8..72cc193ad 100644 --- a/uppsrc/CtrlCore/CocoCreate.mm +++ b/uppsrc/CtrlCore/CocoCreate.mm @@ -116,11 +116,11 @@ void Upp::Ctrl::WndDestroy() delete top->coco; delete top; top = NULL; - isopen = false; + popup = isopen = false; int ii = FindIndex(mmtopctrl, this); if(ii >= 0) mmtopctrl.Remove(ii); - if(owner) + if(owner && owner->IsOpen()) owner->SetWndFocus(); } @@ -157,6 +157,7 @@ bool Upp::Ctrl::IsWndOpen() const { void Upp::Ctrl::PopUp(Ctrl *owner, bool savebits, bool activate, bool dropshadow, bool topmost) { Create(owner, NSWindowStyleMaskBorderless, false); + popup = true; } Upp::dword Upp::TopWindow::GetMMStyle() const diff --git a/uppsrc/CtrlCore/CocoImage.mm b/uppsrc/CtrlCore/CocoImage.mm index e01164fd9..9e1556839 100644 --- a/uppsrc/CtrlCore/CocoImage.mm +++ b/uppsrc/CtrlCore/CocoImage.mm @@ -108,34 +108,60 @@ Image Image::Cross() FCURSOR_(MM_Cross) Image Image::Hand() FCURSOR_(MM_Hand) // TODO: Missing kinds (sizers mostly) +// https://stackoverflow.com/questions/10733228/native-osx-lion-resize-cursor-for-custom-nswindow-or-nsview/21786835#21786835 + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wundeclared-selector" + +#define XCURSOR(id) \ + if([NSCursor respondsToSelector:@selector(id)]) return [NSCursor performSelector:@selector(id)]; NSCursor *GetNSCursor(int kind) { switch(kind) { + case MM_SizeAll: + XCURSOR(_moveCursor); + break; + case MM_SizeHorz: + XCURSOR(_windowResizeEastWestCursor); + break; + case MM_SizeVert: + XCURSOR(_windowResizeNorthSouthCursor); + break; + case MM_SizeTopLeft: + XCURSOR(_windowResizeNorthWestCursor); + break; + case MM_SizeTop: + XCURSOR(_windowResizeNorthCursor); + break; + case MM_SizeTopRight: + XCURSOR(_windowResizeNorthEastCursor); + break; + case MM_SizeLeft: + XCURSOR(_windowResizeWestCursor); + break; + case MM_SizeRight: + XCURSOR(_windowResizeEastCursor); + break; + case MM_SizeBottomLeft: + XCURSOR(_windowResizeSouthWestCursor); + break; + case MM_SizeBottom: + XCURSOR(_windowResizeSouthCursor); + break; + case MM_SizeBottomRight: + XCURSOR(_windowResizeSouthEastCursor); + break; case MM_IBeam: return [NSCursor IBeamCursor]; case MM_Cross: return [NSCursor crosshairCursor]; - // case MM_: return [NSCursor closedHandCursor]; - // case MM_Hand: return [NSCursor openHandCursor]; - case MM_Hand: return [NSCursor pointingHandCursor]; - // case MM_: return [NSCursor resizeLeftCursor]; - // case MM_: return [NSCursor resizeRightCursor]; - case MM_SizeRight: - case MM_SizeLeft: return [NSCursor resizeLeftRightCursor]; - // case MM_: return [NSCursor resizeUpCursor]; - // case MM_: return [NSCursor resizeDownCursor]; - case MM_SizeTop: - case MM_SizeBottom: - return [NSCursor resizeUpDownCursor]; - // case MM_: return [NSCursor IBeamCursorForVerticalLayout];. - case MM_No: - return [NSCursor operationNotAllowedCursor]; - // case MM_: return [NSCursor dragLinkCursor];. - // case MM_: return [NSCursor dragCopyCursor];. - // case MM_: return [NSCursor contextualMenuCursor]; + case MM_Hand: return [NSCursor pointingHandCursor]; + case MM_No: return [NSCursor operationNotAllowedCursor]; } return [NSCursor arrowCursor]; } +#pragma clang diagnostic pop + void Ctrl::SetMouseCursor(const Image& img) { int64 h = img.GetAuxData(); diff --git a/uppsrc/CtrlLib/MenuBar.cpp b/uppsrc/CtrlLib/MenuBar.cpp index fd5540b8b..d75e0b214 100644 --- a/uppsrc/CtrlLib/MenuBar.cpp +++ b/uppsrc/CtrlLib/MenuBar.cpp @@ -530,7 +530,7 @@ void MenuBar::PopUp(Ctrl *owner, Point p, Size rsz) if(p.y + sz.cy > r.bottom) { if(p.y - r.top > r.bottom - p.y) { int y0; - if (parentmenu && parentmenu->GetActiveSubmenu() && parentmenu->submenuitem) + if (parentmenu && parentmenu->GetActiveSubmenu() && parentmenu->submenuitem) y0 = parentmenu->submenuitem->GetScreenRect().BottomRight().y + 2 + rsz.cy; else y0 = p.y + rsz.cy;