Improved macOS implementation for Cursor

- remove Wait and SizeAll cursors as they don't look nice
   (Wait is not spining and produces a broken rendering,
    SizeAll is a simple white cursor.)
 - fix memory management for NSCursor.
 - ignore selector warnings.
This commit is contained in:
Marco Antognini 2018-04-20 07:50:14 +02:00 committed by Lukas Dürrenberger
parent 9c2e7cbb51
commit 9f7d8101a9
2 changed files with 48 additions and 38 deletions

View File

@ -53,21 +53,21 @@ public:
/// Refer to the following table to determine which cursor /// Refer to the following table to determine which cursor
/// is available on which platform. /// is available on which platform.
/// ///
/// Type | Linux | Mac OS X | Windows /// Type | Linux | Mac OS X | Windows |
/// ------------------------------------|:-----:|:--------:|:--------: /// ------------------------------------|:-----:|:--------:|:--------:|
/// sf::Cursor::Arrow | yes | yes | yes /// sf::Cursor::Arrow | yes | yes | yes |
/// sf::Cursor::ArrowWait | no | no | yes /// sf::Cursor::ArrowWait | no | no | yes |
/// sf::Cursor::Wait | yes | no | yes /// sf::Cursor::Wait | yes | no | yes |
/// sf::Cursor::Text | yes | yes | yes /// sf::Cursor::Text | yes | yes | yes |
/// sf::Cursor::Hand | yes | yes | yes /// sf::Cursor::Hand | yes | yes | yes |
/// sf::Cursor::SizeHorizontal | yes | yes | yes /// sf::Cursor::SizeHorizontal | yes | yes | yes |
/// sf::Cursor::SizeVertical | yes | yes | yes /// sf::Cursor::SizeVertical | yes | yes | yes |
/// sf::Cursor::SizeTopLeftBottomRight | no | yes* | yes /// sf::Cursor::SizeTopLeftBottomRight | no | yes* | yes |
/// sf::Cursor::SizeBottomLeftTopRight | no | yes* | yes /// sf::Cursor::SizeBottomLeftTopRight | no | yes* | yes |
/// sf::Cursor::SizeAll | yes | no | yes /// sf::Cursor::SizeAll | yes | no | yes |
/// sf::Cursor::Cross | yes | yes | yes /// sf::Cursor::Cross | yes | yes | yes |
/// sf::Cursor::Help | yes | yes* | yes /// sf::Cursor::Help | yes | yes* | yes |
/// sf::Cursor::NotAllowed | yes | yes | yes /// sf::Cursor::NotAllowed | yes | yes | yes |
/// ///
/// * These cursor types are undocumented so may not /// * These cursor types are undocumented so may not
/// be available on all versions, but have been tested on 10.13 /// be available on all versions, but have been tested on 10.13

View File

@ -32,6 +32,21 @@
#import <SFML/Window/OSX/NSImage+raw.h> #import <SFML/Window/OSX/NSImage+raw.h>
#import <AppKit/AppKit.h> #import <AppKit/AppKit.h>
namespace
{
////////////////////////////////////////////////////////////
NSCursor* loadFromSelector(SEL selector)
{
// The caller is responsible for retaining the cursor.
if ([NSCursor respondsToSelector:selector])
return [NSCursor performSelector:selector];
else
return nil;
}
}
namespace sf namespace sf
{ {
namespace priv namespace priv
@ -56,6 +71,8 @@ CursorImpl::~CursorImpl()
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot) bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot)
{ {
[m_cursor release];
NSSize nssize = NSMakeSize(size.x, size.y); NSSize nssize = NSMakeSize(size.x, size.y);
NSImage* image = [NSImage imageWithRawData:pixels andSize:nssize]; NSImage* image = [NSImage imageWithRawData:pixels andSize:nssize];
NSPoint nshotspot = NSMakePoint(hotspot.x, hotspot.y); NSPoint nshotspot = NSMakePoint(hotspot.x, hotspot.y);
@ -65,20 +82,11 @@ bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hot
return m_cursor != nil; return m_cursor != nil;
} }
////////////////////////////////////////////////////////////
bool loadFromSelector(SEL selector, NSCursorRef& cursor)
{
if ([NSCursor respondsToSelector:selector])
{
cursor = [NSCursor performSelector:selector];
return true;
}
return false;
}
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool CursorImpl::loadFromSystem(Cursor::Type type) bool CursorImpl::loadFromSystem(Cursor::Type type)
{ {
[m_cursor release];
switch (type) switch (type)
{ {
default: return false; default: return false;
@ -92,24 +100,26 @@ bool CursorImpl::loadFromSystem(Cursor::Type type)
case Cursor::NotAllowed: m_cursor = [NSCursor operationNotAllowedCursor]; break; case Cursor::NotAllowed: m_cursor = [NSCursor operationNotAllowedCursor]; break;
// These cursor types are undocumented, may not be available on some platforms // These cursor types are undocumented, may not be available on some platforms
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
case Cursor::SizeBottomLeftTopRight: case Cursor::SizeBottomLeftTopRight:
return loadFromSelector(@selector(_windowResizeNorthEastSouthWestCursor), m_cursor); m_cursor = loadFromSelector(@selector(_windowResizeNorthEastSouthWestCursor));
break;
case Cursor::SizeTopLeftBottomRight: case Cursor::SizeTopLeftBottomRight:
return loadFromSelector(@selector(_windowResizeNorthWestSouthEastCursor), m_cursor); m_cursor = loadFromSelector(@selector(_windowResizeNorthWestSouthEastCursor));
case Cursor::SizeAll: break;
return loadFromSelector(@selector(_moveCursor), m_cursor);
case Cursor::Wait:
return loadFromSelector(@selector(_waitCursor), m_cursor);
case Cursor::Help: case Cursor::Help:
return loadFromSelector(@selector(_helpCursor), m_cursor); m_cursor = loadFromSelector(@selector(_helpCursor));
break;
#pragma clang diagnostic pop
} }
// Since we didn't allocate the cursor ourself, we have to retain it if (m_cursor)
// in order to not break the retain count.
[m_cursor retain]; [m_cursor retain];
// For all non-default cases, it was a success. return m_cursor != nil;
return true;
} }