summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbryeung@google.com <bryeung@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-21 18:31:57 +0000
committerbryeung@google.com <bryeung@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-21 18:31:57 +0000
commit155e86ad19e6b938796ceeffcf2c6143b78614d1 (patch)
treec772e29c8ec84227961a2c9fe7ac3da781b51827
parent1e2ec4d3964a38f59c54051528c9cddc9c6fdfe2 (diff)
downloadchromium_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.cc122
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_views.h8
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_;