Commit 6a660e67 authored by rjkroege@chromium.org's avatar rjkroege@chromium.org

Bound the maximum touchscreen fling velocity.

Set a configurable cap on the maximum touchscreen fling velocity.

BUG=141653


Review URL: https://chromiumcodereview.appspot.com/11299276

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@170761 0039d316-1c4b-4281-b951-d872f2087c98
parent d33f8bb6
...@@ -244,6 +244,11 @@ function GestureConfig() { ...@@ -244,6 +244,11 @@ function GestureConfig() {
key: 'fling_acceleration_curve_coefficient_3', key: 'fling_acceleration_curve_coefficient_3',
label: '+', label: '+',
units: 'x<sup>0</sup>' units: 'x<sup>0</sup>'
},
{
key: 'fling_velocity_cap',
label: 'Touchscreen Fling Velocity Cap',
units: 'pixels / second'
} }
]; ];
......
...@@ -78,6 +78,7 @@ const char* kPrefsToObserve[] = { ...@@ -78,6 +78,7 @@ const char* kPrefsToObserve[] = {
prefs::kFlingAccelerationCurveCoefficient1, prefs::kFlingAccelerationCurveCoefficient1,
prefs::kFlingAccelerationCurveCoefficient2, prefs::kFlingAccelerationCurveCoefficient2,
prefs::kFlingAccelerationCurveCoefficient3, prefs::kFlingAccelerationCurveCoefficient3,
prefs::kFlingVelocityCap,
prefs::kLongPressTimeInSeconds, prefs::kLongPressTimeInSeconds,
prefs::kMaxDistanceForTwoFingerTapInPixels, prefs::kMaxDistanceForTwoFingerTapInPixels,
prefs::kMaxSecondsBetweenDoubleClick, prefs::kMaxSecondsBetweenDoubleClick,
...@@ -136,6 +137,8 @@ void GesturePrefsObserver::Update() { ...@@ -136,6 +137,8 @@ void GesturePrefsObserver::Update() {
prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient2)); prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient2));
GestureConfiguration::set_fling_acceleration_curve_coefficients(3, GestureConfiguration::set_fling_acceleration_curve_coefficients(3,
prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient3)); prefs_->GetDouble(prefs::kFlingAccelerationCurveCoefficient3));
GestureConfiguration::set_fling_velocity_cap(
prefs_->GetDouble(prefs::kFlingVelocityCap));
GestureConfiguration::set_long_press_time_in_seconds( GestureConfiguration::set_long_press_time_in_seconds(
prefs_->GetDouble( prefs_->GetDouble(
prefs::kLongPressTimeInSeconds)); prefs::kLongPressTimeInSeconds));
...@@ -255,6 +258,10 @@ void GesturePrefsObserverFactoryAura::RegisterUserPrefs(PrefService* prefs) { ...@@ -255,6 +258,10 @@ void GesturePrefsObserverFactoryAura::RegisterUserPrefs(PrefService* prefs) {
prefs::kFlingAccelerationCurveCoefficient3, prefs::kFlingAccelerationCurveCoefficient3,
GestureConfiguration::fling_acceleration_curve_coefficients(3), GestureConfiguration::fling_acceleration_curve_coefficients(3),
PrefService::UNSYNCABLE_PREF); PrefService::UNSYNCABLE_PREF);
prefs->RegisterDoublePref(
prefs::kFlingVelocityCap,
GestureConfiguration::fling_velocity_cap(),
PrefService::UNSYNCABLE_PREF);
prefs->RegisterDoublePref( prefs->RegisterDoublePref(
prefs::kLongPressTimeInSeconds, prefs::kLongPressTimeInSeconds,
GestureConfiguration::long_press_time_in_seconds(), GestureConfiguration::long_press_time_in_seconds(),
......
...@@ -2087,6 +2087,7 @@ const char kPinnedLauncherApps[] = ...@@ -2087,6 +2087,7 @@ const char kPinnedLauncherApps[] =
// Boolean value indicating whether to show a logout button in the ash tray. // Boolean value indicating whether to show a logout button in the ash tray.
const char kShowLogoutButtonInTray[] = "show_logout_button_in_tray"; const char kShowLogoutButtonInTray[] = "show_logout_button_in_tray";
const char kFlingVelocityCap[] = "gesture.fling_velocity_cap";
const char kLongPressTimeInSeconds[] = const char kLongPressTimeInSeconds[] =
"gesture.long_press_time_in_seconds"; "gesture.long_press_time_in_seconds";
const char kMaxDistanceBetweenTapsForDoubleTap[] = const char kMaxDistanceBetweenTapsForDoubleTap[] =
......
...@@ -761,6 +761,7 @@ extern const char kUseDefaultPinnedApps[]; ...@@ -761,6 +761,7 @@ extern const char kUseDefaultPinnedApps[];
extern const char kPinnedLauncherApps[]; extern const char kPinnedLauncherApps[];
extern const char kShowLogoutButtonInTray[]; extern const char kShowLogoutButtonInTray[];
extern const char kFlingVelocityCap[];
extern const char kLongPressTimeInSeconds[]; extern const char kLongPressTimeInSeconds[];
extern const char kMaxDistanceBetweenTapsForDoubleTap[]; extern const char kMaxDistanceBetweenTapsForDoubleTap[];
extern const char kMaxDistanceForTwoFingerTapInPixels[]; extern const char kMaxDistanceForTwoFingerTapInPixels[];
......
...@@ -54,6 +54,7 @@ void AuraTestBase::SetUp() { ...@@ -54,6 +54,7 @@ void AuraTestBase::SetUp() {
2, 0.0452381f); 2, 0.0452381f);
ui::GestureConfiguration::set_fling_acceleration_curve_coefficients( ui::GestureConfiguration::set_fling_acceleration_curve_coefficients(
3, 0.8f); 3, 0.8f);
ui::GestureConfiguration::set_fling_velocity_cap(15000.0f);
helper_.reset(new AuraTestHelper(&message_loop_)); helper_.reset(new AuraTestHelper(&message_loop_));
helper_->SetUp(); helper_->SetUp();
......
...@@ -6,12 +6,8 @@ ...@@ -6,12 +6,8 @@
namespace ui { namespace ui {
// Ordered alphabetically ignoring underscores, to align with the
// associated list of prefs in gesture_prefs_aura.cc.
// NOTE: When updating values here, also update
// browser/resources/gesture_config.js for chrome://gesture config UI.
// TODO(rbyers) unify these - crbug.com/156392
int GestureConfiguration::default_radius_ = 15; int GestureConfiguration::default_radius_ = 15;
float GestureConfiguration::fling_velocity_cap_ = 17000.0f;
double GestureConfiguration::long_press_time_in_seconds_ = 1.0; double GestureConfiguration::long_press_time_in_seconds_ = 1.0;
double GestureConfiguration::semi_long_press_time_in_seconds_ = 0.4; double GestureConfiguration::semi_long_press_time_in_seconds_ = 0.4;
double GestureConfiguration::max_distance_for_two_finger_tap_in_pixels_ = 300; double GestureConfiguration::max_distance_for_two_finger_tap_in_pixels_ = 300;
......
...@@ -149,6 +149,12 @@ class UI_EXPORT GestureConfiguration { ...@@ -149,6 +149,12 @@ class UI_EXPORT GestureConfiguration {
static float fling_acceleration_curve_coefficients(int i) { static float fling_acceleration_curve_coefficients(int i) {
return fling_acceleration_curve_coefficients_[i]; return fling_acceleration_curve_coefficients_[i];
} }
static float fling_velocity_cap() {
return fling_velocity_cap_;
}
static void set_fling_velocity_cap(float val) {
fling_velocity_cap_ = val;
}
private: private:
// These are listed in alphabetical order ignoring underscores, to // These are listed in alphabetical order ignoring underscores, to
...@@ -187,6 +193,7 @@ class UI_EXPORT GestureConfiguration { ...@@ -187,6 +193,7 @@ class UI_EXPORT GestureConfiguration {
static double rail_break_proportion_; static double rail_break_proportion_;
static double rail_start_proportion_; static double rail_start_proportion_;
static float fling_acceleration_curve_coefficients_[NumAccelParams]; static float fling_acceleration_curve_coefficients_[NumAccelParams];
static float fling_velocity_cap_;
DISALLOW_COPY_AND_ASSIGN(GestureConfiguration); DISALLOW_COPY_AND_ASSIGN(GestureConfiguration);
}; };
......
...@@ -296,7 +296,10 @@ float CalibrateFlingVelocity(float velocity) { ...@@ -296,7 +296,10 @@ float CalibrateFlingVelocity(float velocity) {
nu += x * a; nu += x * a;
x *= normalized_velocity; x *= normalized_velocity;
} }
return nu * velocity; if (velocity < 0.f)
return std::max(nu * velocity, -GestureConfiguration::fling_velocity_cap());
else
return std::min(nu * velocity, GestureConfiguration::fling_velocity_cap());
} }
} // namespace } // namespace
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment