Home | History | Annotate | Download | only in input
      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.
      4 
      5 #include "content/browser/renderer_host/input/input_router_config_helper.h"
      6 
      7 #include "base/command_line.h"
      8 #include "content/public/common/content_switches.h"
      9 #include "ui/events/gesture_detection/gesture_detector.h"
     10 
     11 #if defined(USE_AURA)
     12 #include "ui/events/gestures/gesture_configuration.h"
     13 #elif defined(OS_ANDROID)
     14 #include "ui/gfx/android/view_configuration.h"
     15 #include "ui/gfx/screen.h"
     16 #endif
     17 
     18 namespace content {
     19 namespace {
     20 
     21 #if defined(USE_AURA)
     22 
     23 GestureEventQueue::Config GetGestureEventQueueConfig() {
     24   GestureEventQueue::Config config;
     25 
     26   config.debounce_interval = base::TimeDelta::FromMilliseconds(
     27       ui::GestureConfiguration::scroll_debounce_interval_in_ms());
     28 
     29   config.touchscreen_tap_suppression_config.enabled = true;
     30   config.touchscreen_tap_suppression_config.max_cancel_to_down_time =
     31       base::TimeDelta::FromMilliseconds(
     32           ui::GestureConfiguration::fling_max_cancel_to_down_time_in_ms());
     33 
     34   config.touchscreen_tap_suppression_config.max_tap_gap_time =
     35       base::TimeDelta::FromMilliseconds(static_cast<int>(
     36           ui::GestureConfiguration::semi_long_press_time_in_seconds() * 1000));
     37 
     38   config.touchpad_tap_suppression_config.enabled = true;
     39   config.touchpad_tap_suppression_config.max_cancel_to_down_time =
     40       base::TimeDelta::FromMilliseconds(
     41           ui::GestureConfiguration::fling_max_cancel_to_down_time_in_ms());
     42 
     43   config.touchpad_tap_suppression_config.max_tap_gap_time =
     44       base::TimeDelta::FromMilliseconds(static_cast<int>(
     45           ui::GestureConfiguration::fling_max_tap_gap_time_in_ms() * 1000));
     46 
     47   return config;
     48 }
     49 
     50 TouchEventQueue::Config GetTouchEventQueueConfig() {
     51   TouchEventQueue::Config config;
     52 
     53   config.touchmove_slop_suppression_length_dips =
     54       ui::GestureConfiguration::max_touch_move_in_pixels_for_click();
     55 
     56   return config;
     57 }
     58 
     59 #elif defined(OS_ANDROID)
     60 
     61 // Default time allowance for the touch ack delay before the touch sequence is
     62 // cancelled.
     63 const int kTouchAckTimeoutDelayMs = 200;
     64 
     65 GestureEventQueue::Config GetGestureEventQueueConfig() {
     66   GestureEventQueue::Config config;
     67 
     68   config.touchscreen_tap_suppression_config.enabled = true;
     69   config.touchscreen_tap_suppression_config.max_cancel_to_down_time =
     70       base::TimeDelta::FromMilliseconds(
     71           gfx::ViewConfiguration::GetTapTimeoutInMs());
     72   config.touchscreen_tap_suppression_config.max_tap_gap_time =
     73       base::TimeDelta::FromMilliseconds(
     74           gfx::ViewConfiguration::GetLongPressTimeoutInMs());
     75 
     76   return config;
     77 }
     78 
     79 TouchEventQueue::Config GetTouchEventQueueConfig() {
     80   TouchEventQueue::Config config;
     81 
     82   config.touch_ack_timeout_delay =
     83       base::TimeDelta::FromMilliseconds(kTouchAckTimeoutDelayMs);
     84   config.touch_ack_timeout_supported = true;
     85 
     86   const double touch_slop_length_pixels =
     87       static_cast<double>(gfx::ViewConfiguration::GetTouchSlopInPixels());
     88   const double device_scale_factor =
     89       gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().device_scale_factor();
     90   config.touchmove_slop_suppression_length_dips =
     91       touch_slop_length_pixels / device_scale_factor;
     92 
     93   return config;
     94 }
     95 
     96 #else
     97 
     98 GestureEventQueue::Config GetGestureEventQueueConfig() {
     99   return GestureEventQueue::Config();
    100 }
    101 
    102 TouchEventQueue::Config GetTouchEventQueueConfig() {
    103   TouchEventQueue::Config config;
    104   config.touchmove_slop_suppression_length_dips =
    105       ui::GestureDetector::Config().touch_slop;
    106   return config;
    107 }
    108 
    109 #endif
    110 
    111 TouchEventQueue::TouchScrollingMode GetTouchScrollingMode() {
    112   std::string modeString =
    113       base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
    114           switches::kTouchScrollingMode);
    115   if (modeString == switches::kTouchScrollingModeAsyncTouchmove)
    116     return TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE;
    117   if (modeString == switches::kTouchScrollingModeSyncTouchmove)
    118     return TouchEventQueue::TOUCH_SCROLLING_MODE_SYNC_TOUCHMOVE;
    119   if (modeString == switches::kTouchScrollingModeTouchcancel)
    120     return TouchEventQueue::TOUCH_SCROLLING_MODE_TOUCHCANCEL;
    121   if (modeString != "")
    122     LOG(ERROR) << "Invalid --touch-scrolling-mode option: " << modeString;
    123   return TouchEventQueue::TOUCH_SCROLLING_MODE_DEFAULT;
    124 }
    125 
    126 }  // namespace
    127 
    128 InputRouterImpl::Config GetInputRouterConfigForPlatform() {
    129   InputRouterImpl::Config config;
    130   config.gesture_config = GetGestureEventQueueConfig();
    131   config.touch_config = GetTouchEventQueueConfig();
    132   config.touch_config.touch_scrolling_mode = GetTouchScrollingMode();
    133   return config;
    134 }
    135 
    136 }  // namespace content
    137