overview_gesture_handler.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ash/wm/gestures/overview_gesture_handler.h" 6 7#include "ash/shell.h" 8#include "ash/shell_delegate.h" 9#include "ash/wm/overview/window_selector_controller.h" 10#include "ui/events/event.h" 11#include "ui/events/event_constants.h" 12#include "ui/gfx/rect.h" 13#include "ui/gfx/screen.h" 14 15namespace ash { 16namespace internal { 17 18namespace { 19 20// The number of pixels from the top of the screen (a virtual bezel) to allow 21// the overview swipe down gesture to begin within. Note this does not actually 22// prevent handling of the touches so a fullscreen page which consumes these can 23// prevent entering overview with a swipe down. 24const int kTopBezelExtraPixels = 5; 25 26// The threshold before engaging overview on a three finger swipe on the 27// touchpad. 28const float kSwipeThresholdPixels = 300; 29 30} // namespace; 31 32OverviewGestureHandler::OverviewGestureHandler() 33 : in_top_bezel_gesture_(false), 34 scroll_x_(0), 35 scroll_y_(0) { 36} 37 38OverviewGestureHandler::~OverviewGestureHandler() { 39} 40 41bool OverviewGestureHandler::ProcessScrollEvent(const ui::ScrollEvent& event) { 42 if (event.type() == ui::ET_SCROLL_FLING_START || 43 event.type() == ui::ET_SCROLL_FLING_CANCEL || 44 event.finger_count() != 3) { 45 scroll_x_ = scroll_y_ = 0; 46 return false; 47 } 48 49 scroll_x_ += event.x_offset(); 50 scroll_y_ += event.y_offset(); 51 52 // Horizontal swiping is ignored. 53 if (std::fabs(scroll_x_) >= std::fabs(scroll_y_)) { 54 scroll_x_ = scroll_y_ = 0; 55 return false; 56 } 57 58 // Only allow swipe up to enter overview, down to exit. Ignore extra swiping 59 // in the wrong direction. 60 Shell* shell = Shell::GetInstance(); 61 if (shell->window_selector_controller()->IsSelecting()) { 62 if (scroll_y_ < 0) 63 scroll_x_ = scroll_y_ = 0; 64 if (scroll_y_ < kSwipeThresholdPixels) 65 return false; 66 } else { 67 if (scroll_y_ > 0) 68 scroll_x_ = scroll_y_ = 0; 69 if (scroll_y_ > -kSwipeThresholdPixels) 70 return false; 71 } 72 73 // Reset scroll amount on toggling. 74 scroll_x_ = scroll_y_ = 0; 75 shell->delegate()->RecordUserMetricsAction(UMA_TOUCHPAD_GESTURE_OVERVIEW); 76 shell->window_selector_controller()->ToggleOverview(); 77 return true; 78} 79 80bool OverviewGestureHandler::ProcessGestureEvent( 81 const ui::GestureEvent& event) { 82 // Detect at the beginning of any gesture whether it begins on the top bezel. 83 if (event.type() == ui::ET_GESTURE_BEGIN && 84 event.details().touch_points() == 1) { 85 in_top_bezel_gesture_ = !Shell::GetScreen()->GetDisplayNearestPoint( 86 event.location()).bounds().y() + kTopBezelExtraPixels > 87 event.location().y(); 88 return false; 89 } 90 91 if (!in_top_bezel_gesture_ || 92 event.type() != ui::ET_GESTURE_MULTIFINGER_SWIPE || 93 !event.details().swipe_down() || 94 event.details().touch_points() != 3) { 95 return false; 96 } 97 98 Shell* shell = Shell::GetInstance(); 99 shell->delegate()->RecordUserMetricsAction(UMA_GESTURE_OVERVIEW); 100 shell->window_selector_controller()->ToggleOverview(); 101 return true; 102} 103 104} // namespace internal 105} // namespace ash 106