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.
parent
c8cfccc2f1
commit
fae5d0eab3
|
@ -36,6 +36,7 @@
|
||||||
@interface SDLApplication : NSApplication
|
@interface SDLApplication : NSApplication
|
||||||
|
|
||||||
- (void)terminate:(id)sender;
|
- (void)terminate:(id)sender;
|
||||||
|
- (void)sendEvent:(NSEvent *)theEvent;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@ -47,6 +48,39 @@
|
||||||
SDL_SendQuit();
|
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
|
@end // SDLApplication
|
||||||
|
|
||||||
/* setAppleMenu disappeared from the headers in 10.4 */
|
/* setAppleMenu disappeared from the headers in 10.4 */
|
||||||
|
@ -367,29 +401,7 @@ Cocoa_PumpEvents(_THIS)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ([event type]) {
|
// Pass events down to SDLApplication to be handled in sendEvent:
|
||||||
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 */
|
|
||||||
[NSApp sendEvent:event];
|
[NSApp sendEvent:event];
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
|
Loading…
Reference in New Issue