// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_INPUT_DEVICE_SETTINGS_H_ #define CHROME_BROWSER_CHROMEOS_SYSTEM_INPUT_DEVICE_SETTINGS_H_ #include <string> #include <vector> #include "base/callback.h" #include "base/logging.h" namespace chromeos { namespace system { namespace internal { // Objects of this class are intended to store values of type T, but might have // "unset" state. Object will be in "unset" state until Set is called first // time. template <typename T> class Optional { public: Optional() : value_(), is_set_(false) { } Optional& operator=(const Optional& other) { if (&other != this) { value_ = other.value_; is_set_ = other.is_set_; } return *this; } void Set(const T& value) { is_set_ = true; value_ = value; } bool is_set() const { return is_set_; } T value() const { DCHECK(is_set()); return value_; } // Tries to update |this| with |update|. If |update| is unset or has same // value as |this| method returns false. Otherwise |this| takes value of // |update| and returns true. bool Update(const Optional& update) { if (update.is_set_ && (!is_set_ || value_ != update.value_)) { value_ = update.value_; is_set_ = true; return true; } return false; } private: T value_; bool is_set_; }; } // namespace internal // Min/max possible pointer sensitivity values. Defined in CrOS inputcontrol // scripts (see kTpControl/kMouseControl in the source file). const int kMinPointerSensitivity = 1; const int kMaxPointerSensitivity = 5; // Auxiliary class used to update several touchpad settings at a time. User // should set any number of settings and pass object to UpdateTouchpadSettings // method of InputDeviceSettings. // Objects of this class have no default values for settings, so it is error // to call Get* method before calling corresponding Set* method at least // once. class TouchpadSettings { public: TouchpadSettings(); TouchpadSettings& operator=(const TouchpadSettings& other); void SetSensitivity(int value); int GetSensitivity() const; void SetTapToClick(bool enabled); bool GetTapToClick() const; void SetThreeFingerClick(bool enabled); bool GetThreeFingerClick() const; void SetTapDragging(bool enabled); bool GetTapDragging() const; void SetNaturalScroll(bool enabled); bool GetNaturalScroll() const; // Updates |this| with |settings|. If at least one setting was updated returns // true. // |argv| is filled with arguments of script, that should be launched in order // to apply update. This argument is optional and could be NULL. bool Update(const TouchpadSettings& settings, std::vector<std::string>* argv); private: internal::Optional<int> sensitivity_; internal::Optional<bool> tap_to_click_; internal::Optional<bool> three_finger_click_; internal::Optional<bool> tap_dragging_; internal::Optional<bool> natural_scroll_; }; // Auxiliary class used to update several mouse settings at a time. User // should set any number of settings and pass object to UpdateMouseSettings // method of InputDeviceSettings. // Objects of this class have no default values for settings, so it is error // to call Get* method before calling corresponding Set* method at least // once. class MouseSettings { public: MouseSettings(); MouseSettings& operator=(const MouseSettings& other); void SetSensitivity(int value); int GetSensitivity() const; void SetPrimaryButtonRight(bool right); bool GetPrimaryButtonRight() const; // Updates |this| with |settings|. If at least one setting was updated returns // true. // |argv| is filled with arguments of script, that should be launched in order // to apply update. This argument is optional and could be NULL. bool Update(const MouseSettings& update, std::vector<std::string>* argv); private: internal::Optional<int> sensitivity_; internal::Optional<bool> primary_button_right_; }; class InputDeviceSettings { public: typedef base::Callback<void(bool)> DeviceExistsCallback; virtual ~InputDeviceSettings() {} // Returns current instance of InputDeviceSettings. static InputDeviceSettings* Get(); // Replaces current instance with |test_settings|. Takes ownership of // |test_settings|. Default implementation could be returned back by passing // NULL to this method. static void SetSettingsForTesting(InputDeviceSettings* test_settings); // Calls |callback| asynchronously after determining if a touchpad is // connected. virtual void TouchpadExists(const DeviceExistsCallback& callback) = 0; // Updates several touchpad settings at a time. Updates only settings that // are set in |settings| object. It is more efficient to use this method to // update several settings then calling Set* methods one by one. virtual void UpdateTouchpadSettings(const TouchpadSettings& settings) = 0; // Sets the touchpad sensitivity in the range [kMinPointerSensitivity, // kMaxPointerSensitivity]. virtual void SetTouchpadSensitivity(int value) = 0; // Turns tap to click on/off. virtual void SetTapToClick(bool enabled) = 0; // Switch for three-finger click. virtual void SetThreeFingerClick(bool enabled) = 0; // Turns tap-dragging on/off. virtual void SetTapDragging(bool enabled) = 0; // Turns natural scrolling on/off for all devices except wheel mice virtual void SetNaturalScroll(bool enabled) = 0; // Calls |callback| asynchronously after determining if a mouse is connected. virtual void MouseExists(const DeviceExistsCallback& callback) = 0; // Updates several mouse settings at a time. Updates only settings that // are set in |settings| object. It is more efficient to use this method to // update several settings then calling Set* methods one by one. virtual void UpdateMouseSettings(const MouseSettings& settings) = 0; // Sets the mouse sensitivity in the range [kMinPointerSensitivity, // kMaxPointerSensitivity]. virtual void SetMouseSensitivity(int value) = 0; // Sets the primary mouse button to the right button if |right| is true. virtual void SetPrimaryButtonRight(bool right) = 0; // Returns true if UI should implement enhanced keyboard support for cases // where other input devices like mouse are absent. virtual bool ForceKeyboardDrivenUINavigation() = 0; // Reapplies previously set touchpad settings. virtual void ReapplyTouchpadSettings() = 0; // Reapplies previously set mouse settings. virtual void ReapplyMouseSettings() = 0; }; } // namespace system } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_SYSTEM_INPUT_DEVICE_SETTINGS_H_