Index: chrome/browser/renderer_host/render_widget_host_view_mac.mm |
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm |
index 28245926701416742320792de0552adc4345a289..6e14cbafbc33d99c272da0a6a3224170de7ccbd0 100644 |
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm |
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm |
@@ -22,10 +22,20 @@ |
#include "webkit/api/public/WebInputEvent.h" |
#include "webkit/glue/webmenurunner_mac.h" |
+using WebKit::WebInputEvent; |
using WebKit::WebInputEventFactory; |
using WebKit::WebMouseEvent; |
using WebKit::WebMouseWheelEvent; |
+static inline int ToWebKitModifiers(NSUInteger flags) { |
pink (ping after 24hrs)
2009/11/11 15:46:16
if this is a bitfield, should it be an unsigned in
Nico
2009/11/12 00:11:16
Technically yes, but the NativeWebKeyboardEvent co
|
+ int modifiers = 0; |
+ if (flags & NSControlKeyMask) modifiers |= WebInputEvent::ControlKey; |
+ if (flags & NSShiftKeyMask) modifiers |= WebInputEvent::ShiftKey; |
+ if (flags & NSAlternateKeyMask) modifiers |= WebInputEvent::AltKey; |
+ if (flags & NSCommandKeyMask) modifiers |= WebInputEvent::MetaKey; |
+ return modifiers; |
+} |
+ |
@interface RenderWidgetHostViewCocoa (Private) |
+ (BOOL)shouldAutohideCursorForEvent:(NSEvent*)event; |
- (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r; |
@@ -652,9 +662,22 @@ void RenderWidgetHostViewMac::SetBackground(const SkBitmap& background) { |
// closure. Were it not for that single reference, this object would |
// already be deallocated. In that case, there's no point in calling |
// -interpretKeyEvents:. |
- if ([self retainCount] > 1 && [theEvent type] == NSKeyDown) |
+ if ([self retainCount] > 1 && [theEvent type] == NSKeyDown) { |
[self interpretKeyEvents:[NSArray arrayWithObject:theEvent]]; |
+ // We don't get insertText: calls if ctrl is down, so synthesize a keypress |
+ // event for that case. Note that this makes our behavior deviate from the |
+ // windows and linux versions of chrome (however, see http://crbug.com/13891 |
+ // ), but it makes us similar to how Safari behaves. |
pink (ping after 24hrs)
2009/11/11 15:46:16
should you be specific about Mac Safari? Does Win
Nico
2009/11/12 00:11:16
Safari/win seems to be similar. At least for keys
|
+ if ([theEvent modifierFlags] & (NSControlKeyMask | NSCommandKeyMask) && |
pink (ping after 24hrs)
2009/11/11 15:46:16
the comment only mentions control, but this fires
Nico
2009/11/12 00:11:16
Updated the comment.
|
+ lastKeyPressedEvent_.get() != theEvent) { |
+ NativeWebKeyboardEvent event([[theEvent characters] characterAtIndex:0], |
+ ToWebKitModifiers([theEvent modifierFlags]), |
+ base::Time::Now().ToDoubleT()); |
+ renderWidgetHostView_->render_widget_host_->ForwardKeyboardEvent(event); |
+ } |
+ } |
+ |
// Possibly autohide the cursor. |
if ([RenderWidgetHostViewCocoa shouldAutohideCursorForEvent:theEvent]) |
[NSCursor setHiddenUntilMouseMoves:YES]; |
@@ -1284,6 +1307,7 @@ extern NSString *NSTextInputReplacementRangeAttributeName; |
// character to onkeypress() event handlers. |
// TODO(hbono): need to handle more commands? |
if (selector == @selector(insertNewline:)) { |
+ lastKeyPressedEvent_.reset([[NSApp currentEvent] retain]); |
NativeWebKeyboardEvent event('\r', renderWidgetHostView_->im_modifiers_, |
base::Time::Now().ToDoubleT()); |
renderWidgetHostView_->render_widget_host_->ForwardKeyboardEvent(event); |
@@ -1304,6 +1328,7 @@ extern NSString *NSTextInputReplacementRangeAttributeName; |
BOOL isAttributedString = [string isKindOfClass:[NSAttributedString class]]; |
NSString* im_text = isAttributedString ? [string string] : string; |
if (!renderWidgetHostView_->im_composing_ && [im_text length] == 1) { |
+ lastKeyPressedEvent_.reset([[NSApp currentEvent] retain]); |
NativeWebKeyboardEvent event([im_text characterAtIndex:0], |
renderWidgetHostView_->im_modifiers_, |
base::Time::Now().ToDoubleT()); |