ck_
ck_

Reputation: 3829

Using `CGEventSourceSetLocalEventsSuppressionInterval` instead of the deprecated `CGSetLocalEventsSuppressionInterval`

When programmatically moving the mouse cursor, you must set CGSetLocalEventsSuppressionInterval to 0 so the events come in in real-time as opposed to with a 250 millisecond delay.

Unfortunately, CGSetLocalEventsSuppressionInterval is marked as deprecated in Snow Leopard.

The alternative is CGEventSourceSetLocalEventsSuppressionInterval(CGEventSourceRef source, CFTimeInterval seconds); https://developer.apple.com/library/mac/#documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventSourceSetLocalEventsSuppressionInterval

-(void) mouseMovement:(CGEventRef) newUserMouseMovement
{
    //Move cursor to new position
    CGSetLocalEventsSuppressionInterval(0.0); //Deprecated in OS X 10.6
    CGWarpMouseCursorPosition(NSPointToCGPoint(newMousePosition));
    CGSetLocalEventsSuppressionInterval(0.25); //Deprecated in OS X 10.6

    //--OR--//

    CGEventSourceRef source = ???;
    CGEventSourceSetLocalEventsSuppressionInterval(source, 0.0);
    CGWarpMouseCursorPosition(NSPointToCGPoint(newMousePosition));
    CGEventSourceSetLocalEventsSuppressionInterval(source, 0.25);
}

I can't get the latter method to work.

So I guess my question is how do I get the CGEventSourceRef required for that function?

Is it the event source for the user's normal mouse movement? Or for my manual warping of the cursor?

Upvotes: 4

Views: 1212

Answers (3)

keith
keith

Reputation: 5342

I ran into the same problem of wanting an alternative to the deprecated CGSetLocalEventsSuppressionInterval to use in conjunction with CGWarpMouseCursorPosition and this worked in C++:

CGEventSourceRef source = CGEventSourceCreate(CGEventSourceStateID::kCGEventSourceStateCombinedSessionState);
CGEventSourceSetLocalEventsSuppressionInterval(source, 0);
CGWarpMouseCursorPosition(CGPointMake(x, y));
CFRelease(source);

Upvotes: 0

Krystian Gałaj
Krystian Gałaj

Reputation: 227

Event sources don't seem to be explained anywhere, and no one knows how to use them.

CGPoint warpPoint = CGPointMake(42, 42);
CGWarpMouseCursorPosition(warpPoint);
CGAssociateMouseAndMouseCursorPosition(true);

Call CGAssociateMouseAndMouseCursorPosition( true ) immediately after a warp call to make the Quartz events system drop the delay for this specific warp.

Upvotes: 5

AndyTang
AndyTang

Reputation: 557

Did you ever solve this problem?

Have you tried using CGEventCreateSourceFromEvent(...) to create your CGEventSourceRef from a CGEventRef?

Upvotes: 3

Related Questions