Index: chrome/browser/android/vr_shell/vr_input_manager.cc |
diff --git a/chrome/browser/android/vr_shell/vr_input_manager.cc b/chrome/browser/android/vr_shell/vr_input_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..94c08ad04e40696ee04b7c6948098eb75d73953e |
--- /dev/null |
+++ b/chrome/browser/android/vr_shell/vr_input_manager.cc |
@@ -0,0 +1,210 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/android/scoped_java_ref.h" |
+#include "chrome/browser/android/vr_shell/vr_input_manager.h" |
+ |
+using blink::WebGestureEvent; |
+using blink::WebMouseEvent; |
+using blink::WebInputEvent; |
+ |
+namespace vr_shell { |
+ |
+VrInputManager::VrInputManager(content::WebContents* web_contents) |
+ : web_contents_(web_contents) { |
+ dpi_scale_ = 1; |
+} |
+ |
+VrInputManager::~VrInputManager() {} |
+ |
+void VrInputManager::ScrollBegin(int64_t time_ms, |
+ float x, |
+ float y, |
+ float hintx, |
+ float hinty, |
+ bool target_viewport) { |
+ WebGestureEvent event = |
+ MakeGestureEvent(WebInputEvent::GestureScrollBegin, time_ms, x, y); |
+ event.data.scrollBegin.deltaXHint = hintx / dpi_scale_; |
+ event.data.scrollBegin.deltaYHint = hinty / dpi_scale_; |
+ event.data.scrollBegin.targetViewport = target_viewport; |
+ |
+ SendGestureEvent(event); |
+} |
+ |
+void VrInputManager::ScrollEnd(int64_t time_ms) { |
+ WebGestureEvent event = |
+ MakeGestureEvent(WebInputEvent::GestureScrollEnd, time_ms, 0, 0); |
+ SendGestureEvent(event); |
+} |
+ |
+void VrInputManager::ScrollBy(int64_t time_ms, |
+ float x, |
+ float y, |
+ float dx, |
+ float dy) { |
+ WebGestureEvent event = |
+ MakeGestureEvent(WebInputEvent::GestureScrollUpdate, time_ms, x, y); |
+ event.data.scrollUpdate.deltaX = -dx / dpi_scale_; |
+ event.data.scrollUpdate.deltaY = -dy / dpi_scale_; |
+ |
+ SendGestureEvent(event); |
+} |
+ |
+void VrInputManager::SendScrollEvent(int64_t time_ms, |
+ float x, |
+ float y, |
+ float dx, |
+ float dy, |
+ int type) { |
+ float hinty = -dy; |
+ float hintx = -dx; |
+ bool target_viewport = false; |
+ switch (type) { |
+ case WebInputEvent::GestureScrollBegin: { |
+ WebGestureEvent event_start = |
+ MakeGestureEvent(WebInputEvent::GestureScrollBegin, time_ms, x, y); |
+ event_start.data.scrollBegin.deltaXHint = hintx / dpi_scale_; |
+ event_start.data.scrollBegin.deltaYHint = hinty / dpi_scale_; |
+ event_start.data.scrollBegin.targetViewport = target_viewport; |
+ SendGestureEvent(event_start); |
+ break; |
+ } |
+ case WebInputEvent::GestureScrollUpdate: { |
+ WebGestureEvent event = |
+ MakeGestureEvent(WebInputEvent::GestureScrollUpdate, time_ms, x, y); |
+ event.data.scrollUpdate.deltaX = -dx / dpi_scale_; |
+ event.data.scrollUpdate.deltaY = -dy / dpi_scale_; |
+ SendGestureEvent(event); |
+ break; |
+ } |
+ case WebInputEvent::GestureScrollEnd: { |
+ WebGestureEvent event_end = |
+ MakeGestureEvent(WebInputEvent::GestureScrollEnd, time_ms, 0, 0); |
+ SendGestureEvent(event_end); |
+ break; |
+ } |
+ } |
+} |
+ |
+void VrInputManager::SendMouseMoveEvent(int64_t time_ms, |
+ float x, |
+ float y, |
+ int type) { |
+ WebMouseEvent result; |
+ |
+ result.type = WebInputEvent::MouseMove; |
+ result.pointerType = blink::WebPointerProperties::PointerType::Mouse; |
+ result.x = x / dpi_scale_; |
+ result.y = y / dpi_scale_; |
+ result.windowX = x / dpi_scale_; |
+ result.windowY = y / dpi_scale_; |
+ result.timeStampSeconds = time_ms / 1000.0; |
+ result.clickCount = 1; |
+ result.modifiers = 0; |
+ |
+ if (type == 1) { |
+ result.type = WebInputEvent::MouseEnter; |
+ } else if (type == 2) { |
+ result.type = WebInputEvent::MouseLeave; |
+ } |
+ result.button = WebMouseEvent::Button::NoButton; |
+ |
+ SendMouseEvent(result); |
+} |
+ |
+void VrInputManager::SendClickEvent(int64_t time_ms, float x, float y) { |
+ WebGestureEvent tap_down_event = |
+ MakeGestureEvent(WebInputEvent::GestureTapDown, time_ms, x, y); |
+ tap_down_event.data.tap.tapCount = 1; |
+ SendGestureEvent(tap_down_event); |
+ |
+ WebGestureEvent tap_event = |
+ MakeGestureEvent(WebInputEvent::GestureTap, time_ms, x, y); |
+ tap_event.data.tap.tapCount = 1; |
+ SendGestureEvent(tap_event); |
+} |
+ |
+void VrInputManager::PinchBegin(int64_t time_ms, float x, float y) { |
+ WebGestureEvent event = |
+ MakeGestureEvent(WebInputEvent::GesturePinchBegin, time_ms, x, y); |
+ SendGestureEvent(event); |
+} |
+ |
+void VrInputManager::PinchEnd(int64_t time_ms) { |
+ WebGestureEvent event = |
+ MakeGestureEvent(WebInputEvent::GesturePinchEnd, time_ms, 0, 0); |
+ SendGestureEvent(event); |
+} |
+ |
+void VrInputManager::PinchBy(int64_t time_ms, |
+ float anchor_x, |
+ float anchor_y, |
+ float delta) { |
+ WebGestureEvent event = MakeGestureEvent(WebInputEvent::GesturePinchUpdate, |
+ time_ms, anchor_x, anchor_y); |
+ event.data.pinchUpdate.scale = delta; |
+ |
+ SendGestureEvent(event); |
+} |
+ |
+void VrInputManager::SendPinchEvent(int64_t time_ms, |
+ float x, |
+ float y, |
+ float dz, |
+ int type) { |
+ switch (type) { |
+ case WebInputEvent::GesturePinchBegin: { |
+ WebGestureEvent event_start = |
+ MakeGestureEvent(WebInputEvent::GesturePinchBegin, time_ms, x, y); |
+ SendGestureEvent(event_start); |
+ break; |
+ } |
+ case WebInputEvent::GesturePinchUpdate: { |
+ WebGestureEvent event = |
+ MakeGestureEvent(WebInputEvent::GesturePinchUpdate, time_ms, x, y); |
+ event.data.pinchUpdate.scale = dz; |
+ |
+ SendGestureEvent(event); |
+ break; |
+ } |
+ case WebInputEvent::GesturePinchEnd: { |
+ WebGestureEvent event_end = |
+ MakeGestureEvent(WebInputEvent::GesturePinchEnd, time_ms, 0, 0); |
+ SendGestureEvent(event_end); |
+ break; |
+ } |
+ } |
+} |
+ |
+WebGestureEvent VrInputManager::MakeGestureEvent(WebInputEvent::Type type, |
+ int64_t time_ms, |
+ float x, |
+ float y) const { |
+ WebGestureEvent result; |
+ |
+ result.type = type; |
+ result.x = x / dpi_scale_; |
+ result.y = y / dpi_scale_; |
+ result.timeStampSeconds = time_ms / 1000.0; |
+ result.sourceDevice = blink::WebGestureDeviceTouchscreen; |
+ |
+ return result; |
+} |
+ |
+void VrInputManager::SendGestureEvent(const blink::WebGestureEvent& event) { |
+ content::RenderWidgetHost* rwh = |
+ web_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost(); |
+ if (rwh) |
+ rwh->ForwardGestureEvent(event); |
+} |
+ |
+void VrInputManager::SendMouseEvent(const blink::WebMouseEvent& event) { |
+ content::RenderWidgetHost* rwh = |
+ web_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost(); |
+ if (rwh) |
+ rwh->ForwardMouseEvent(event); |
+} |
+ |
+} // namespace vr_shell |