15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/system/input_device_settings.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/ref_counted.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
13bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/kill.h"
14bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/launch.h"
15bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process_handle.h"
160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/strings/string_util.h"
175e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/task_runner.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/browser_process.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/common/pref_names.h"
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/system/statistics_provider.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace system {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)InputDeviceSettings* g_instance_;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)InputDeviceSettings* g_test_instance_;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kDeviceTypeTouchpad[] = "touchpad";
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kDeviceTypeMouse[] = "mouse";
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kInputControl[] = "/opt/google/input/inputcontrol";
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef base::RefCountedData<bool> RefCountedBool;
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ScriptExists(const std::string& script) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return base::PathExists(base::FilePath(script));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Executes the input control script asynchronously, if it exists.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExecuteScriptOnFileThread(const std::vector<std::string>& argv) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!argv.empty());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& script(argv[0]);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Script must exist on device.
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(!base::SysInfo::IsRunningOnChromeOS() || ScriptExists(script));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ScriptExists(script))
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::ProcessHandle handle;
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::LaunchProcess(CommandLine(argv), base::LaunchOptions(), &handle);
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::EnsureProcessGetsReaped(handle);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExecuteScript(const std::vector<std::string>& argv) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (argv.size() == 1)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VLOG(1) << "About to launch: \""
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          << CommandLine(argv).GetCommandLineString() << "\"";
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Control scripts can take long enough to cause SIGART during shutdown
74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // (http://crbug.com/261426). Run the blocking pool task with
75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // CONTINUE_ON_SHUTDOWN so it won't be joined when Chrome shuts down.
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<base::TaskRunner> runner =
78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      pool->GetTaskRunnerWithShutdownBehavior(
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  runner->PostTask(FROM_HERE, base::Bind(&ExecuteScriptOnFileThread, argv));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid AddSensitivityArguments(const char* device_type, int value,
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             std::vector<std::string>* argv) {
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(value >= kMinPointerSensitivity && value <= kMaxPointerSensitivity);
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  argv->push_back(base::StringPrintf("--%s_sensitivity=%d",
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     device_type, value));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AddTPControlArguments(const char* control,
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           bool enabled,
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           std::vector<std::string>* argv) {
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  argv->push_back(base::StringPrintf("--%s=%d", control, enabled ? 1 : 0));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid DeviceExistsBlockingPool(const char* device_type,
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                              scoped_refptr<RefCountedBool> exists) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  exists->data = false;
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!ScriptExists(kInputControl))
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> argv;
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  argv.push_back(kInputControl);
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  argv.push_back(base::StringPrintf("--type=%s", device_type));
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  argv.push_back("--list");
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string output;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Output is empty if the device is not found.
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  exists->data = base::GetAppOutput(CommandLine(argv), &output) &&
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      !output.empty();
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DVLOG(1) << "DeviceExistsBlockingPool:" << device_type << "=" << exists->data;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RunCallbackUIThread(
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<RefCountedBool> exists,
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const InputDeviceSettings::DeviceExistsCallback& callback) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DVLOG(1) << "RunCallbackUIThread " << exists->data;
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  callback.Run(exists->data);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DeviceExists(const char* script,
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  const InputDeviceSettings::DeviceExistsCallback& callback) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // One or both of the control scripts can apparently hang during shutdown
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // (http://crbug.com/255546). Run the blocking pool task with
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // CONTINUE_ON_SHUTDOWN so it won't be joined when Chrome shuts down.
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<RefCountedBool> exists(new RefCountedBool(false));
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<base::TaskRunner> runner =
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      pool->GetTaskRunnerWithShutdownBehavior(
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  runner->PostTaskAndReply(FROM_HERE,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&DeviceExistsBlockingPool, script, exists),
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&RunCallbackUIThread, exists, callback));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class InputDeviceSettingsImpl : public InputDeviceSettings {
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InputDeviceSettingsImpl();
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Overridden from InputDeviceSettings.
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void TouchpadExists(const DeviceExistsCallback& callback) OVERRIDE;
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void UpdateTouchpadSettings(const TouchpadSettings& settings)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE;
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetTouchpadSensitivity(int value) OVERRIDE;
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetTapToClick(bool enabled) OVERRIDE;
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetThreeFingerClick(bool enabled) OVERRIDE;
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetTapDragging(bool enabled) OVERRIDE;
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetNaturalScroll(bool enabled) OVERRIDE;
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void MouseExists(const DeviceExistsCallback& callback) OVERRIDE;
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void UpdateMouseSettings(const MouseSettings& update) OVERRIDE;
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetMouseSensitivity(int value) OVERRIDE;
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetPrimaryButtonRight(bool right) OVERRIDE;
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool ForceKeyboardDrivenUINavigation() OVERRIDE;
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void ReapplyTouchpadSettings() OVERRIDE;
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void ReapplyMouseSettings() OVERRIDE;
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TouchpadSettings current_touchpad_settings_;
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MouseSettings current_mouse_settings_;
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InputDeviceSettingsImpl);
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)InputDeviceSettingsImpl::InputDeviceSettingsImpl() {}
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::TouchpadExists(
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const DeviceExistsCallback& callback) {
172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DeviceExists(kDeviceTypeTouchpad, callback);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::UpdateTouchpadSettings(
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const TouchpadSettings& settings) {
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<std::string> argv;
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (current_touchpad_settings_.Update(settings, &argv))
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ExecuteScript(argv);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::SetTouchpadSensitivity(int value) {
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TouchpadSettings settings;
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  settings.SetSensitivity(value);
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateTouchpadSettings(settings);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid InputDeviceSettingsImpl::SetNaturalScroll(bool enabled) {
189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  TouchpadSettings settings;
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  settings.SetNaturalScroll(enabled);
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  UpdateTouchpadSettings(settings);
192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::SetTapToClick(bool enabled) {
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TouchpadSettings settings;
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  settings.SetTapToClick(enabled);
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateTouchpadSettings(settings);
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::SetThreeFingerClick(bool enabled) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For Alex/ZGB.
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TouchpadSettings settings;
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  settings.SetThreeFingerClick(enabled);
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateTouchpadSettings(settings);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::SetTapDragging(bool enabled) {
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TouchpadSettings settings;
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  settings.SetTapDragging(enabled);
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateTouchpadSettings(settings);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::MouseExists(
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const DeviceExistsCallback& callback) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DeviceExists(kDeviceTypeMouse, callback);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::UpdateMouseSettings(const MouseSettings& update) {
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<std::string> argv;
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (current_mouse_settings_.Update(update, &argv))
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ExecuteScript(argv);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::SetMouseSensitivity(int value) {
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MouseSettings settings;
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  settings.SetSensitivity(value);
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateMouseSettings(settings);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::SetPrimaryButtonRight(bool right) {
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MouseSettings settings;
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  settings.SetPrimaryButtonRight(right);
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateMouseSettings(settings);
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
236558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool InputDeviceSettingsImpl::ForceKeyboardDrivenUINavigation() {
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
240558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!connector)
241558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
242558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
243558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  policy::DeviceCloudPolicyManagerChromeOS* policy_manager =
244558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      connector->GetDeviceCloudPolicyManager();
245558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!policy_manager)
246558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return false;
247558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (policy_manager->IsRemoraRequisition() ||
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      policy_manager->IsSharkRequisition()) {
250558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return true;
2510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
252558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
253558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  bool keyboard_driven = false;
254558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (chromeos::system::StatisticsProvider::GetInstance()->GetMachineFlag(
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          kOemKeyboardDrivenOobeKey, &keyboard_driven)) {
256558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return keyboard_driven;
257558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
258558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
259558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return false;
260558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
261558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::ReapplyTouchpadSettings() {
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TouchpadSettings settings = current_touchpad_settings_;
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  current_touchpad_settings_ = TouchpadSettings();
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateTouchpadSettings(settings);
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettingsImpl::ReapplyMouseSettings() {
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MouseSettings settings = current_mouse_settings_;
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  current_mouse_settings_ = MouseSettings();
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateMouseSettings(settings);
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TouchpadSettings::TouchpadSettings() {}
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TouchpadSettings& TouchpadSettings::operator=(const TouchpadSettings& other) {
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (&other != this) {
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    sensitivity_ = other.sensitivity_;
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    tap_to_click_ = other.tap_to_click_;
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    three_finger_click_ = other.three_finger_click_;
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    tap_dragging_ = other.tap_dragging_;
284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    natural_scroll_ = other.natural_scroll_;
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return *this;
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TouchpadSettings::SetSensitivity(int value) {
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sensitivity_.Set(value);
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int TouchpadSettings::GetSensitivity() const {
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return sensitivity_.value();
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TouchpadSettings::SetTapToClick(bool enabled) {
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tap_to_click_.Set(enabled);
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TouchpadSettings::GetTapToClick() const {
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return tap_to_click_.value();
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid TouchpadSettings::SetNaturalScroll(bool enabled) {
306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  natural_scroll_.Set(enabled);
307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool TouchpadSettings::GetNaturalScroll() const {
310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return natural_scroll_.value();
311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TouchpadSettings::SetThreeFingerClick(bool enabled) {
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  three_finger_click_.Set(enabled);
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TouchpadSettings::GetThreeFingerClick() const {
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return three_finger_click_.value();
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TouchpadSettings::SetTapDragging(bool enabled) {
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tap_dragging_.Set(enabled);
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TouchpadSettings::GetTapDragging() const {
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return tap_dragging_.value();
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TouchpadSettings::Update(const TouchpadSettings& settings,
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              std::vector<std::string>* argv) {
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (argv)
332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    argv->push_back(kInputControl);
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool updated = false;
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (sensitivity_.Update(settings.sensitivity_)) {
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    updated = true;
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (argv)
337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      AddSensitivityArguments(kDeviceTypeTouchpad, sensitivity_.value(), argv);
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (tap_to_click_.Update(settings.tap_to_click_)) {
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    updated = true;
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (argv)
342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      AddTPControlArguments("tapclick", tap_to_click_.value(), argv);
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (three_finger_click_.Update(settings.three_finger_click_)) {
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    updated = true;
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (argv)
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddTPControlArguments("t5r2_three_finger_click",
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            three_finger_click_.value(),
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            argv);
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (tap_dragging_.Update(settings.tap_dragging_)) {
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    updated = true;
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (argv)
354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      AddTPControlArguments("tapdrag", tap_dragging_.value(), argv);
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  natural_scroll_.Update(settings.natural_scroll_);
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Always send natural scrolling to the shell command, as a workaround.
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // See crbug.com/406480
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (natural_scroll_.is_set()) {
360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    updated = true;
361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (argv)
362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      AddTPControlArguments("australian_scrolling", natural_scroll_.value(),
363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            argv);
364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return updated;
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MouseSettings::MouseSettings() {}
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MouseSettings& MouseSettings::operator=(const MouseSettings& other) {
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (&other != this) {
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    sensitivity_ = other.sensitivity_;
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    primary_button_right_ = other.primary_button_right_;
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return *this;
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MouseSettings::SetSensitivity(int value) {
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sensitivity_.Set(value);
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int MouseSettings::GetSensitivity() const {
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return sensitivity_.value();
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MouseSettings::SetPrimaryButtonRight(bool right) {
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  primary_button_right_.Set(right);
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MouseSettings::GetPrimaryButtonRight() const {
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return primary_button_right_.value();
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MouseSettings::Update(const MouseSettings& settings,
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           std::vector<std::string>* argv) {
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (argv)
397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    argv->push_back(kInputControl);
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool updated = false;
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (sensitivity_.Update(settings.sensitivity_)) {
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    updated = true;
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (argv)
402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      AddSensitivityArguments(kDeviceTypeMouse, sensitivity_.value(), argv);
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (primary_button_right_.Update(settings.primary_button_right_)) {
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    updated = true;
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (argv) {
407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      AddTPControlArguments("mouse_swap_lr", primary_button_right_.value(),
408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            argv);
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return updated;
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)InputDeviceSettings* InputDeviceSettings::Get() {
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (g_test_instance_)
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return g_test_instance_;
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!g_instance_)
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    g_instance_ = new InputDeviceSettingsImpl;
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return g_instance_;
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InputDeviceSettings::SetSettingsForTesting(
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputDeviceSettings* test_settings) {
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (g_test_instance_ == test_settings)
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete g_test_instance_;
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_test_instance_ = test_settings;
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
431558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace system
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
434