Impl SkiaWindow::setNativeMouseCursor() on Skia/OSX

This commit is contained in:
David Capello 2015-10-14 12:30:48 -03:00
parent d7d0eeec7f
commit ee7df1f973
5 changed files with 105 additions and 0 deletions

View File

@ -13,6 +13,8 @@
@interface OSXView : NSView {
@private
NSTrackingArea* m_trackingArea;
NSCursor* m_nsCursor;
bool m_visibleMouse;
}
- (id)initWithFrame:(NSRect)frameRect;
- (BOOL)acceptsFirstResponder;
@ -39,9 +41,12 @@
- (void)handleMouseUp:(NSEvent*)event;
- (void)handleMouseDragged:(NSEvent*)event;
- (void)scrollWheel:(NSEvent*)event;
- (void)cursorUpdate:(NSEvent*)event;
- (void)setCursor:(NSCursor*)cursor;
- (void)setFrameSize:(NSSize)newSize;
- (void)createMouseTrackingArea;
- (void)destroyMouseTrackingArea;
- (void)updateCurrentCursor;
@end
#endif

View File

@ -50,6 +50,9 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
- (id)initWithFrame:(NSRect)frameRect
{
m_nsCursor = [NSCursor arrowCursor];
m_visibleMouse = true;
self = [super initWithFrame:frameRect];
if (self != nil) {
[self createMouseTrackingArea];
@ -174,6 +177,8 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
- (void)mouseEntered:(NSEvent*)event
{
[self updateCurrentCursor];
Event ev;
ev.setType(Event::MouseEnter);
ev.setPosition(get_local_mouse_pos(self, event));
@ -190,6 +195,13 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
- (void)mouseExited:(NSEvent*)event
{
// Restore arrow cursor
if (!m_visibleMouse) {
m_visibleMouse = true;
[NSCursor unhide];
}
[[NSCursor arrowCursor] set];
Event ev;
ev.setType(Event::MouseLeave);
ev.setPosition(get_local_mouse_pos(self, event));
@ -309,6 +321,17 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
queue_event(ev);
}
- (void)cursorUpdate:(NSEvent*)event
{
[self updateCurrentCursor];
}
- (void)setCursor:(NSCursor*)cursor
{
m_nsCursor = cursor;
[self updateCurrentCursor];
}
- (void)createMouseTrackingArea
{
// Create a tracking area to receive mouseMoved events
@ -330,4 +353,19 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
m_trackingArea = nil;
}
- (void)updateCurrentCursor
{
if (m_nsCursor) {
if (!m_visibleMouse) {
m_visibleMouse = true;
[NSCursor unhide];
}
[m_nsCursor set];
}
else if (m_visibleMouse) {
m_visibleMouse = false;
[NSCursor hide];
}
}
@end

View File

@ -14,6 +14,7 @@
#include "gfx/rect.h"
#include "gfx/size.h"
#include "she/keys.h"
#include "she/native_cursor.h"
namespace she {
KeyScancode cocoavk_to_scancode(UInt16 vk);
@ -46,6 +47,7 @@ public:
- (gfx::Size)clientSize;
- (gfx::Size)restoredSize;
- (void)setMousePosition:(const gfx::Point&)position;
- (void)setNativeMouseCursor:(she::NativeCursor)cursor;
@end
#endif

View File

@ -15,6 +15,8 @@
#include "she/osx/view.h"
#include "she/osx/window_delegate.h"
using namespace she;
@implementation OSXWindow
- (OSXWindow*)initWithImpl:(OSXWindowImpl*)impl
@ -96,4 +98,56 @@
CFRelease(event);
}
- (void)setNativeMouseCursor:(NativeCursor)cursor
{
NSCursor* nsCursor = nil;
switch (cursor) {
case kArrowCursor:
case kWaitCursor:
case kHelpCursor:
case kSizeNECursor:
case kSizeNWCursor:
case kSizeSECursor:
case kSizeSWCursor:
nsCursor = [NSCursor arrowCursor];
break;
case kIBeamCursor:
nsCursor = [NSCursor IBeamCursor];
break;
case kLinkCursor:
nsCursor = [NSCursor pointingHandCursor];
break;
case kForbiddenCursor:
nsCursor = [NSCursor operationNotAllowedCursor];
break;
case kMoveCursor:
nsCursor = [NSCursor openHandCursor];
break;
case kSizeNSCursor:
nsCursor = [NSCursor resizeUpDownCursor];
break;
case kSizeWECursor:
nsCursor = [NSCursor resizeLeftRightCursor];
break;
case kSizeNCursor:
nsCursor = [NSCursor resizeUpCursor];
break;
case kSizeECursor:
nsCursor = [NSCursor resizeRightCursor];
break;
case kSizeSCursor:
nsCursor = [NSCursor resizeDownCursor];
break;
case kSizeWCursor:
nsCursor = [NSCursor resizeLeftCursor];
break;
default:
nsCursor = nil;
break;
}
[self.contentView setCursor:nsCursor];
}
@end

View File

@ -91,6 +91,10 @@ public:
[m_window setMousePosition:position];
}
void setNativeMouseCursor(NativeCursor cursor) {
[m_window setNativeMouseCursor:cursor];
}
void updateWindow(const gfx::Rect& bounds) {
int scale = this->scale();
NSView* view = m_window.contentView;
@ -361,6 +365,8 @@ void SkiaWindow::setMousePosition(const gfx::Point& position)
void SkiaWindow::setNativeMouseCursor(NativeCursor cursor)
{
if (m_impl)
m_impl->setNativeMouseCursor(cursor);
}
void SkiaWindow::updateWindow(const gfx::Rect& bounds)