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

Side by Side Diff: ui/views/cocoa/bridged_content_view.mm

Issue 866983006: MacViews: Intercept events for Menus (after AppKit has turned them into action messages). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@20150127-MacViews-SendTextfieldToWindow-TEXTFIELD
Patch Set: better IME handling Created 5 years, 10 months 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 unified diff | Download patch
OLDNEW
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/scoped_nsobject.h" 8 #import "base/mac/scoped_nsobject.h"
9 #include "base/strings/sys_string_conversions.h" 9 #include "base/strings/sys_string_conversions.h"
10 #include "ui/base/ime/text_input_client.h" 10 #include "ui/base/ime/text_input_client.h"
11 #import "ui/events/cocoa/cocoa_event_utils.h" 11 #import "ui/events/cocoa/cocoa_event_utils.h"
12 #include "ui/events/keycodes/dom3/dom_code.h" 12 #include "ui/events/keycodes/dom3/dom_code.h"
13 #import "ui/events/keycodes/keyboard_code_conversion_mac.h" 13 #import "ui/events/keycodes/keyboard_code_conversion_mac.h"
14 #include "ui/gfx/canvas_paint_mac.h" 14 #include "ui/gfx/canvas_paint_mac.h"
15 #include "ui/gfx/geometry/rect.h" 15 #include "ui/gfx/geometry/rect.h"
16 #include "ui/strings/grit/ui_strings.h" 16 #include "ui/strings/grit/ui_strings.h"
17 #include "ui/views/controls/menu/menu_controller.h"
17 #include "ui/views/view.h" 18 #include "ui/views/view.h"
18 #include "ui/views/widget/widget.h" 19 #include "ui/views/widget/widget.h"
19 20
21 using views::MenuController;
22
20 namespace { 23 namespace {
21 24
22 // Convert a |point| in |source_window|'s AppKit coordinate system (origin at 25 // Convert a |point| in |source_window|'s AppKit coordinate system (origin at
23 // the bottom left of the window) to |target_window|'s content rect, with the 26 // the bottom left of the window) to |target_window|'s content rect, with the
24 // origin at the top left of the content area. 27 // origin at the top left of the content area.
25 // If |source_window| is nil, |point| will be treated as screen coordinates. 28 // If |source_window| is nil, |point| will be treated as screen coordinates.
26 gfx::Point MovePointToWindow(const NSPoint& point, 29 gfx::Point MovePointToWindow(const NSPoint& point,
27 NSWindow* source_window, 30 NSWindow* source_window,
28 NSWindow* target_window) { 31 NSWindow* target_window) {
29 NSPoint point_in_screen = source_window 32 NSPoint point_in_screen = source_window
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 hostedView_->GetWidget()->OnMouseEvent(&event); 130 hostedView_->GetWidget()->OnMouseEvent(&event);
128 } 131 }
129 132
130 - (void)handleAction:(int)commandId 133 - (void)handleAction:(int)commandId
131 keyCode:(ui::KeyboardCode)keyCode 134 keyCode:(ui::KeyboardCode)keyCode
132 domCode:(ui::DomCode)domCode 135 domCode:(ui::DomCode)domCode
133 eventFlags:(int)eventFlags { 136 eventFlags:(int)eventFlags {
134 if (!hostedView_) 137 if (!hostedView_)
135 return; 138 return;
136 139
140 // If there's an active MenuController it gets preference, and it will likely
141 // swallow the event.
142 MenuController* menuController = MenuController::GetActiveInstance();
143 if (menuController && menuController->owner() == hostedView_->GetWidget()) {
144 if (menuController->OnWillDispatchKeyEvent(0, keyCode) ==
145 ui::POST_DISPATCH_NONE)
146 return;
147 }
148
137 // If there's an active TextInputClient, it ignores the key and processes the 149 // If there's an active TextInputClient, it ignores the key and processes the
138 // logical editing action. 150 // logical editing action.
139 if (commandId && textInputClient_ && 151 if (commandId && textInputClient_ &&
140 textInputClient_->IsEditingCommandEnabled(commandId)) { 152 textInputClient_->IsEditingCommandEnabled(commandId)) {
141 textInputClient_->ExecuteEditingCommand(commandId); 153 textInputClient_->ExecuteEditingCommand(commandId);
142 return; 154 return;
143 } 155 }
144 156
145 // Otherwise, process the action as a regular key event. 157 // Otherwise, process the action as a regular key event.
146 ui::KeyEvent event(ui::ET_KEY_PRESSED, keyCode, domCode, eventFlags); 158 ui::KeyEvent event(ui::ET_KEY_PRESSED, keyCode, domCode, eventFlags);
(...skipping 21 matching lines...) Expand all
168 return; 180 return;
169 181
170 // If there's a layer, painting occurs in BridgedNativeWidget::OnPaintLayer(). 182 // If there's a layer, painting occurs in BridgedNativeWidget::OnPaintLayer().
171 if (hostedView_->GetWidget()->GetLayer()) 183 if (hostedView_->GetWidget()->GetLayer())
172 return; 184 return;
173 185
174 gfx::CanvasSkiaPaint canvas(dirtyRect, false /* opaque */); 186 gfx::CanvasSkiaPaint canvas(dirtyRect, false /* opaque */);
175 hostedView_->GetWidget()->OnNativeWidgetPaint(&canvas); 187 hostedView_->GetWidget()->OnNativeWidgetPaint(&canvas);
176 } 188 }
177 189
190 - (NSTextInputContext*)inputContext {
191 if (!hostedView_)
192 return [super inputContext];
193
194 // If a menu is active, and -[NSView interpretKeyEvents:] asks for the
195 // input context, return nil. This ensures the action message is sent to
196 // the view, rather than any NSTextInputClient a subview has installed.
197 MenuController* menuController = MenuController::GetActiveInstance();
198 if (menuController && menuController->owner() == hostedView_->GetWidget())
199 return nil;
200
201 return [super inputContext];
202 }
203
178 // NSResponder implementation. 204 // NSResponder implementation.
179 205
180 - (void)keyDown:(NSEvent*)theEvent { 206 - (void)keyDown:(NSEvent*)theEvent {
181 // Convert the event into an action message, according to OSX key mappings. 207 // Convert the event into an action message, according to OSX key mappings.
182 [self interpretKeyEvents:@[ theEvent ]]; 208 [self interpretKeyEvents:@[ theEvent ]];
183 } 209 }
184 210
185 - (void)mouseDown:(NSEvent*)theEvent { 211 - (void)mouseDown:(NSEvent*)theEvent {
186 [self handleMouseEvent:theEvent]; 212 [self handleMouseEvent:theEvent];
187 } 213 }
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 actualRange:(NSRangePointer)actualRange { 492 actualRange:(NSRangePointer)actualRange {
467 NOTIMPLEMENTED(); 493 NOTIMPLEMENTED();
468 return NSZeroRect; 494 return NSZeroRect;
469 } 495 }
470 496
471 - (BOOL)hasMarkedText { 497 - (BOOL)hasMarkedText {
472 return textInputClient_ && textInputClient_->HasCompositionText(); 498 return textInputClient_ && textInputClient_->HasCompositionText();
473 } 499 }
474 500
475 - (void)insertText:(id)text replacementRange:(NSRange)replacementRange { 501 - (void)insertText:(id)text replacementRange:(NSRange)replacementRange {
476 if (!textInputClient_) 502 if (!hostedView_)
477 return; 503 return;
478 504
479 if ([text isKindOfClass:[NSAttributedString class]]) 505 if ([text isKindOfClass:[NSAttributedString class]])
480 text = [text string]; 506 text = [text string];
507
508 MenuController* menuController = MenuController::GetActiveInstance();
509 if (menuController && menuController->owner() == hostedView_->GetWidget()) {
510 // Handle menu mnemonics (e.g. "sav" jumps to "Save"). Handles both single-
511 // characters and input from IME. For IME, swallow the entire string unless
512 // the very first character gives ui::POST_DISPATCH_PERFORM_DEFAULT.
513 bool swallowedAny = false;
514 for (NSUInteger i = 0; i < [text length]; ++i) {
515 if (!menuController ||
516 menuController->OnWillDispatchKeyEvent([text characterAtIndex:i],
517 ui::VKEY_UNKNOWN) ==
518 ui::POST_DISPATCH_PERFORM_DEFAULT) {
519 if (swallowedAny)
520 return; // Swallow remainder.
521 break;
522 }
523 swallowedAny = true;
524 // Ensure the menu remains active.
525 menuController = MenuController::GetActiveInstance();
526 }
527 }
528
529 if (!textInputClient_)
530 return;
531
481 textInputClient_->DeleteRange(gfx::Range(replacementRange)); 532 textInputClient_->DeleteRange(gfx::Range(replacementRange));
482 textInputClient_->InsertText(base::SysNSStringToUTF16(text)); 533 textInputClient_->InsertText(base::SysNSStringToUTF16(text));
483 } 534 }
484 535
485 - (NSRange)markedRange { 536 - (NSRange)markedRange {
486 if (!textInputClient_) 537 if (!textInputClient_)
487 return NSMakeRange(NSNotFound, 0); 538 return NSMakeRange(NSNotFound, 0);
488 539
489 gfx::Range range; 540 gfx::Range range;
490 textInputClient_->GetCompositionTextRange(&range); 541 textInputClient_->GetCompositionTextRange(&range);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 } 582 }
532 583
533 return [super accessibilityAttributeValue:attribute]; 584 return [super accessibilityAttributeValue:attribute];
534 } 585 }
535 586
536 - (id)accessibilityHitTest:(NSPoint)point { 587 - (id)accessibilityHitTest:(NSPoint)point {
537 return [hostedView_->GetNativeViewAccessible() accessibilityHitTest:point]; 588 return [hostedView_->GetNativeViewAccessible() accessibilityHitTest:point];
538 } 589 }
539 590
540 @end 591 @end
OLDNEW
« no previous file with comments | « no previous file | ui/views/cocoa/native_widget_mac_nswindow.mm » ('j') | ui/views/controls/menu/menu_controller.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698