diff options
author | bryeung@google.com <bryeung@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-21 18:31:57 +0000 |
---|---|---|
committer | bryeung@google.com <bryeung@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-21 18:31:57 +0000 |
commit | 155e86ad19e6b938796ceeffcf2c6143b78614d1 (patch) | |
tree | c772e29c8ec84227961a2c9fe7ac3da781b51827 | |
parent | 1e2ec4d3964a38f59c54051528c9cddc9c6fdfe2 (diff) | |
download | chromium_src-155e86ad19e6b938796ceeffcf2c6143b78614d1.zip chromium_src-155e86ad19e6b938796ceeffcf2c6143b78614d1.tar.gz chromium_src-155e86ad19e6b938796ceeffcf2c6143b78614d1.tar.bz2 |
toolkit views: update mouse and keyboard events.
This changeset allows dragging to work by setting the button for
mouse-move events. It also makes modifier keys work for key-events.
Patch from: Sadrul Chowdhury <sadrul@chromium.org>
BUG=none
TEST=Click+dragging to select text etc. in a page should work. Also, in a text field, pressing shift+ctrl+arrow keys should select text.
Review URL: http://codereview.chromium.org/3767014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@63387 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/renderer_host/render_widget_host_view_views.cc | 122 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_widget_host_view_views.h | 8 |
2 files changed, 67 insertions, 63 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host_view_views.cc b/chrome/browser/renderer_host/render_widget_host_view_views.cc index 25e8a88..da4e99c 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_views.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_views.cc @@ -36,6 +36,23 @@ static const char* kRenderWidgetHostViewKey = "__RENDER_WIDGET_HOST_VIEW__"; using WebKit::WebInputEventFactory; using WebKit::WebMouseWheelEvent; +namespace { + +int WebInputEventFlagsFromViewsEvent(const views::Event& event) { + int modifiers = 0; + + if (event.IsShiftDown()) + modifiers |= WebKit::WebInputEvent::ShiftKey; + if (event.IsControlDown()) + modifiers |= WebKit::WebInputEvent::ControlKey; + if (event.IsAltDown()) + modifiers |= WebKit::WebInputEvent::AltKey; + + return modifiers; +} + +} // namespace + // static RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( RenderWidgetHost* widget) { @@ -392,30 +409,11 @@ bool RenderWidgetHostViewViews::OnMousePressed(const views::MouseEvent& event) { RequestFocus(); // TODO(anicolao): validate event generation. - WebKit::WebMouseEvent e; - e.timeStampSeconds = base::Time::Now().ToDoubleT(); - e.modifiers = 0; - if (event.IsMiddleMouseButton()) { - e.modifiers |= WebKit::WebInputEvent::MiddleButtonDown; - e.button = WebKit::WebMouseEvent::ButtonMiddle; - } - if (event.IsRightMouseButton()) { - e.modifiers |= WebKit::WebInputEvent::RightButtonDown; - e.button = WebKit::WebMouseEvent::ButtonRight; - } - if (event.IsLeftMouseButton()) { - e.modifiers |= WebKit::WebInputEvent::LeftButtonDown; - e.button = WebKit::WebMouseEvent::ButtonLeft; - } - e.windowX = e.x = event.x(); - e.windowY = e.y = event.y(); - int x, y; - gdk_window_get_origin(GetNativeView()->window, &x, &y); - e.globalX = e.x + x; - e.globalY = e.y + y; - e.clickCount = 1; + WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event); + // TODO(anicolao): deal with double clicks e.type = WebKit::WebInputEvent::MouseDown; + e.clickCount = 1; GetRenderWidgetHost()->ForwardMouseEvent(e); return true; @@ -423,28 +421,11 @@ bool RenderWidgetHostViewViews::OnMousePressed(const views::MouseEvent& event) { void RenderWidgetHostViewViews::OnMouseReleased(const views::MouseEvent& event, bool canceled) { - WebKit::WebMouseEvent e; - e.timeStampSeconds = base::Time::Now().ToDoubleT(); - e.windowX = e.x = event.x(); - e.windowY = e.y = event.y(); - int x, y; - gdk_window_get_origin(GetNativeView()->window, &x, &y); - e.globalX = e.x + x; - e.globalY = e.y + y; - e.clickCount = 1; + WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event); + e.type = WebKit::WebInputEvent::MouseUp; - if (event.IsMiddleMouseButton()) { - e.modifiers |= WebKit::WebInputEvent::MiddleButtonDown; - e.button = WebKit::WebMouseEvent::ButtonMiddle; - } - if (event.IsRightMouseButton()) { - e.modifiers |= WebKit::WebInputEvent::RightButtonDown; - e.button = WebKit::WebMouseEvent::ButtonRight; - } - if (event.IsLeftMouseButton()) { - e.modifiers |= WebKit::WebInputEvent::LeftButtonDown; - e.button = WebKit::WebMouseEvent::ButtonLeft; - } + e.clickCount = 1; + GetRenderWidgetHost()->ForwardMouseEvent(e); } @@ -454,24 +435,10 @@ bool RenderWidgetHostViewViews::OnMouseDragged(const views::MouseEvent& event) { } void RenderWidgetHostViewViews::OnMouseMoved(const views::MouseEvent& event) { - WebKit::WebMouseEvent e; - e.timeStampSeconds = base::Time::Now().ToDoubleT(); - e.windowX = e.x = event.x(); - e.windowY = e.y = event.y(); - int x, y; - gdk_window_get_origin(GetNativeView()->window, &x, &y); - e.globalX = e.x + x; - e.globalY = e.y + y; + WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event); + e.type = WebKit::WebInputEvent::MouseMove; - if (event.IsMiddleMouseButton()) { - e.modifiers |= WebKit::WebInputEvent::MiddleButtonDown; - } - if (event.IsRightMouseButton()) { - e.modifiers |= WebKit::WebInputEvent::RightButtonDown; - } - if (event.IsLeftMouseButton()) { - e.modifiers |= WebKit::WebInputEvent::LeftButtonDown; - } + GetRenderWidgetHost()->ForwardMouseEvent(e); } @@ -501,9 +468,7 @@ bool RenderWidgetHostViewViews::OnKeyPressed(const views::KeyEvent &e) { static_cast<unsigned short>(gdk_keyval_to_unicode( app::GdkKeyCodeForWindowsKeyCode(e.GetKeyCode(), false /*shift*/))); - // If ctrl key is pressed down, then control character shall be input. - // TODO(anicolao): deal with modifiers - + wke.modifiers = WebInputEventFlagsFromViewsEvent(e); ForwardKeyboardEvent(wke); // send the keypress event @@ -600,6 +565,37 @@ bool RenderWidgetHostViewViews::ContainsNativeView( return false; } +WebKit::WebMouseEvent RenderWidgetHostViewViews::WebMouseEventFromViewsEvent( + const views::MouseEvent& event) { + WebKit::WebMouseEvent wmevent; + + wmevent.timeStampSeconds = base::Time::Now().ToDoubleT(); + wmevent.windowX = wmevent.x = event.x(); + wmevent.windowY = wmevent.y = event.y(); + int x, y; + gdk_window_get_origin(GetNativeView()->window, &x, &y); + wmevent.globalX = wmevent.x + x; + wmevent.globalY = wmevent.y + y; + wmevent.modifiers = WebInputEventFlagsFromViewsEvent(event); + + // Setting |wmevent.button| is not necessary for -move events, but it is + // necessary for -clicks and -drags. + if (event.IsMiddleMouseButton()) { + wmevent.modifiers |= WebKit::WebInputEvent::MiddleButtonDown; + wmevent.button = WebKit::WebMouseEvent::ButtonMiddle; + } + if (event.IsRightMouseButton()) { + wmevent.modifiers |= WebKit::WebInputEvent::RightButtonDown; + wmevent.button = WebKit::WebMouseEvent::ButtonRight; + } + if (event.IsLeftMouseButton()) { + wmevent.modifiers |= WebKit::WebInputEvent::LeftButtonDown; + wmevent.button = WebKit::WebMouseEvent::ButtonLeft; + } + + return wmevent; +} + void RenderWidgetHostViewViews::ForwardKeyboardEvent( const NativeWebKeyboardEvent& event) { if (!host_) diff --git a/chrome/browser/renderer_host/render_widget_host_view_views.h b/chrome/browser/renderer_host/render_widget_host_view_views.h index 331c1cd..6ba5d4a 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_views.h +++ b/chrome/browser/renderer_host/render_widget_host_view_views.h @@ -23,6 +23,10 @@ class RenderWidgetHost; class GpuViewHost; struct NativeWebKeyboardEvent; +namespace WebKit { +class WebMouseEvent; +} + // ----------------------------------------------------------------------------- // See comments in render_widget_host_view.h about this class and its members. // ----------------------------------------------------------------------------- @@ -112,6 +116,10 @@ class RenderWidgetHostViewViews : public RenderWidgetHostView, // Update the display cursor for the render view. void ShowCurrentCursor(); + // Translate a views::MouseEvent into a WebKit::WebMouseEvent. + WebKit::WebMouseEvent WebMouseEventFromViewsEvent( + const views::MouseEvent& event); + // The model object. RenderWidgetHost* host_; |