1 // Copyright 2014 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.
5 #include "ash/wm/workspace/two_step_edge_cycler.h"
12 // We cycle to the second mode if any of the following happens while the mouse
13 // is on the edge of the workspace:
14 // . The user stops moving the mouse for |kMaxDelay| and then moves the mouse
15 // again in the preferred direction from the last paused location for at least
16 // |kMaxPixelsAfterPause| horizontal pixels.
17 // . The mouse moves |kMaxPixels| horizontal pixels in the preferred direction.
18 // . The mouse is moved |kMaxMoves| times since the last pause.
19 const int kMaxDelay
= 400;
20 const int kMaxPixels
= 100;
21 const int kMaxPixelsAfterPause
= 10;
22 const int kMaxMoves
= 25;
26 TwoStepEdgeCycler::TwoStepEdgeCycler(const gfx::Point
& start
,
27 TwoStepEdgeCycler::Direction direction
)
28 : second_mode_(false),
29 time_last_move_(base::TimeTicks::Now()),
34 direction_(direction
) {
37 TwoStepEdgeCycler::~TwoStepEdgeCycler() {
40 void TwoStepEdgeCycler::OnMove(const gfx::Point
& location
) {
44 if ((base::TimeTicks::Now() - time_last_move_
).InMilliseconds() > kMaxDelay
) {
46 paused_x_
= location
.x();
49 time_last_move_
= base::TimeTicks::Now();
51 int compare_x
= paused_
? paused_x_
: start_x_
;
52 if (location
.x() != compare_x
&&
53 (location
.x() < compare_x
) != (direction_
== DIRECTION_LEFT
)) {
58 bool moved_in_the_same_direction_after_pause
=
59 paused_
&& std::abs(location
.x() - paused_x_
) >= kMaxPixelsAfterPause
;
60 second_mode_
= moved_in_the_same_direction_after_pause
||
61 std::abs(location
.x() - start_x_
) >= kMaxPixels
||
62 num_moves_
>= kMaxMoves
;