summaryrefslogtreecommitdiffstats
path: root/content/renderer/webscrollbarbehavior_impl_gtkoraura.cc
blob: e9d77bb3f50c81192d3d75e843ca5525c3c4fbb5 (plain)
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
// 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 "content/renderer/webscrollbarbehavior_impl_gtkoraura.h"

#include "third_party/WebKit/public/platform/WebPoint.h"
#include "third_party/WebKit/public/platform/WebRect.h"

namespace content {

bool WebScrollbarBehaviorImpl::shouldCenterOnThumb(
      blink::WebScrollbarBehavior::Button mouseButton,
      bool shiftKeyPressed,
      bool altKeyPressed) {
#if (defined(OS_LINUX) && !defined(OS_CHROMEOS))
  if (mouseButton == blink::WebScrollbarBehavior::ButtonMiddle)
    return true;
#endif
  return (mouseButton == blink::WebScrollbarBehavior::ButtonLeft) &&
      shiftKeyPressed;
}

bool WebScrollbarBehaviorImpl::shouldSnapBackToDragOrigin(
    const blink::WebPoint& eventPoint,
    const blink::WebRect& scrollbarRect,
    bool isHorizontal) {
  // Constants used to figure the drag rect outside which we should snap the
  // scrollbar thumb back to its origin. These calculations are based on
  // observing the behavior of the MSVC8 main window scrollbar + some
  // guessing/extrapolation.
  static const int kOffEndMultiplier = 3;
  static const int kOffSideMultiplier = 8;

  // Find the rect within which we shouldn't snap, by expanding the track rect
  // in both dimensions.
  gfx::Rect noSnapRect(scrollbarRect);
  const int thickness = isHorizontal ? noSnapRect.height() : noSnapRect.width();
  noSnapRect.Inset(
      (isHorizontal ? kOffEndMultiplier : kOffSideMultiplier) * -thickness,
      (isHorizontal ? kOffSideMultiplier : kOffEndMultiplier) * -thickness);

  // We should snap iff the event is outside our calculated rect.
  return !noSnapRect.Contains(eventPoint);
}

}  // namespace content