Index: ui/views/cocoa/bridged_content_view.mm |
diff --git a/ui/views/cocoa/bridged_content_view.mm b/ui/views/cocoa/bridged_content_view.mm |
index 7c49cd0444346d7291793796970f16a6d7a7c505..9e2a676b8136bce2da2639c097a6c2172755d74c 100644 |
--- a/ui/views/cocoa/bridged_content_view.mm |
+++ b/ui/views/cocoa/bridged_content_view.mm |
@@ -760,10 +760,35 @@ NSAttributedString* GetAttributedString( |
// NSResponder implementation. |
+- (BOOL)performKeyEquivalent:(NSEvent*)theEvent { |
tapted
2016/11/17 08:20:14
I think there's more we have to do here. Have a lo
themblsha
2016/11/17 17:52:16
Good catch!
|
+ // Normally having the keyDown: would be enough for processing accelerator |
+ // events, but some only result in keyUp: calls. The approach is similar to |
+ // what we're doing in keyDown: with the exception that we should not fallback |
+ // to next responder in doCommandBySelector:, as this will result in NSBeep(). |
+ |
+ // Convert the event into an action message, according to OSX key mappings. |
+ performKeyEquivalentEvent_ = theEvent; |
+ performKeyEquivalentEventHandled_.reset(); |
+ [self interpretKeyEvents:@[ theEvent ]]; |
+ if (auto result = performKeyEquivalentEventHandled_) { |
+ DCHECK(!performKeyEquivalentEvent_); |
+ performKeyEquivalentEventHandled_.reset(); |
+ return *result; |
+ } |
+ |
+ DCHECK(performKeyEquivalentEvent_); |
+ ui::KeyEvent event(performKeyEquivalentEvent_); |
+ [self handleKeyEvent:&event]; |
+ performKeyEquivalentEvent_ = nil; |
+ performKeyEquivalentEventHandled_.reset(); |
+ return event.handled() ? YES : NO; |
+} |
+ |
- (void)keyDown:(NSEvent*)theEvent { |
// Convert the event into an action message, according to OSX key mappings. |
keyDownEvent_ = theEvent; |
[self interpretKeyEvents:@[ theEvent ]]; |
+ |
keyDownEvent_ = nil; |
} |
@@ -1286,13 +1311,31 @@ NSAttributedString* GetAttributedString( |
if (keyDownEvent_ && [NSStringFromSelector(selector) hasPrefix:@"insert"]) { |
ui::KeyEvent event(keyDownEvent_); |
[self handleKeyEvent:&event]; |
+ performKeyEquivalentEvent_ = nil; |
+ performKeyEquivalentEventHandled_ = YES; |
return; |
} |
- if ([self respondsToSelector:selector]) |
+ if ([self respondsToSelector:selector]) { |
[self performSelector:selector withObject:nil]; |
- else |
- [[self nextResponder] doCommandBySelector:selector]; |
+ performKeyEquivalentEvent_ = nil; |
+ performKeyEquivalentEventHandled_ = YES; |
+ return; |
+ } |
+ |
+ if (performKeyEquivalentEvent_) { |
+ ui::KeyEvent event(performKeyEquivalentEvent_); |
+ [self handleKeyEvent:&event]; |
+ performKeyEquivalentEvent_ = nil; |
+ performKeyEquivalentEventHandled_ = event.handled() ? YES : NO; |
+ // If the event was not handled we must return NO in performKeyEquivalent: |
+ // so the menu bar could have a chance on handling the event. Regardless of |
+ // that, we don't want to call doCommandBySelector: on nextResponder, as |
+ // this will probably result in NSBeep(). |
+ return; |
+ } |
+ |
+ [[self nextResponder] doCommandBySelector:selector]; |
} |
- (NSRect)firstRectForCharacterRange:(NSRange)range |