141 lines
3.7 KiB
Plaintext
141 lines
3.7 KiB
Plaintext
#include <unordered_map>
|
|
|
|
#import <Cocoa/Cocoa.h>
|
|
#import "CursorHelper.h"
|
|
|
|
#define ARROW 0
|
|
#define CROSSHAIR 1
|
|
#define CLICK 2
|
|
#define IBEAM 3
|
|
#define MOVE 4
|
|
#define HAND 5
|
|
#define DRAG 6
|
|
#define DRAG_OPEN 7
|
|
#define WAIT 8
|
|
#define WAIT_ARROW 9
|
|
#define DISABLED 10
|
|
#define RESIZE_TR 11
|
|
#define RESIZE_BL 12
|
|
#define RESIZE_TL 13
|
|
#define RESIZE_BR 14
|
|
#define RESIZE_H 15
|
|
#define RESIZE_V 16
|
|
#define RESIZE_T 17
|
|
#define RESIZE_B 18
|
|
#define RESIZE_L 19
|
|
#define RESIZE_R 20
|
|
#define RESIZE_TLBR 21
|
|
#define RESIZE_TRBL 22
|
|
#define CUSTOM -1
|
|
|
|
namespace ExternalMac
|
|
{
|
|
std::unordered_map<const char *, NSCursor *> customCursorCache;
|
|
|
|
bool setCursorIcon(int icon, const char *customCursor, float customX, float customY)
|
|
{
|
|
NSCursor *cursor = nil;
|
|
|
|
switch (icon)
|
|
{
|
|
case ARROW:
|
|
cursor = [NSCursor arrowCursor];
|
|
break;
|
|
case CLICK:
|
|
cursor = [NSCursor pointingHandCursor];
|
|
break;
|
|
case CROSSHAIR:
|
|
cursor = [NSCursor crosshairCursor];
|
|
break;
|
|
case HAND:
|
|
cursor = [NSCursor closedHandCursor];
|
|
break;
|
|
case IBEAM:
|
|
cursor = [NSCursor IBeamCursor];
|
|
break;
|
|
case RESIZE_H:
|
|
cursor = [NSCursor resizeLeftRightCursor];
|
|
break;
|
|
case RESIZE_V:
|
|
cursor = [NSCursor resizeUpDownCursor];
|
|
break;
|
|
// TODO: DEFAULTS
|
|
case RESIZE_TL:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_windowResizeNorthWestCursor)defaultCursor:nil];
|
|
break;
|
|
case RESIZE_TR:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_windowResizeNorthEastCursor)defaultCursor:nil];
|
|
break;
|
|
case RESIZE_BL:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_windowResizeSouthWestCursor)defaultCursor:nil];
|
|
break;
|
|
case RESIZE_BR:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_windowResizeSouthEastCursor)defaultCursor:nil];
|
|
break;
|
|
case RESIZE_T:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_windowResizeNorthCursor)defaultCursor:nil];
|
|
break;
|
|
case RESIZE_B:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_windowResizeSouthCursor)defaultCursor:nil];
|
|
break;
|
|
case RESIZE_L:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_windowResizeWestCursor)defaultCursor:nil];
|
|
break;
|
|
case RESIZE_R:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_windowResizeEastCursor)defaultCursor:nil];
|
|
break;
|
|
case RESIZE_TLBR:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_windowResizeNorthWestSouthEastCursor)defaultCursor:nil];
|
|
break;
|
|
case RESIZE_TRBL:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_windowResizeNorthEastSouthWestCursor)defaultCursor:nil];
|
|
break;
|
|
case WAIT:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_waitCursor)defaultCursor:nil];
|
|
break;
|
|
case WAIT_ARROW:
|
|
cursor = [CursorHelper getCursorForSelector:@selector(_waitCursor)defaultCursor:nil];
|
|
break;
|
|
case DISABLED:
|
|
cursor = [NSCursor operationNotAllowedCursor];
|
|
break;
|
|
case DRAG:
|
|
cursor = [NSCursor closedHandCursor];
|
|
break;
|
|
case DRAG_OPEN:
|
|
cursor = [NSCursor openHandCursor];
|
|
break;
|
|
case CUSTOM:
|
|
if (customCursorCache.find(customCursor) != customCursorCache.end())
|
|
cursor = customCursorCache[customCursor];
|
|
else
|
|
{
|
|
NSString *cursorImageName = [NSString stringWithUTF8String:customCursor];
|
|
NSImage *tmpImage = [[NSImage alloc] initWithContentsOfFile:cursorImageName];
|
|
|
|
if (tmpImage != nil)
|
|
{
|
|
cursor = [[NSCursor alloc] initWithImage:tmpImage hotSpot:NSMakePoint(customX, customY)];
|
|
customCursorCache[customCursor] = cursor;
|
|
[tmpImage release];
|
|
}
|
|
else
|
|
NSLog(@"Failed to load image %@", cursorImageName);
|
|
|
|
[cursorImageName release];
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
if (cursor != nil)
|
|
{
|
|
[cursor set];
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|