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

Unified Diff: athena/wm/bezel_controller.cc

Issue 694883002: Do not allow split view to be engaged by a bezel gesture (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 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 | « athena/wm/bezel_controller.h ('k') | athena/wm/split_view_controller.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: athena/wm/bezel_controller.cc
diff --git a/athena/wm/bezel_controller.cc b/athena/wm/bezel_controller.cc
deleted file mode 100644
index 6924aa603957faa6c09563beb0d0ae0c53dde850..0000000000000000000000000000000000000000
--- a/athena/wm/bezel_controller.cc
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2014 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 "athena/wm/bezel_controller.h"
-
-#include "ui/aura/window.h"
-#include "ui/events/event_handler.h"
-#include "ui/gfx/display.h"
-#include "ui/gfx/geometry/point_conversions.h"
-#include "ui/gfx/screen.h"
-#include "ui/wm/core/coordinate_conversion.h"
-
-namespace athena {
-namespace {
-
-// Using bezel swipes, the first touch that is registered is usually within
-// 5-10 pixels from the edge, but sometimes as far as 29 pixels away.
-// So setting this width fairly high for now.
-const float kBezelWidth = 20.0f;
-
-const float kScrollDeltaNone = 0;
-
-bool ShouldProcessGesture(ui::EventType event_type) {
- return event_type == ui::ET_GESTURE_SCROLL_UPDATE ||
- event_type == ui::ET_GESTURE_SCROLL_BEGIN ||
- event_type == ui::ET_GESTURE_BEGIN ||
- event_type == ui::ET_GESTURE_END;
-}
-
-gfx::Display GetDisplay(aura::Window* window) {
- gfx::Screen* screen = gfx::Screen::GetScreenFor(window);
- return screen->GetDisplayNearestWindow(window);
-}
-
-float GetDistance(const gfx::PointF& location,
- aura::Window* window,
- BezelController::Bezel bezel) {
- DCHECK(bezel == BezelController::BEZEL_LEFT ||
- bezel == BezelController::BEZEL_RIGHT);
- // Convert location from window coordinates to screen coordinates.
- gfx::Point point_in_screen(gfx::ToRoundedPoint(location));
- wm::ConvertPointToScreen(window, &point_in_screen);
- return bezel == BezelController::BEZEL_LEFT
- ? point_in_screen.x()
- : point_in_screen.x() - GetDisplay(window).bounds().width();
-}
-
-// Returns the bezel corresponding to the |location| in |window| or BEZEL_NONE
-// if the location is outside of the bezel area.
-// Only implemented for LEFT and RIGHT bezels.
-BezelController::Bezel GetBezel(const gfx::PointF& location,
- aura::Window* window) {
- int screen_width = GetDisplay(window).bounds().width();
- gfx::Point point_in_screen(gfx::ToRoundedPoint(location));
- wm::ConvertPointToScreen(window, &point_in_screen);
- if (point_in_screen.x() < kBezelWidth)
- return BezelController::BEZEL_LEFT;
- if (point_in_screen.x() > screen_width - kBezelWidth)
- return BezelController::BEZEL_RIGHT;
- return BezelController::BEZEL_NONE;
-}
-
-} // namespace
-
-BezelController::BezelController(aura::Window* container)
- : container_(container),
- state_(NONE),
- scroll_bezel_(BEZEL_NONE),
- scroll_target_(nullptr),
- left_right_delegate_(nullptr) {
-}
-
-void BezelController::SetState(BezelController::State state) {
- // Use SetState(State, float) if |state| is one of the BEZEL_SCROLLING states.
- DCHECK_NE(state, BEZEL_SCROLLING_TWO_FINGERS);
- DCHECK_NE(state, BEZEL_SCROLLING_ONE_FINGER);
- SetState(state, kScrollDeltaNone);
-}
-
-void BezelController::SetState(BezelController::State state,
- float scroll_delta) {
- if (!left_right_delegate_ || state == state_)
- return;
-
- State old_state = state_;
- state_ = state;
-
- if (state == NONE) {
- scroll_bezel_ = BEZEL_NONE;
- scroll_target_ = nullptr;
- }
-
- if (state == BEZEL_SCROLLING_TWO_FINGERS) {
- left_right_delegate_->BezelScrollBegin(scroll_bezel_, scroll_delta);
- } else if (old_state == BEZEL_SCROLLING_TWO_FINGERS) {
- // If BezelScrollEnd() hides |scroll_target_|, ET_GESTURE_END is dispatched
- // and we get a reentrant call to SetState().
- left_right_delegate_->BezelScrollEnd(0.0f);
- }
-}
-
-void BezelController::OnGestureEvent(ui::GestureEvent* event) {
- // TODO(mfomitchev): Currently we aren't retargetting or consuming any of the
- // touch events. This means that content can prevent the generation of gesture
- // events and two-finger scroll won't work. Possible solution to this problem
- // is hosting our own gesture recognizer or retargetting touch events at the
- // bezel.
-
- if (!left_right_delegate_)
- return;
-
- ui::EventType type = event->type();
- if (!ShouldProcessGesture(type))
- return;
-
- const ui::GestureEventDetails& event_details = event->details();
- int num_touch_points = event_details.touch_points();
- if (num_touch_points == 1 && type == ui::ET_GESTURE_BEGIN) {
- // Reset the state when the first finger touches and starts a gesture.
- // Normally, the state gets reset when the last finger is lifted and we
- // receive ET_GESTURE_END. However ET_GESTURE_END doesn't always get
- // dispatched. (E.g. if the gesture target was hidden or deleted).
- // Since we can't rely on receiving ET_GESTURE_END when the last finger is
- // lifted, we also reset the state on ET_GESTURE_BEGIN when the first
- // finger touches the screen.
- SetState(NONE);
- }
-
- if (scroll_target_ && event->target() != scroll_target_)
- return;
-
- const gfx::PointF& event_location = event->location_f();
- float scroll_delta = kScrollDeltaNone;
- aura::Window* target_window = static_cast<aura::Window*>(event->target());
- if (scroll_bezel_ != BEZEL_NONE)
- scroll_delta = GetDistance(event_location, target_window, scroll_bezel_);
-
- if (type == ui::ET_GESTURE_BEGIN) {
- if (num_touch_points > 2) {
- SetState(IGNORE_CURRENT_SCROLL);
- return;
- }
- BezelController::Bezel event_bezel =
- GetBezel(event->location_f(), target_window);
- switch (state_) {
- case NONE:
- scroll_bezel_ = event_bezel;
- scroll_target_ = event->target();
- if (event_bezel != BEZEL_LEFT && event_bezel != BEZEL_RIGHT)
- SetState(IGNORE_CURRENT_SCROLL);
- else
- SetState(BEZEL_GESTURE_STARTED);
- break;
- case IGNORE_CURRENT_SCROLL:
- break;
- case BEZEL_GESTURE_STARTED:
- case BEZEL_SCROLLING_ONE_FINGER:
- DCHECK_EQ(num_touch_points, 2);
- DCHECK(scroll_target_);
- DCHECK_NE(scroll_bezel_, BEZEL_NONE);
-
- if (event_bezel != scroll_bezel_) {
- SetState(IGNORE_CURRENT_SCROLL);
- return;
- }
- if (state_ == BEZEL_SCROLLING_ONE_FINGER)
- SetState(BEZEL_SCROLLING_TWO_FINGERS);
- break;
- case BEZEL_SCROLLING_TWO_FINGERS:
- // Should've exited above
- NOTREACHED();
- break;
- }
- } else if (type == ui::ET_GESTURE_END) {
- if (state_ == NONE)
- return;
-
- CHECK(scroll_target_);
- if (num_touch_points == 1) {
- SetState(NONE);
- } else {
- SetState(IGNORE_CURRENT_SCROLL);
- }
- } else if (type == ui::ET_GESTURE_SCROLL_BEGIN) {
- DCHECK(state_ == IGNORE_CURRENT_SCROLL || state_ == BEZEL_GESTURE_STARTED);
- if (state_ != BEZEL_GESTURE_STARTED)
- return;
-
- if (num_touch_points == 1) {
- SetState(BEZEL_SCROLLING_ONE_FINGER, scroll_delta);
- return;
- }
-
- DCHECK_EQ(num_touch_points, 2);
- SetState(BEZEL_SCROLLING_TWO_FINGERS, scroll_delta);
- if (left_right_delegate_->BezelCanScroll())
- event->SetHandled();
- } else if (type == ui::ET_GESTURE_SCROLL_UPDATE) {
- if (state_ != BEZEL_SCROLLING_TWO_FINGERS)
- return;
-
- left_right_delegate_->BezelScrollUpdate(scroll_delta);
- if (left_right_delegate_->BezelCanScroll())
- event->SetHandled();
- }
-}
-
-} // namespace athena
« no previous file with comments | « athena/wm/bezel_controller.h ('k') | athena/wm/split_view_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698