Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(158)

Unified Diff: ui/views/cocoa/bridged_content_view.mm

Issue 2505943002: MacViews: Fix accelerator handling while Omnibox is in focus. (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/cocoa/bridged_content_view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « ui/views/cocoa/bridged_content_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698