diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-23 22:33:17 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-23 22:33:17 +0000 |
commit | 2e75b1d84ded96bd8e38b2f7ccb8a1b1cb96a2e4 (patch) | |
tree | c9d8e78ef23f59bed5cd3396550512b408ef11a2 | |
parent | 6619897f398b46546de1dce5a04027aabf0516f6 (diff) | |
download | chromium_src-2e75b1d84ded96bd8e38b2f7ccb8a1b1cb96a2e4.zip chromium_src-2e75b1d84ded96bd8e38b2f7ccb8a1b1cb96a2e4.tar.gz chromium_src-2e75b1d84ded96bd8e38b2f7ccb8a1b1cb96a2e4.tar.bz2 |
aura: Make sure event copying works properly for X11.
This includes two changes:
* In X11, copying event is tricky, especially for XInput2 events. So avoid
doing that when possible.
* Mouse-wheel events used to piggy-back on MouseEvents during dispatch, and
the offset used to be extracted from the native-event. Fix this to make sure
the wheel-events are more like scroll-events so that the offset is carried
with the ui::Event during dispatch to avoid dependency on the native-event.
BUG=144211
Review URL: https://chromiumcodereview.appspot.com/10875018
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@153094 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_aura.cc | 2 | ||||
-rw-r--r-- | content/browser/renderer_host/web_input_event_aura.cc | 4 | ||||
-rw-r--r-- | content/browser/renderer_host/web_input_event_aura.h | 3 | ||||
-rw-r--r-- | content/browser/renderer_host/web_input_event_aurax11.cc | 4 | ||||
-rw-r--r-- | ui/aura/root_window.cc | 13 | ||||
-rw-r--r-- | ui/aura/root_window_host_linux.cc | 6 | ||||
-rw-r--r-- | ui/base/event.cc | 8 | ||||
-rw-r--r-- | ui/base/event.h | 10 |
8 files changed, 39 insertions, 11 deletions
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index cfe782f..d70875c 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -1224,7 +1224,7 @@ bool RenderWidgetHostViewAura::OnMouseEvent(ui::MouseEvent* event) { if (event->type() == ui::ET_MOUSEWHEEL) { WebKit::WebMouseWheelEvent mouse_wheel_event = - MakeWebMouseWheelEvent(event); + MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent*>(event)); if (mouse_wheel_event.deltaX != 0 || mouse_wheel_event.deltaY != 0) host_->ForwardWheelEvent(mouse_wheel_event); } else if (event->type() == ui::ET_SCROLL) { diff --git a/content/browser/renderer_host/web_input_event_aura.cc b/content/browser/renderer_host/web_input_event_aura.cc index 89bd014..0846911 100644 --- a/content/browser/renderer_host/web_input_event_aura.cc +++ b/content/browser/renderer_host/web_input_event_aura.cc @@ -23,7 +23,7 @@ WebKit::WebTouchPoint* UpdateWebTouchEventFromNativeEvent( #else WebKit::WebMouseEvent MakeWebMouseEventFromAuraEvent(ui::MouseEvent* event); WebKit::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent( - ui::MouseEvent* event); + ui::MouseWheelEvent* event); WebKit::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent( ui::ScrollEvent* event); WebKit::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent( @@ -80,7 +80,7 @@ WebKit::WebMouseEvent MakeWebMouseEvent(ui::MouseEvent* event) { return webkit_event; } -WebKit::WebMouseWheelEvent MakeWebMouseWheelEvent(ui::MouseEvent* event) { +WebKit::WebMouseWheelEvent MakeWebMouseWheelEvent(ui::MouseWheelEvent* event) { #if defined(OS_WIN) // Construct an untranslated event from the platform event data. WebKit::WebMouseWheelEvent webkit_event = diff --git a/content/browser/renderer_host/web_input_event_aura.h b/content/browser/renderer_host/web_input_event_aura.h index 82119a9..fabf70c 100644 --- a/content/browser/renderer_host/web_input_event_aura.h +++ b/content/browser/renderer_host/web_input_event_aura.h @@ -12,6 +12,7 @@ namespace ui { class GestureEvent; class KeyEvent; class MouseEvent; +class MouseWheelEvent; class ScrollEvent; class TouchEvent; } @@ -21,7 +22,7 @@ namespace content { CONTENT_EXPORT WebKit::WebMouseEvent MakeWebMouseEvent( ui::MouseEvent* event); CONTENT_EXPORT WebKit::WebMouseWheelEvent MakeWebMouseWheelEvent( - ui::MouseEvent* event); + ui::MouseWheelEvent* event); CONTENT_EXPORT WebKit::WebMouseWheelEvent MakeWebMouseWheelEvent( ui::ScrollEvent* event); CONTENT_EXPORT WebKit::WebKeyboardEvent MakeWebKeyboardEvent( diff --git a/content/browser/renderer_host/web_input_event_aurax11.cc b/content/browser/renderer_host/web_input_event_aurax11.cc index 7c63f3c..6c0ac5e 100644 --- a/content/browser/renderer_host/web_input_event_aurax11.cc +++ b/content/browser/renderer_host/web_input_event_aurax11.cc @@ -226,14 +226,14 @@ WebKit::WebMouseEvent MakeWebMouseEventFromAuraEvent(ui::MouseEvent* event) { } WebKit::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent( - ui::MouseEvent* event) { + ui::MouseWheelEvent* event) { WebKit::WebMouseWheelEvent webkit_event; webkit_event.type = WebKit::WebInputEvent::MouseWheel; webkit_event.button = WebKit::WebMouseEvent::ButtonNone; webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags()); webkit_event.timeStampSeconds = event->time_stamp().InSecondsF(); - webkit_event.deltaY = ui::GetMouseWheelOffset(event->native_event()); + webkit_event.deltaY = event->offset(); webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick; return webkit_event; diff --git a/ui/aura/root_window.cc b/ui/aura/root_window.cc index 797560b..d274b86 100644 --- a/ui/aura/root_window.cc +++ b/ui/aura/root_window.cc @@ -1025,9 +1025,16 @@ bool RootWindow::DispatchMouseEventToTarget(ui::MouseEvent* event, Window::ConvertPointToTarget(this, target, &location_in_window); if (IsNonClientLocation(target, location_in_window)) flags |= ui::EF_IS_NON_CLIENT; - ui::MouseEvent translated_event( - *event, static_cast<Window*>(this), target, event->type(), flags); - return ProcessMouseEvent(target, &translated_event); + if (event->type() == ui::ET_MOUSEWHEEL) { + ui::MouseWheelEvent translated_event( + *static_cast<ui::MouseWheelEvent*>(event), + static_cast<Window*>(this), target, event->type(), flags); + return ProcessMouseEvent(target, &translated_event); + } else { + ui::MouseEvent translated_event( + *event, static_cast<Window*>(this), target, event->type(), flags); + return ProcessMouseEvent(target, &translated_event); + } } return false; } diff --git a/ui/aura/root_window_host_linux.cc b/ui/aura/root_window_host_linux.cc index 503286d..bcf1b6f 100644 --- a/ui/aura/root_window_host_linux.cc +++ b/ui/aura/root_window_host_linux.cc @@ -638,7 +638,6 @@ bool RootWindowHostLinux::Dispatch(const base::NativeEvent& event) { case ui::ET_MOUSE_DRAGGED: case ui::ET_MOUSE_PRESSED: case ui::ET_MOUSE_RELEASED: - case ui::ET_MOUSEWHEEL: case ui::ET_MOUSE_ENTERED: case ui::ET_MOUSE_EXITED: { if (type == ui::ET_MOUSE_MOVED || type == ui::ET_MOUSE_DRAGGED) { @@ -670,6 +669,11 @@ bool RootWindowHostLinux::Dispatch(const base::NativeEvent& event) { delegate_->OnHostMouseEvent(&mouseev); break; } + case ui::ET_MOUSEWHEEL: { + ui::MouseWheelEvent mouseev(xev); + delegate_->OnHostMouseEvent(&mouseev); + break; + } case ui::ET_SCROLL_FLING_START: case ui::ET_SCROLL_FLING_CANCEL: case ui::ET_SCROLL: { diff --git a/ui/base/event.cc b/ui/base/event.cc index 2db3b09..1b31197 100644 --- a/ui/base/event.cc +++ b/ui/base/event.cc @@ -23,6 +23,8 @@ namespace { base::NativeEvent CopyNativeEvent(const base::NativeEvent& event) { #if defined(USE_X11) + if (!event || event->type == GenericEvent) + return NULL; XEvent* copy = new XEvent; *copy = *event; return copy; @@ -74,11 +76,15 @@ Event::Event(const base::NativeEvent& native_event, } Event::Event(const Event& copy) - : native_event_(copy.native_event_), + : native_event_(::CopyNativeEvent(copy.native_event_)), type_(copy.type_), time_stamp_(copy.time_stamp_), flags_(copy.flags_), delete_native_event_(false) { +#if defined(USE_X11) + if (native_event_) + delete_native_event_ = true; +#endif } void Event::Init() { diff --git a/ui/base/event.h b/ui/base/event.h index c34b914..fe4a1e4 100644 --- a/ui/base/event.h +++ b/ui/base/event.h @@ -294,6 +294,16 @@ class UI_EXPORT MouseWheelEvent : public MouseEvent { explicit MouseWheelEvent(const MouseEvent& mouse_event); explicit MouseWheelEvent(const ScrollEvent& scroll_event); + template <class T> + MouseWheelEvent(const MouseWheelEvent& model, + T* source, + T* target, + EventType type, + int flags) + : MouseEvent(model, source, target, type, flags), + offset_(model.offset_) { + } + // The amount to scroll. This is in multiples of kWheelDelta. // Note: offset() > 0 means scroll up / left. int offset() const { return offset_; } |