1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94

ash / wm / gestures / wm_gesture_handler.h [blame]

// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_WM_GESTURES_WM_GESTURE_HANDLER_H_
#define ASH_WM_GESTURES_WM_GESTURE_HANDLER_H_

#include <optional>

#include "ash/ash_export.h"
#include "components/prefs/pref_registry_simple.h"

namespace ui {
class ScrollEvent;
}

namespace ash {

// This handles the following interactions:
//   - 3-finger touchpad scroll events to enter/exit overview mode and move the
//   overview focus ring if it is visible.
//   - 4-finger horizontal scrolls to switch desks.
class ASH_EXPORT WmGestureHandler {
 public:
  // The thresholds of performing a wm action with a touchpad three or four
  // finger scroll.
  static constexpr float kVerticalThresholdDp = 300.f;
  static constexpr float kHorizontalThresholdDp = 330.f;

  // The amount in trackpad units the fingers must move in a direction before a
  // continuous gesture animation is started. This is to minimize accidental
  // scrolls.
  static constexpr int kContinuousGestureMoveThresholdDp = 5;

  // The amount that a user must have scrolled, after ending a vertical
  // continuous gesture, to enter overview mode. Otherwise, animate back to
  // the original state before the gesture began.
  static constexpr int kEnterOverviewModeThresholdDp = kVerticalThresholdDp / 2;

  WmGestureHandler();
  WmGestureHandler(const WmGestureHandler&) = delete;
  WmGestureHandler& operator=(const WmGestureHandler&) = delete;
  virtual ~WmGestureHandler();

  // Processes a scroll event and may switch desks, start overview or move the
  // overview focus ring. Returns true if the event has been handled and should
  // not be processed further, false otherwise.
  bool ProcessScrollEvent(const ui::ScrollEvent& event);

 private:
  // A struct containing the relevant data during a scroll session.
  struct ScrollData {
    int finger_count = 0;

    // Values are cumulative (ex. |scroll_x| is the total x distance moved
    // since the scroll began.
    float scroll_x = 0.f;
    float scroll_y = 0.f;

    // Continuous gestures need to first pass a threshold before we update the
    // UI. We still update this struct before that happens.
    bool horizontal_continuous_gesture_started = false;
    bool vertical_continuous_gesture_started = false;
  };

  // Called by ProcessScrollEvent(). Depending on |finger_count|, may switch
  // desks, start overview or move the overview highlight. Returns true if the
  // event has been handled and should not be processed further, false
  // otherwise. Forwards events to DesksController.
  bool ProcessEventImpl(int finger_count, float delta_x, float delta_y);

  // Called when a scroll is ended. Returns true if the scroll is processed.
  bool EndScroll();

  // Called when a scroll is updated. Returns true if the scroll is processed.
  bool UpdateScrollForContinuousOverviewAnimation();

  // Tries to move the overview selector. Returns true if successful. Called in
  // the middle of scrolls and when scrolls have ended.
  bool MoveOverviewSelection(int finger_count, float scroll_x, float scroll_y);

  // Returns whether or not a given session of overview should horizontally
  // scroll.
  bool ShouldHorizontallyScroll(bool in_session,
                                float scroll_x,
                                float scroll_y);

  // Contains the data during a scroll session. Empty is no scroll is underway.
  std::optional<ScrollData> scroll_data_;
};

}  // namespace ash

#endif  // ASH_WM_GESTURES_WM_GESTURE_HANDLER_H_