|
@@ -142,15 +142,12 @@ Cocoa_MouseTapThread(void *data)
|
|
|
{
|
|
|
SDL_MouseEventTapData *tapdata = (SDL_MouseEventTapData*)data;
|
|
|
|
|
|
- /* Create a tap. */
|
|
|
- CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap,
|
|
|
- kCGEventTapOptionDefault, allGrabbedEventsMask,
|
|
|
- &Cocoa_MouseTapCallback, tapdata);
|
|
|
+ /* Tap was created on main thread but we own it now. */
|
|
|
+ CFMachPortRef eventTap = tapdata->tap;
|
|
|
if (eventTap) {
|
|
|
/* Try to create a runloop source we can schedule. */
|
|
|
CFRunLoopSourceRef runloopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
|
|
|
if (runloopSource) {
|
|
|
- tapdata->tap = eventTap;
|
|
|
tapdata->runloopSource = runloopSource;
|
|
|
} else {
|
|
|
CFRelease(eventTap);
|
|
@@ -202,15 +199,30 @@ Cocoa_InitMouseEventTap(SDL_MouseData* driverdata)
|
|
|
|
|
|
tapdata->runloopStartedSemaphore = SDL_CreateSemaphore(0);
|
|
|
if (tapdata->runloopStartedSemaphore) {
|
|
|
- tapdata->thread = SDL_CreateThreadInternal(&Cocoa_MouseTapThread, "Event Tap Loop", 512 * 1024, tapdata);
|
|
|
- if (!tapdata->thread) {
|
|
|
- SDL_DestroySemaphore(tapdata->runloopStartedSemaphore);
|
|
|
+ tapdata->tap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap,
|
|
|
+ kCGEventTapOptionDefault, allGrabbedEventsMask,
|
|
|
+ &Cocoa_MouseTapCallback, tapdata);
|
|
|
+ if (tapdata->tap) {
|
|
|
+ tapdata->thread = SDL_CreateThreadInternal(&Cocoa_MouseTapThread, "Event Tap Loop", 512 * 1024, tapdata);
|
|
|
+ if (tapdata->thread) {
|
|
|
+ /* Success - early out. Ownership transferred to thread. */
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ CFRelease(tapdata->tap);
|
|
|
}
|
|
|
+ SDL_DestroySemaphore(tapdata->runloopStartedSemaphore);
|
|
|
}
|
|
|
+ SDL_free(driverdata->tapdata);
|
|
|
+ driverdata->tapdata = NULL;
|
|
|
+}
|
|
|
|
|
|
- if (!tapdata->thread) {
|
|
|
- SDL_free(driverdata->tapdata);
|
|
|
- driverdata->tapdata = NULL;
|
|
|
+void
|
|
|
+Cocoa_EnableMouseEventTap(SDL_MouseData *driverdata, SDL_bool enabled)
|
|
|
+{
|
|
|
+ SDL_MouseEventTapData *tapdata = (SDL_MouseEventTapData*)driverdata->tapdata;
|
|
|
+ if (tapdata && tapdata->tap)
|
|
|
+ {
|
|
|
+ CGEventTapEnable(tapdata->tap, enabled);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -245,6 +257,11 @@ Cocoa_InitMouseEventTap(SDL_MouseData *unused)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+void
|
|
|
+Cocoa_EnableMouseEventTap(SDL_MouseData *driverdata, SDL_bool enabled)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
void
|
|
|
Cocoa_QuitMouseEventTap(SDL_MouseData *driverdata)
|
|
|
{
|