| // Copyright (c) 2009 The Chromium OS 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 "chromeos_synaptics.h" // NOLINT |
| |
| #include <string> |
| |
| #include "base/logging.h" |
| #include "base/string_util.h" |
| |
| namespace chromeos { // NOLINT |
| |
| namespace { // NOLINT |
| |
| const double kMaxTapTimeMin = 0; |
| const double kMaxTapTimeMax = 180; |
| const double kVertEdgeScrollMin = 0; |
| const double kVertEdgeScrollMax = 1; |
| const double kFingerHighMin = 25; |
| const double kFingerHighMax = 70; |
| const double kMaxSpeedMin = 0.2; |
| const double kMaxSpeedMax = 1.1; |
| |
| // This method will covert a range value between 1 and 10 to a value between |
| // low and high. The values will be linearly mapped, where 1 will be mapped to |
| // low and 10 will be mapped to high. And anything in between will be mapped to |
| // a value between low and high. If low>high, this method will still work where |
| // a larger rangevalue will result in a smaller number. |
| double ConvertRange(double low, double high, int rangevalue) { |
| // We just use y = mx + b to solve this. |
| // since there are 9 steps in range values between 1 and 10. |
| // b = low |
| // m = (high - low) / 9 |
| // x = rangevalue - 1 |
| double b = low; |
| double m = (high - low) / 9.0; |
| double x = static_cast<double>(rangevalue - 1); |
| return m * x + b; |
| } |
| |
| } // namespace |
| |
| extern "C" |
| void ChromeOSSetSynapticsParameter(SynapticsParameter param, int value) { |
| std::string command("synclient "); |
| switch (param) { |
| case PARAM_BOOL_TAP_TO_CLICK: |
| // To enable/disable tap-to-click (i.e. a tap on the touchpad is |
| // recognized as a left mouse click event), we use MaxTapTime. |
| // MaxTapTime is the maximum time (in milliseconds) for detecting a tap. |
| // To specify on, we set MaxTapTime to kMaxTapTimeMax. |
| // To specify off, we set MaxTapTime to kMaxTapTimeMin. |
| command += StringPrintf("MaxTapTime=%f", (value == 0) ? kMaxTapTimeMin : |
| kMaxTapTimeMax); |
| break; |
| case PARAM_BOOL_VERTICAL_EDGE_SCROLLING: |
| // To enable/disable vertical edge scroll, we use VertEdgeScroll. |
| // Vertical edge scroll lets you use the right edge of the touchpad to |
| // control the movement of the vertical scroll bar. |
| // To specify on, we set VertEdgeScroll to kVertEdgeScrollMax. |
| // To specify off, we set VertEdgeScroll to kVertEdgeScrollMin. |
| command += StringPrintf("VertEdgeScroll=%f", (value == 0) ? |
| kVertEdgeScrollMin : |
| kVertEdgeScrollMax); |
| break; |
| case PARAM_RANGE_TOUCH_SENSITIVITY: |
| // To set the touch sensitivity, we use FingerHigh, which represents the |
| // the pressure needed for a tap to be registered. The range of FingerHigh |
| // goes from kFingerHighMax to kFingerHighMin. We store the sensitivity |
| // preference as an int from 1 to 10. |
| // A range value of 1 represent a FingerHigh value of kFingerHighMax. |
| // A range value of 10 represent a FingerHigh value of kFingerHighMin. |
| command += StringPrintf("FingerHigh=%f", ConvertRange(kFingerHighMax, |
| kFingerHighMin, |
| value)); |
| break; |
| case PARAM_RANGE_SPEED_SENSITIVITY: |
| // To set speed factor, we use MaxSpeed. MinSpeed is set to 0.2 |
| // MaxSpeed can go from kMaxSpeedMin to kMaxSpeedMax. The preference is |
| // an integer between 1 and 10. |
| // A range value of 1 represent a MaxSpeed value of kMaxSpeedMin. |
| // A range value of 10 represent a MaxSpeed value of kMaxSpeedMax. |
| command += StringPrintf("MaxSpeed=%f", ConvertRange(kMaxSpeedMin, |
| kMaxSpeedMax, |
| value)); |
| break; |
| default: |
| LOG(WARNING) << "SetSynapticsParameter got unknown param: " << param; |
| return; |
| } |
| |
| LOG(INFO) << "Setting synaptics parameter " << command.c_str(); |
| if (system(command.c_str()) < 0) |
| LOG(WARNING) << "Got error while running \"" << command << "\""; |
| } |
| |
| } // namespace chromeos |