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

Unified Diff: views/widget/root_view.cc

Issue 3192002: Added entry points to view/View to dispatch and process TouchEvents. (Closed) Base URL: git://codf21.jail.google.com/chromium.git
Patch Set: final changes Created 10 years, 3 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 | « views/widget/root_view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/widget/root_view.cc
diff --git a/views/widget/root_view.cc b/views/widget/root_view.cc
index 20464cc9f8742712926d8d7a6b8269e93a797a1c..8b8f8963c439e40e39ba5891a6dc2e3a87172efc 100644
--- a/views/widget/root_view.cc
+++ b/views/widget/root_view.cc
@@ -16,6 +16,10 @@
#include "views/widget/widget.h"
#include "views/window/window.h"
+#if defined(TOUCH_UI)
+#include "views/touchui/gesture_manager.h"
+#endif
+
#if defined(OS_LINUX)
#include "views/widget/widget_gtk.h"
#endif // defined(OS_LINUX)
@@ -76,6 +80,11 @@ RootView::RootView(Widget* widget)
focus_traversable_parent_(NULL),
focus_traversable_parent_view_(NULL),
drag_view_(NULL)
+#if defined(TOUCH_UI)
+ ,
+ gesture_manager_(GestureManager::Get()),
+ touch_pressed_handler_(NULL)
+#endif
#ifndef NDEBUG
,
is_processing_paint_(false)
@@ -289,6 +298,62 @@ void RootView::SetFocusOnMousePressed(bool f) {
focus_on_mouse_pressed_ = f;
}
+#if defined(TOUCH_UI)
+bool RootView::OnTouchEvent(const TouchEvent& e) {
+ // If touch_pressed_handler_ is non null, we are currently processing
+ // a touch down on the screen situation. In that case we send the
+ // event to touch_pressed_handler_
+
+ if (touch_pressed_handler_) {
+ TouchEvent touch_event(e, this, touch_pressed_handler_);
+ touch_pressed_handler_->ProcessTouchEvent(touch_event);
+ gesture_manager_->ProcessTouchEventForGesture(e, this, true);
+ return true;
+ }
+
+ bool handled = false;
+ // Walk up the tree until we find a view that wants the touch event.
+ for (touch_pressed_handler_ = GetViewForPoint(e.location());
+ touch_pressed_handler_ && (touch_pressed_handler_ != this);
+ touch_pressed_handler_ = touch_pressed_handler_->GetParent()) {
+ if (!touch_pressed_handler_->IsEnabled()) {
+ // Disabled views eat events but are treated as not handled by the
+ // the GestureManager.
+ handled = false;
+ break;
+ }
+
+ // See if this view wants to handle the touch
+ TouchEvent touch_event(e, this, touch_pressed_handler_);
+ handled = touch_pressed_handler_->ProcessTouchEvent(touch_event);
+
+ // The view could have removed itself from the tree when handling
+ // OnTouchEvent(). So handle as per OnMousePressed. NB: we
+ // assume that the RootView itself cannot be so removed.
+ //
+ // NOTE: Don't return true here, because we don't want the frame to
+ // forward future events to us when there's no handler.
+ if (!touch_pressed_handler_)
+ break;
+
+ // If the view handled the event, leave touch_pressed_handler_ set and
+ // return true, which will cause subsequent drag/release events to get
+ // forwarded to that view.
+ if (handled) {
+ gesture_manager_->ProcessTouchEventForGesture(e, this, handled);
+ return true;
+ }
+ }
+
+ // Reset touch_pressed_handler_ to indicate that no processing is occurring.
+ touch_pressed_handler_ = NULL;
+
+ // Give the touch event to the gesture manager.
+ gesture_manager_->ProcessTouchEventForGesture(e, this, handled);
+ return handled;
+}
+#endif
+
bool RootView::OnMousePressed(const MouseEvent& e) {
// This function does not normally handle non-client messages except for
// non-client double-clicks. Actually, all double-clicks are special as the
« no previous file with comments | « views/widget/root_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698