Chromium Code Reviews| Index: chrome/browser/chromeos/system/input_device_settings.cc |
| =================================================================== |
| --- chrome/browser/chromeos/system/input_device_settings.cc (revision 118124) |
| +++ chrome/browser/chromeos/system/input_device_settings.cc (working copy) |
| @@ -4,6 +4,7 @@ |
| #include "chrome/browser/chromeos/system/input_device_settings.h" |
| +#include <stdarg.h> |
| #include <string> |
| #include <vector> |
| @@ -22,17 +23,24 @@ |
| namespace chromeos { |
| namespace system { |
| -namespace touchpad_settings { |
| namespace { |
| const char* kTpControl = "/opt/google/touchpad/tpcontrol"; |
| +const char* kMouseControl = "/opt/google/mouse/mousecontrol"; |
|
xiyuan
2012/01/19 20:49:40
nit: think the preferred way to define string cons
achuithb
2012/01/19 22:19:04
Done.
|
| -bool TPCtrlExists() { |
| - return file_util::PathExists(FilePath(kTpControl)); |
| +bool ScriptExists(const std::string& script) { |
| + return file_util::PathExists(FilePath(script)); |
| } |
| -// Launches the tpcontrol command asynchronously, if it exists. |
| -void LaunchTpControl(const std::vector<std::string>& argv) { |
| - if (!TPCtrlExists()) |
| +// Executes the input control script asynchronously, if it exists. |
| +void ExecuteScriptOnFileThread(const std::vector<std::string>& argv) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| + DCHECK(!argv.empty()); |
| + const std::string& script(argv[0]); |
| + |
| + // Script must exist on device. |
| + DCHECK(!runtime_environment::IsRunningOnChromeOS() || ScriptExists(script)); |
| + |
| + if (!ScriptExists(script)) |
| return; |
| base::LaunchOptions options; |
| @@ -40,74 +48,79 @@ |
| base::LaunchProcess(CommandLine(argv), options, NULL); |
| } |
| -} // namespace |
| +void ExecuteScript(int argc, ...) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + std::vector<std::string> argv; |
| + va_list vl; |
| + va_start(vl, argc); |
| + for (int i = 0; i < argc; ++i) { |
| + argv.push_back(va_arg(vl, const char*)); |
| + } |
| + va_end(vl); |
| -bool TouchpadExists() { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| - static bool init = false; |
| - static bool exists = false; |
| + BrowserThread::PostTask( |
| + BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&ExecuteScriptOnFileThread, argv)); |
| +} |
| - if (init) |
| - return exists; |
| +void SetPointerSensitivity(const char* script, int value) { |
| + DCHECK(value > 0 && value < 6); |
| + ExecuteScript(3, script, "sensitivity", StringPrintf("%d", value).c_str()); |
| +} |
| - init = true; |
| - if (!TPCtrlExists()) |
| - return exists; |
| +bool DeviceExists(const char* script) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| + if (!ScriptExists(script)) |
| + return false; |
| std::vector<std::string> argv; |
| - argv.push_back(kTpControl); |
| + argv.push_back(script); |
| argv.push_back("status"); |
| std::string output; |
| - // On devices with no touchpad, output is empty. |
| - exists = base::GetAppOutput(CommandLine(argv), &output) && !output.empty(); |
| - return exists; |
| + // Output is empty if the device is not found. |
| + return base::GetAppOutput(CommandLine(argv), &output) && !output.empty(); |
| } |
| -void SetSensitivity(int value) { |
| - // Run this on the FILE thread. |
| - if (!BrowserThread::CurrentlyOn(BrowserThread::FILE)) { |
| - BrowserThread::PostTask( |
| - BrowserThread::FILE, FROM_HERE, |
| - base::Bind(&SetSensitivity, value)); |
| - return; |
| - } |
| +} // namespace |
| - std::vector<std::string> argv; |
| - argv.push_back(kTpControl); |
| - argv.push_back("sensitivity"); |
| - argv.push_back(StringPrintf("%d", value)); |
| +namespace pointer_settings { |
| - LaunchTpControl(argv); |
| +void SetSensitivity(int value) { |
| + SetPointerSensitivity(kTpControl, value); |
| + SetPointerSensitivity(kMouseControl, value); |
| } |
| -void SetTapToClick(bool enabled) { |
| - // Run this on the FILE thread. |
| - if (!BrowserThread::CurrentlyOn(BrowserThread::FILE)) { |
| - BrowserThread::PostTask( |
| - BrowserThread::FILE, FROM_HERE, |
| - base::Bind(&SetTapToClick, enabled)); |
| - return; |
| - } |
| +} // namespace pointer_settings |
| - std::vector<std::string> argv; |
| - argv.push_back(kTpControl); |
| - argv.push_back("taptoclick"); |
| - argv.push_back(enabled ? "on" : "off"); |
| +namespace touchpad_settings { |
| - LaunchTpControl(argv); |
| +bool TouchpadExists() { |
| + // We only need to do this check once, assuming no pluggable touchpad devices. |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| + static bool init = false; |
| + static bool exists = false; |
| + |
| + if (!init) { |
| + init = true; |
| + exists = DeviceExists(kTpControl); |
| + } |
| + return exists; |
| } |
| +void SetTapToClick(bool enabled) { |
| + ExecuteScript(3, kTpControl, "taptoclick", enabled ? "on" : "off"); |
| +} |
| + |
| } // namespace touchpad_settings |
| namespace mouse_settings { |
| bool MouseExists() { |
| - // TODO(achuith, adlr): Call mouse_ctrl when it exists. |
| - return false; |
| + return DeviceExists(kMouseControl); |
| } |
| void SetPrimaryButtonRight(bool right) { |
| - // TODO(achuith, adlr): Call mouse_ctrl when it exists. |
| + ExecuteScript(3, kMouseControl, "swap_left_right", right ? "1" : "0"); |
| } |
| } // namespace mouse_settings |