OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ui/views/cocoa/bridged_content_view.h" | 5 #import "ui/views/cocoa/bridged_content_view.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #import "base/mac/mac_util.h" | 8 #import "base/mac/mac_util.h" |
9 #import "base/mac/scoped_nsobject.h" | 9 #import "base/mac/scoped_nsobject.h" |
10 #import "base/mac/sdk_forward_declarations.h" | 10 #import "base/mac/sdk_forward_declarations.h" |
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 case ui::TEXT_INPUT_TYPE_NONE: | 754 case ui::TEXT_INPUT_TYPE_NONE: |
755 case ui::TEXT_INPUT_TYPE_PASSWORD: | 755 case ui::TEXT_INPUT_TYPE_PASSWORD: |
756 return nil; | 756 return nil; |
757 default: | 757 default: |
758 return [super inputContext]; | 758 return [super inputContext]; |
759 } | 759 } |
760 } | 760 } |
761 | 761 |
762 // NSResponder implementation. | 762 // NSResponder implementation. |
763 | 763 |
| 764 - (BOOL)performKeyEquivalent:(NSEvent*)theEvent { |
| 765 // Normally having the keyDown: would be enough for processing accelerator |
| 766 // events, but some only result in keyUp: calls. The approach is similar to |
| 767 // what we're doing in keyDown: with the exception that we should not fallback |
| 768 // to next responder in doCommandBySelector:, as this will result in NSBeep(). |
| 769 |
| 770 // Convert the event into an action message, according to OSX key mappings. |
| 771 performKeyEquivalentEvent_ = theEvent; |
| 772 performKeyEquivalentEventHandled_.reset(); |
| 773 [self interpretKeyEvents:@[ theEvent ]]; |
| 774 if (auto result = performKeyEquivalentEventHandled_) { |
| 775 DCHECK(!performKeyEquivalentEvent_); |
| 776 performKeyEquivalentEventHandled_.reset(); |
| 777 return *result; |
| 778 } |
| 779 |
| 780 DCHECK(performKeyEquivalentEvent_); |
| 781 ui::KeyEvent event(performKeyEquivalentEvent_); |
| 782 [self handleKeyEvent:&event]; |
| 783 performKeyEquivalentEvent_ = nil; |
| 784 performKeyEquivalentEventHandled_.reset(); |
| 785 return event.handled() ? YES : NO; |
| 786 } |
| 787 |
764 - (void)keyDown:(NSEvent*)theEvent { | 788 - (void)keyDown:(NSEvent*)theEvent { |
765 // Convert the event into an action message, according to OSX key mappings. | 789 // Convert the event into an action message, according to OSX key mappings. |
766 keyDownEvent_ = theEvent; | 790 keyDownEvent_ = theEvent; |
767 [self interpretKeyEvents:@[ theEvent ]]; | 791 [self interpretKeyEvents:@[ theEvent ]]; |
| 792 |
768 keyDownEvent_ = nil; | 793 keyDownEvent_ = nil; |
769 } | 794 } |
770 | 795 |
771 - (void)keyUp:(NSEvent*)theEvent { | 796 - (void)keyUp:(NSEvent*)theEvent { |
772 ui::KeyEvent event(theEvent); | 797 ui::KeyEvent event(theEvent); |
773 [self handleKeyEvent:&event]; | 798 [self handleKeyEvent:&event]; |
774 } | 799 } |
775 | 800 |
776 - (void)scrollWheel:(NSEvent*)theEvent { | 801 - (void)scrollWheel:(NSEvent*)theEvent { |
777 if (!hostedView_) | 802 if (!hostedView_) |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1280 NOTIMPLEMENTED(); | 1305 NOTIMPLEMENTED(); |
1281 return 0; | 1306 return 0; |
1282 } | 1307 } |
1283 | 1308 |
1284 - (void)doCommandBySelector:(SEL)selector { | 1309 - (void)doCommandBySelector:(SEL)selector { |
1285 // Like the renderer, handle insert action messages as a regular key dispatch. | 1310 // Like the renderer, handle insert action messages as a regular key dispatch. |
1286 // This ensures, e.g., insertTab correctly changes focus between fields. | 1311 // This ensures, e.g., insertTab correctly changes focus between fields. |
1287 if (keyDownEvent_ && [NSStringFromSelector(selector) hasPrefix:@"insert"]) { | 1312 if (keyDownEvent_ && [NSStringFromSelector(selector) hasPrefix:@"insert"]) { |
1288 ui::KeyEvent event(keyDownEvent_); | 1313 ui::KeyEvent event(keyDownEvent_); |
1289 [self handleKeyEvent:&event]; | 1314 [self handleKeyEvent:&event]; |
| 1315 performKeyEquivalentEvent_ = nil; |
| 1316 performKeyEquivalentEventHandled_ = YES; |
1290 return; | 1317 return; |
1291 } | 1318 } |
1292 | 1319 |
1293 if ([self respondsToSelector:selector]) | 1320 if ([self respondsToSelector:selector]) { |
1294 [self performSelector:selector withObject:nil]; | 1321 [self performSelector:selector withObject:nil]; |
1295 else | 1322 performKeyEquivalentEvent_ = nil; |
1296 [[self nextResponder] doCommandBySelector:selector]; | 1323 performKeyEquivalentEventHandled_ = YES; |
| 1324 return; |
| 1325 } |
| 1326 |
| 1327 if (performKeyEquivalentEvent_) { |
| 1328 ui::KeyEvent event(performKeyEquivalentEvent_); |
| 1329 [self handleKeyEvent:&event]; |
| 1330 performKeyEquivalentEvent_ = nil; |
| 1331 performKeyEquivalentEventHandled_ = event.handled() ? YES : NO; |
| 1332 // If the event was not handled we must return NO in performKeyEquivalent: |
| 1333 // so the menu bar could have a chance on handling the event. Regardless of |
| 1334 // that, we don't want to call doCommandBySelector: on nextResponder, as |
| 1335 // this will probably result in NSBeep(). |
| 1336 return; |
| 1337 } |
| 1338 |
| 1339 [[self nextResponder] doCommandBySelector:selector]; |
1297 } | 1340 } |
1298 | 1341 |
1299 - (NSRect)firstRectForCharacterRange:(NSRange)range | 1342 - (NSRect)firstRectForCharacterRange:(NSRange)range |
1300 actualRange:(NSRangePointer)actualNSRange { | 1343 actualRange:(NSRangePointer)actualNSRange { |
1301 gfx::Range actualRange; | 1344 gfx::Range actualRange; |
1302 gfx::Rect rect = GetFirstRectForRangeHelper(textInputClient_, | 1345 gfx::Rect rect = GetFirstRectForRangeHelper(textInputClient_, |
1303 gfx::Range(range), &actualRange); | 1346 gfx::Range(range), &actualRange); |
1304 if (actualNSRange) | 1347 if (actualNSRange) |
1305 *actualNSRange = actualRange.ToNSRange(); | 1348 *actualNSRange = actualRange.ToNSRange(); |
1306 return gfx::ScreenRectToNSRect(rect); | 1349 return gfx::ScreenRectToNSRect(rect); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1433 return [hostedView_->GetNativeViewAccessible() accessibilityHitTest:point]; | 1476 return [hostedView_->GetNativeViewAccessible() accessibilityHitTest:point]; |
1434 } | 1477 } |
1435 | 1478 |
1436 - (id)accessibilityFocusedUIElement { | 1479 - (id)accessibilityFocusedUIElement { |
1437 if (!hostedView_) | 1480 if (!hostedView_) |
1438 return nil; | 1481 return nil; |
1439 return [hostedView_->GetNativeViewAccessible() accessibilityFocusedUIElement]; | 1482 return [hostedView_->GetNativeViewAccessible() accessibilityFocusedUIElement]; |
1440 } | 1483 } |
1441 | 1484 |
1442 @end | 1485 @end |
OLD | NEW |