summaryrefslogtreecommitdiffstats
path: root/ui/views/widget
diff options
context:
space:
mode:
authorvollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-17 03:28:27 +0000
committervollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-17 03:28:27 +0000
commita7826751a6148308e774797db2f9842ec1cdefa1 (patch)
tree3e0385f2a6b4e65bedc14945487a0a17e913aa7c /ui/views/widget
parentc4b89ffbed7bb2d2cde94b5ebd6b42f72bca45db (diff)
downloadchromium_src-a7826751a6148308e774797db2f9842ec1cdefa1.zip
chromium_src-a7826751a6148308e774797db2f9842ec1cdefa1.tar.gz
chromium_src-a7826751a6148308e774797db2f9842ec1cdefa1.tar.bz2
Initial views touchui Gesture Recognizer support
This is just a merge of Gajen's patch (http://codereview.chromium.org/8364039/) with ToT. BUG=101645 TEST=views_unittest Review URL: http://codereview.chromium.org/9076002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@117869 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/views/widget')
-rw-r--r--ui/views/widget/native_widget_delegate.h4
-rw-r--r--ui/views/widget/root_view.cc75
-rw-r--r--ui/views/widget/root_view.h15
-rw-r--r--ui/views/widget/widget.cc7
-rw-r--r--ui/views/widget/widget.h1
5 files changed, 98 insertions, 4 deletions
diff --git a/ui/views/widget/native_widget_delegate.h b/ui/views/widget/native_widget_delegate.h
index 317374a..6bbef31 100644
--- a/ui/views/widget/native_widget_delegate.h
+++ b/ui/views/widget/native_widget_delegate.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -17,6 +17,7 @@ class Size;
namespace views {
class InputMethod;
+class GestureEvent;
class KeyEvent;
class MouseEvent;
class TouchEvent;
@@ -96,6 +97,7 @@ class VIEWS_EXPORT NativeWidgetDelegate {
virtual bool OnMouseEvent(const MouseEvent& event) = 0;
virtual void OnMouseCaptureLost() = 0;
virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) = 0;
+ virtual ui::GestureStatus OnGestureEvent(const GestureEvent& event) = 0;
// Runs the specified native command. Returns true if the command is handled.
virtual bool ExecuteCommand(int command_id) = 0;
diff --git a/ui/views/widget/root_view.cc b/ui/views/widget/root_view.cc
index c4978ca..a8f4ef6 100644
--- a/ui/views/widget/root_view.cc
+++ b/ui/views/widget/root_view.cc
@@ -16,6 +16,7 @@
#include "ui/views/focus/view_storage.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/touchui/gesture_manager.h"
+#include "ui/views/touchui/gesture_recognizer.h"
#include "ui/views/widget/widget.h"
namespace views {
@@ -40,6 +41,8 @@ RootView::RootView(Widget* widget)
last_mouse_event_y_(-1),
gesture_manager_(GestureManager::GetInstance()),
touch_pressed_handler_(NULL),
+ gesture_recognizer_(GestureRecognizer::GetInstance()),
+ gesture_handling_view_(NULL),
ALLOW_THIS_IN_INITIALIZER_LIST(focus_search_(this, false, false)),
focus_traversable_parent_(NULL),
focus_traversable_parent_view_(NULL) {
@@ -337,7 +340,7 @@ ui::TouchStatus RootView::OnTouchEvent(const TouchEvent& event) {
if (touch_pressed_handler_) {
TouchEvent touch_event(e, this, touch_pressed_handler_);
status = touch_pressed_handler_->ProcessTouchEvent(touch_event);
- if (gesture_manager_->ProcessTouchEventForGesture(e, this, status))
+ if (DoGestureProcessing(e, status))
status = ui::TOUCH_STATUS_SYNTH_MOUSE;
if (status == ui::TOUCH_STATUS_END)
touch_pressed_handler_ = NULL;
@@ -376,7 +379,7 @@ ui::TouchStatus RootView::OnTouchEvent(const TouchEvent& event) {
if (status != ui::TOUCH_STATUS_START)
touch_pressed_handler_ = NULL;
- if (gesture_manager_->ProcessTouchEventForGesture(e, this, status))
+ if (DoGestureProcessing(e, status))
status = ui::TOUCH_STATUS_SYNTH_MOUSE;
return status;
}
@@ -390,6 +393,42 @@ ui::TouchStatus RootView::OnTouchEvent(const TouchEvent& event) {
return status;
}
+ui::GestureStatus RootView::OnGestureEvent(const GestureEvent& event) {
+ GestureEvent e(event, this);
+ ui::GestureStatus status = ui::GESTURE_STATUS_UNKNOWN;
+
+ // Walk up the tree until we find a view that wants the gesture event.
+ for (gesture_handling_view_ = GetEventHandlerForPoint(e.location());
+ gesture_handling_view_ && (gesture_handling_view_ != this);
+ gesture_handling_view_ = gesture_handling_view_->parent()) {
+ if (!gesture_handling_view_->enabled()) {
+ // Disabled views eat events but are treated as not handled by the
+ // the GestureManager.
+ return ui::GESTURE_STATUS_UNKNOWN;
+ }
+
+ // See if this view wants to handle the Gesture.
+ GestureEvent gesture_event(e, this, gesture_handling_view_);
+ status = gesture_handling_view_->ProcessGestureEvent(gesture_event);
+
+ // The view could have removed itself from the tree when handling
+ // OnGestureEvent(). So handle as per OnMousePressed. NB: we
+ // assume that the RootView itself cannot be so removed.
+ if (!gesture_handling_view_) return ui::GESTURE_STATUS_UNKNOWN;
+
+ // The gesture event wasn't processed. Go up the view hierarchy and
+ // dispatch the gesture event.
+ if (status == ui::GESTURE_STATUS_UNKNOWN) {
+ continue;
+ } else if (status == ui::GESTURE_STATUS_CONSUMED) {
+ return status;
+ } else {
+ return ui::GESTURE_STATUS_UNKNOWN;
+ }
+ }
+ return status;
+}
+
void RootView::SetMouseHandler(View *new_mh) {
// If we're clearing the mouse handler, clear explicit_mouse_handler_ as well.
explicit_mouse_handler_ = (new_mh != NULL);
@@ -418,6 +457,8 @@ void RootView::ViewHierarchyChanged(bool is_add, View* parent, View* child) {
mouse_move_handler_ = NULL;
if (touch_pressed_handler_ == child)
touch_pressed_handler_ = NULL;
+ if (gesture_handling_view_ == child)
+ gesture_handling_view_ = NULL;
}
}
@@ -457,5 +498,35 @@ void RootView::SetMouseLocationAndFlags(const MouseEvent& event) {
last_mouse_event_y_ = event.y();
}
+bool RootView::DoGestureProcessing(const TouchEvent& event,
+ ui::TouchStatus status) {
+ if (status != ui::TOUCH_STATUS_UNKNOWN)
+ return false; // The event was consumed by a touch sequence.
+
+ // Get the GestureEvent list processed from GestureRecognizer.
+ scoped_ptr<GestureRecognizer::Gestures> gestures;
+ gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture(event,
+ status));
+ bool synthetic = true;
+ for (unsigned int i = 0; i < gestures->size(); i++) {
+ GestureEvent* event = gestures->at(i).get();
+ GestureEvent e(*event, this);
+ if (OnGestureEvent(e) == ui::GESTURE_STATUS_CONSUMED) {
+ // All gesture events should be consumed.
+ synthetic = false;
+ } else {
+ synthetic = true;
+ break;
+ }
+ }
+ if (synthetic) {
+ // TODO(Gajen): This should be removed in future once all views are capable
+ // of handling OnGestureEvent.
+ return gesture_manager_->ProcessTouchEventForGesture(event, this,
+ status);
+ }
+ return synthetic;
+}
+
} // namespace internal
} // namespace views
diff --git a/ui/views/widget/root_view.h b/ui/views/widget/root_view.h
index 3f372e6..2539676 100644
--- a/ui/views/widget/root_view.h
+++ b/ui/views/widget/root_view.h
@@ -21,6 +21,7 @@ namespace views {
class Widget;
class GestureManager;
+class GestureRecognizer;
// This is a views-internal API and should not be used externally.
// Widget exposes this object as a View*.
@@ -71,6 +72,9 @@ class VIEWS_EXPORT RootView : public View, public FocusTraversable {
// Provided only for testing:
void SetGestureManagerForTesting(GestureManager* g) { gesture_manager_ = g; }
+ void SetGestureRecognizerForTesting(GestureRecognizer* gr) {
+ gesture_recognizer_ = gr;
+ }
// Focus ---------------------------------------------------------------------
@@ -110,6 +114,7 @@ class VIEWS_EXPORT RootView : public View, public FocusTraversable {
virtual void OnMouseExited(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseWheel(const MouseWheelEvent& event) OVERRIDE;
virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) OVERRIDE;
+ virtual ui::GestureStatus OnGestureEvent(const GestureEvent& event) OVERRIDE;
virtual void SetMouseHandler(View* new_mouse_handler) OVERRIDE;
virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
virtual void ReorderChildLayers(ui::Layer* parent_layer) OVERRIDE;
@@ -145,6 +150,10 @@ class VIEWS_EXPORT RootView : public View, public FocusTraversable {
// be applied to the point prior to calling this).
void SetMouseLocationAndFlags(const MouseEvent& event);
+ // Feeds touch event to GestureRecognizer.
+ // Returns true if the event resulted in firing a synthetic event.
+ bool DoGestureProcessing(const TouchEvent& event, ui::TouchStatus status);
+
//////////////////////////////////////////////////////////////////////////////
// Tree operations -----------------------------------------------------------
@@ -179,6 +188,12 @@ class VIEWS_EXPORT RootView : public View, public FocusTraversable {
// The view currently handling touch events.
View* touch_pressed_handler_;
+ // The gesture_recognizer_ for this.
+ GestureRecognizer* gesture_recognizer_;
+
+ // The view currently handling gesture events.
+ View* gesture_handling_view_;
+
// Focus ---------------------------------------------------------------------
// The focus search algorithm.
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index 73c2bd0..b9be13b4 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -1074,7 +1074,12 @@ void Widget::OnMouseCaptureLost() {
ui::TouchStatus Widget::OnTouchEvent(const TouchEvent& event) {
ScopedEvent scoped(this, event);
- return static_cast<internal::RootView*>(GetRootView())->OnTouchEvent(event);
+ return GetRootView()->OnTouchEvent(event);
+}
+
+ui::GestureStatus Widget::OnGestureEvent(const GestureEvent& event) {
+ ScopedEvent scoped(this, event);
+ return GetRootView()->OnGestureEvent(event);
}
bool Widget::ExecuteCommand(int command_id) {
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h
index f00d6b7..f1b2d41 100644
--- a/ui/views/widget/widget.h
+++ b/ui/views/widget/widget.h
@@ -619,6 +619,7 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
virtual bool OnMouseEvent(const MouseEvent& event) OVERRIDE;
virtual void OnMouseCaptureLost() OVERRIDE;
virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) OVERRIDE;
+ virtual ui::GestureStatus OnGestureEvent(const GestureEvent& event) OVERRIDE;
virtual bool ExecuteCommand(int command_id) OVERRIDE;
virtual InputMethod* GetInputMethodDirect() OVERRIDE;
virtual Widget* AsWidget() OVERRIDE;