Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1736)

Unified Diff: chrome/browser/android/vr_shell/vr_shell_gl.cc

Issue 2840183003: VR: Route hover and click events to UI elements. (Closed)
Patch Set: Offer both OnButtonDown() and OnButtonUp(), rather than a combined OnClick() Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell_gl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/android/vr_shell/vr_shell_gl.cc
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr_shell/vr_shell_gl.cc
index 27e62da0b5b5d4e74e3cf01463c52a65aa3ecded..c8e62bb56fbb8558a831ceb03372b02043a8fc7c 100644
--- a/chrome/browser/android/vr_shell/vr_shell_gl.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_gl.cc
@@ -536,7 +536,7 @@ void VrShellGl::HandleControllerInput(const gfx::Vector3dF& forward_vector) {
gesture->source_device = blink::kWebGestureDeviceTouchpad;
gesture->x = 0;
gesture->y = 0;
- SendGesture(InputTarget::CONTENT, std::move(gesture));
+ SendGestureToContent(std::move(gesture));
DVLOG(1) << __FUNCTION__ << ": sent CLICK gesture";
}
}
@@ -586,11 +586,12 @@ void VrShellGl::HandleControllerInput(const gfx::Vector3dF& forward_vector) {
// Determine which UI element (if any) intersects the line between the eyes
// and the controller target position.
float closest_element_distance = (target_point_ - kOrigin).Length();
+ previous_target_element_ = target_element_;
target_element_ = nullptr;
float target_x;
float target_y;
- for (const auto& plane : scene_->GetUiElements()) {
+ for (auto& plane : scene_->GetUiElements()) {
if (!plane->IsHitTestable())
continue;
@@ -618,12 +619,11 @@ void VrShellGl::HandleControllerInput(const gfx::Vector3dF& forward_vector) {
target_y = y;
}
- // Treat UI elements, which do not show web content, as NONE input
- // targets since they cannot make use of the input anyway.
+ // Handle input targeting on the content quad, ignoring any other elements.
+ // Content is treated specially to accomodate scrolling, flings, etc.
InputTarget input_target = InputTarget::NONE;
int pixel_x = 0;
int pixel_y = 0;
-
if (target_element_ != nullptr && target_element_->fill == Fill::CONTENT) {
input_target = InputTarget::CONTENT;
gfx::RectF pixel_rect(0, 0, content_tex_css_width_,
@@ -631,7 +631,10 @@ void VrShellGl::HandleControllerInput(const gfx::Vector3dF& forward_vector) {
pixel_x = pixel_rect.x() + pixel_rect.width() * target_x;
pixel_y = pixel_rect.y() + pixel_rect.height() * target_y;
}
- SendEventsToTarget(input_target, pixel_x, pixel_y);
+ SendInputToContent(input_target, pixel_x, pixel_y);
+
+ // Handle input targeting on all non-content elements.
+ SendInputToUiElements(target_element_);
}
void VrShellGl::HandleControllerAppButtonActivity(
@@ -668,7 +671,7 @@ void VrShellGl::HandleControllerAppButtonActivity(
}
}
-void VrShellGl::SendEventsToTarget(InputTarget input_target,
+void VrShellGl::SendInputToContent(InputTarget input_target,
int pixel_x,
int pixel_y) {
std::vector<std::unique_ptr<WebGestureEvent>> gesture_list =
@@ -697,37 +700,37 @@ void VrShellGl::SendEventsToTarget(InputTarget input_target,
case WebInputEvent::kGestureScrollBegin:
current_scroll_target_ = input_target;
if (current_scroll_target_ != InputTarget::NONE) {
- SendGesture(current_scroll_target_, std::move(movableGesture));
+ SendGestureToContent(std::move(movableGesture));
}
break;
case WebInputEvent::kGestureScrollEnd:
if (current_scroll_target_ != InputTarget::NONE) {
- SendGesture(current_scroll_target_, std::move(movableGesture));
+ SendGestureToContent(std::move(movableGesture));
}
current_fling_target_ = current_scroll_target_;
current_scroll_target_ = InputTarget::NONE;
break;
case WebInputEvent::kGestureScrollUpdate:
if (current_scroll_target_ != InputTarget::NONE) {
- SendGesture(current_scroll_target_, std::move(movableGesture));
+ SendGestureToContent(std::move(movableGesture));
}
break;
case WebInputEvent::kGestureFlingStart:
if (current_fling_target_ != InputTarget::NONE) {
- SendGesture(current_fling_target_, std::move(movableGesture));
+ SendGestureToContent(std::move(movableGesture));
}
current_fling_target_ = InputTarget::NONE;
break;
case WebInputEvent::kGestureFlingCancel:
current_fling_target_ = InputTarget::NONE;
if (input_target != InputTarget::NONE) {
- SendGesture(input_target, std::move(movableGesture));
+ SendGestureToContent(std::move(movableGesture));
}
break;
case WebInputEvent::kGestureTapDown:
current_fling_target_ = InputTarget::NONE;
if (input_target != InputTarget::NONE) {
- SendGesture(input_target, std::move(movableGesture));
+ SendGestureToContent(std::move(movableGesture));
}
break;
case WebInputEvent::kUndefined:
@@ -741,21 +744,54 @@ void VrShellGl::SendEventsToTarget(InputTarget input_target,
bool new_target = input_target != current_input_target_;
if (new_target && current_input_target_ != InputTarget::NONE) {
// Send a move event indicating that the pointer moved off of an element.
- SendGesture(current_input_target_,
- MakeMouseEvent(WebInputEvent::kMouseLeave, timestamp, 0, 0));
+ SendGestureToContent(
+ MakeMouseEvent(WebInputEvent::kMouseLeave, timestamp, 0, 0));
}
current_input_target_ = input_target;
if (current_input_target_ != InputTarget::NONE) {
WebInputEvent::Type type =
new_target ? WebInputEvent::kMouseEnter : WebInputEvent::kMouseMove;
- SendGesture(input_target,
- MakeMouseEvent(type, timestamp, pixel_x, pixel_y));
+ SendGestureToContent(MakeMouseEvent(type, timestamp, pixel_x, pixel_y));
+ }
+}
+
+void VrShellGl::SendInputToUiElements(UiElement* target_element) {
+ if (target_element != previous_target_element_) {
+ if (previous_target_element_ &&
+ previous_target_element_->fill != Fill::CONTENT) {
+ task_runner_->PostTask(
+ FROM_HERE, base::Bind(&UiElement::OnHoverLeave,
+ base::Unretained(previous_target_element_)));
+ }
+ if (target_element && target_element->fill != Fill::CONTENT) {
+ task_runner_->PostTask(FROM_HERE,
+ base::Bind(&UiElement::OnHoverEnter,
+ base::Unretained(target_element)));
+ }
+ click_target_element_ = nullptr;
+ }
+ if (target_element && target_element->fill != Fill::CONTENT) {
+ if (controller_->ButtonDownHappened(
+ gvr::ControllerButton::GVR_CONTROLLER_BUTTON_CLICK)) {
+ task_runner_->PostTask(FROM_HERE,
+ base::Bind(&UiElement::OnButtonDown,
+ base::Unretained(target_element)));
+ click_target_element_ = target_element;
+ }
+ if (controller_->ButtonUpHappened(
+ gvr::ControllerButton::GVR_CONTROLLER_BUTTON_CLICK)) {
+ if (click_target_element_ == target_element) {
+ task_runner_->PostTask(FROM_HERE,
+ base::Bind(&UiElement::OnButtonUp,
+ base::Unretained(target_element)));
+ }
+ click_target_element_ = nullptr;
+ }
}
}
-void VrShellGl::SendGesture(InputTarget input_target,
- std::unique_ptr<blink::WebInputEvent> event) {
- DCHECK(input_target != InputTarget::NONE);
+void VrShellGl::SendGestureToContent(
+ std::unique_ptr<blink::WebInputEvent> event) {
main_thread_task_runner_->PostTask(
FROM_HERE, base::Bind(&VrShell::ProcessContentGesture, weak_vr_shell_,
base::Passed(std::move(event))));
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell_gl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698