Fixed bug 3107 OSX - Process events in SDLApplication to fix integration with CEF. John Wordsworth While attempting to integrate CEF (Browser) into an SDL application, we noticed that there were problems on OS X where approximately 50% of the input events were essentially being lost - even when we were using off-screen rendering in CEF and passing through input events manually. It appears that this problem has been around for a while (see: http://www.magpcss.org/ceforum/viewtopic.php?f=6&t=11141). Please consider the following patch that fixes this issue. Instead of processing events directly after calling [NSApp nextEventMatchingMask:...] we now pass these events down to NSApp, for processing by an overloaded sendEvent: method. Chromium also forwards events to NSApp in the same way, which means we don't miss events, even if they were originally dequeued by CEF.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
diff --git a/src/video/cocoa/SDL_cocoaevents.m b/src/video/cocoa/SDL_cocoaevents.m
index a6c9745..1e78602 100644
--- a/src/video/cocoa/SDL_cocoaevents.m
+++ b/src/video/cocoa/SDL_cocoaevents.m
@@ -36,6 +36,7 @@
@interface SDLApplication : NSApplication
- (void)terminate:(id)sender;
+- (void)sendEvent:(NSEvent *)theEvent;
@end
@@ -47,6 +48,39 @@
SDL_SendQuit();
}
+// Dispatch events here so that we can handle events caught by
+// nextEventMatchingMask in SDL, as well as events caught by other
+// processes (such as CEF) that are passed down to NSApp.
+- (void)sendEvent:(NSEvent *)theEvent
+{
+ SDL_VideoDevice *_this = SDL_GetVideoDevice();
+
+ switch ([theEvent type]) {
+ case NSLeftMouseDown:
+ case NSOtherMouseDown:
+ case NSRightMouseDown:
+ case NSLeftMouseUp:
+ case NSOtherMouseUp:
+ case NSRightMouseUp:
+ case NSLeftMouseDragged:
+ case NSRightMouseDragged:
+ case NSOtherMouseDragged: /* usually middle mouse dragged */
+ case NSMouseMoved:
+ case NSScrollWheel:
+ Cocoa_HandleMouseEvent(_this, theEvent);
+ break;
+ case NSKeyDown:
+ case NSKeyUp:
+ case NSFlagsChanged:
+ Cocoa_HandleKeyEvent(_this, theEvent);
+ break;
+ default:
+ break;
+ }
+
+ [super sendEvent:theEvent];
+}
+
@end // SDLApplication
/* setAppleMenu disappeared from the headers in 10.4 */
@@ -367,29 +401,7 @@ Cocoa_PumpEvents(_THIS)
break;
}
- switch ([event type]) {
- case NSLeftMouseDown:
- case NSOtherMouseDown:
- case NSRightMouseDown:
- case NSLeftMouseUp:
- case NSOtherMouseUp:
- case NSRightMouseUp:
- case NSLeftMouseDragged:
- case NSRightMouseDragged:
- case NSOtherMouseDragged: /* usually middle mouse dragged */
- case NSMouseMoved:
- case NSScrollWheel:
- Cocoa_HandleMouseEvent(_this, event);
- break;
- case NSKeyDown:
- case NSKeyUp:
- case NSFlagsChanged:
- Cocoa_HandleKeyEvent(_this, event);
- break;
- default:
- break;
- }
- /* Pass through to NSApp to make sure everything stays in sync */
+ // Pass events down to SDLApplication to be handled in sendEvent:
[NSApp sendEvent:event];
}
}}