Index: services/native_viewport/platform_viewport_x11.cc |
diff --git a/services/native_viewport/platform_viewport_x11.cc b/services/native_viewport/platform_viewport_x11.cc |
index 72a79ac8c68d76506a65bc7561b5cbfc3fed8757..951dba81e9d2170bcd44931d2d3d4bfa42dfe6bb 100644 |
--- a/services/native_viewport/platform_viewport_x11.cc |
+++ b/services/native_viewport/platform_viewport_x11.cc |
@@ -7,6 +7,7 @@ |
#include "base/command_line.h" |
#include "base/message_loop/message_loop.h" |
#include "mojo/converters/geometry/geometry_type_converters.h" |
+#include "mojo/converters/input_events/input_events_type_converters.h" |
#include "mojo/converters/input_events/mojo_extended_key_event_data.h" |
#include "ui/events/event.h" |
#include "ui/events/event_utils.h" |
@@ -18,6 +19,17 @@ |
#include "ui/platform_window/x11/x11_window.h" |
namespace native_viewport { |
+namespace { |
+ |
+float ConvertUIWheelValueToMojoValue(int offset) { |
+ // Mojo's event type takes a value between -1 and 1. Normalize by allowing |
+ // up to 20 of ui's offset. This is a bit arbitrary. |
+ return std::max( |
+ -1.0f, std::min(1.0f, static_cast<float>(offset) / |
+ (20 * static_cast<float>( |
+ ui::MouseWheelEvent::kWheelDelta)))); |
+} |
+} // namespace |
class PlatformViewportX11 : public PlatformViewport, |
public ui::PlatformWindowDelegate { |
@@ -57,10 +69,6 @@ class PlatformViewportX11 : public PlatformViewport, |
platform_window_->SetBounds(bounds); |
} |
- void SetCapture() override { platform_window_->SetCapture(); } |
- |
- void ReleaseCapture() override { platform_window_->ReleaseCapture(); } |
- |
// ui::PlatformWindowDelegate: |
void OnBoundsChanged(const gfx::Rect& new_bounds) override { |
metrics_->size = mojo::Size::From(new_bounds.size()); |
@@ -70,7 +78,32 @@ class PlatformViewportX11 : public PlatformViewport, |
void OnDamageRect(const gfx::Rect& damaged_region) override {} |
void DispatchEvent(ui::Event* event) override { |
- delegate_->OnEvent(event); |
+ mojo::EventPtr mojo_event(mojo::Event::From(*event)); |
+ if (event->IsMouseWheelEvent()) { |
+ // Mojo's event type has a different meaning for wheel events. Convert |
+ // between the two. |
+ ui::MouseWheelEvent* wheel_event = |
+ static_cast<ui::MouseWheelEvent*>(event); |
+ DCHECK(mojo_event->pointer_data); |
+ mojo_event->pointer_data->horizontal_wheel = |
+ ConvertUIWheelValueToMojoValue(wheel_event->x_offset()); |
+ mojo_event->pointer_data->horizontal_wheel = |
+ ConvertUIWheelValueToMojoValue(wheel_event->y_offset()); |
+ } |
+ delegate_->OnEvent(mojo_event.Pass()); |
+ |
+ switch (event->type()) { |
+ case ui::ET_MOUSE_PRESSED: |
+ case ui::ET_TOUCH_PRESSED: |
+ platform_window_->SetCapture(); |
+ break; |
+ case ui::ET_MOUSE_RELEASED: |
+ case ui::ET_TOUCH_RELEASED: |
+ platform_window_->ReleaseCapture(); |
+ break; |
+ default: |
+ break; |
+ } |
// We want to emulate the WM_CHAR generation behaviour of Windows. |
// |
@@ -100,7 +133,7 @@ class PlatformViewportX11 : public PlatformViewport, |
key_press_event->GetUnmodifiedText()))); |
char_event.set_platform_keycode(key_press_event->platform_keycode()); |
- delegate_->OnEvent(&char_event); |
+ delegate_->OnEvent(mojo::Event::From(char_event)); |
} |
} |