Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get current type of mouse cursor in Mac OS X?

How can I get the current type of mouse cursor on screen? (Not only on my app window, globally.) Or is it at least possible to detect whether the default cursor is currently displayed? Either Carbon or Cocoa is OK – or even other working APIs, preferably the official ones.

This is what I have tried:

NSCursor *sysCursor = [NSCursor currentSystemCursor];

if (sysCursor == nil) {
    NSLog(@"nil");
}

if ([sysCursor isEqual: [NSCursor arrowCursor]] || 
    [sysCursor isEqual: [NSCursor contextualMenuCursor]] || 
    [sysCursor isEqual: [NSCursor closedHandCursor]] || 
    [sysCursor isEqual: [NSCursor crosshairCursor]] || 
    [sysCursor isEqual: [NSCursor disappearingItemCursor]] || 
    [sysCursor isEqual: [NSCursor dragCopyCursor]] || 
    [sysCursor isEqual: [NSCursor dragLinkCursor]] || 
    [sysCursor isEqual: [NSCursor IBeamCursor]] || 
    [sysCursor isEqual: [NSCursor openHandCursor]] || 
    [sysCursor isEqual: [NSCursor operationNotAllowedCursor]] || 
    [sysCursor isEqual: [NSCursor pointingHandCursor]] || 
    [sysCursor isEqual: [NSCursor resizeDownCursor]] || 
    [sysCursor isEqual: [NSCursor resizeLeftCursor]] || 
    [sysCursor isEqual: [NSCursor resizeLeftRightCursor]] || 
    [sysCursor isEqual: [NSCursor resizeRightCursor]] || 
    [sysCursor isEqual: [NSCursor resizeUpCursor]] || 
    [sysCursor isEqual: [NSCursor resizeUpDownCursor]] || 
    [sysCursor isEqual: [NSCursor IBeamCursorForVerticalLayout]]
    ) {
    NSLog(@"equal");
} else {
    NSLog(@"not");
}

The cursor is not nil, but at the same time it’s not equal to any of the others. It’s not even equal to itself:

NSLog(@"%i", [[NSCursor currentSystemCursor]
    isEqual:[NSCursor currentSystemCursor]]); // 0

Ideas? This is a LSUIElement-type app, if that matters.

like image 263
Cloudream Avatar asked Nov 04 '22 10:11

Cloudream


2 Answers

You can check the cursor type currently set using code similar to the following one:

if ([[NSCursor currentSystemCursor] isEqual: [NSCursor pointingHandCursor]]) {
  // … 
}

The other values you can use, instead of [NSCursor pointingHandCursor] are listed in Retrieving cursor instances.

like image 148
apaderno Avatar answered Nov 12 '22 15:11

apaderno


This is quite a hack, but it looks like it’s possible to tell at least some cursors apart using the hotSpot property:

NSLog(@"%@", NSStringFromPoint([[NSCursor currentSystemCursor] hotSpot]));

This returns {5, 5} for the default pointer cursor. I have no idea if this value changes for the default cursor under some circumstances (like higher DPI or whatever else). I have ended up with this category on NSCursor:

- (BOOL) isDefaultCursor
{
    NSPoint defaultCursorHotspot = [[NSCursor arrowCursor] hotSpot];
    return NSEqualPoints(defaultCursorHotspot, [self hotSpot]);
}

Other than that, there’s a _flags.cursorType instance variable, but that’s protected. And, as you already mentioned, the current system cursor does not have to be even -isEqual: with itself.

like image 39
zoul Avatar answered Nov 12 '22 14:11

zoul