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