1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 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)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROMEOS_IME_XKEYBOARD_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROMEOS_IME_XKEYBOARD_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace input_method {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AutoRepeatRate {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutoRepeatRate() : initial_delay_in_ms(0), repeat_interval_in_ms(0) {}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int initial_delay_in_ms;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int repeat_interval_in_ms;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ModifierLockStatus {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kDisableLock = 0,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kEnableLock,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kDontChange,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ModifierKey {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kSearchKey = 0,  // Customizable.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kControlKey,  // Customizable.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAltKey,  // Customizable.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kVoidKey,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kCapsLockKey,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IMPORTANT: You should update kCustomizableKeys[] in .cc file, if you
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // add a customizable key.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kNumModifierKeys,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InputMethodUtil;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CHROMEOS_EXPORT XKeyboard {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~XKeyboard() {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the current keyboard layout to |layout_name|. This function does not
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // change the current mapping of the modifier keys. Returns true on success.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SetCurrentKeyboardLayoutByName(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& layout_name) = 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the current keyboard layout again. We have to call the function every
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time when "XI_HierarchyChanged" XInput2 event is sent to Chrome. See
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // xinput_hierarchy_changed_event_listener.h for details.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ReapplyCurrentKeyboardLayout() = 0;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates keyboard LEDs on all keyboards.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XKB asymmetrically propagates keyboard modifier indicator state changes to
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // slave keyboards. If the state change is initiated from a client to the
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "core/master keyboard", XKB changes global state and pushes an indication
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // change down to all keyboards. If the state change is initiated by one slave
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (physical) keyboard, it changes global state but only pushes an indicator
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state change down to that one keyboard.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function changes LEDs on all keyboards by explicitly updating the
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // core/master keyboard.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReapplyCurrentModifierLockStatus() = 0;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the Caps Lock and Num Lock status. Do not call the function from
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // non-UI threads.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetLockedModifiers(ModifierLockStatus new_caps_lock_status,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ModifierLockStatus new_num_lock_status) = 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the num lock status to |enable_num_lock|. Do not call the function
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from non-UI threads.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetNumLockEnabled(bool enable_num_lock) = 0;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the caps lock status to |enable_caps_lock|. Do not call the function
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from non-UI threads.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetCapsLockEnabled(bool enable_caps_lock) = 0;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if num lock is enabled. Do not call the function from non-UI
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // threads.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool NumLockIsEnabled() = 0;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if caps lock is enabled. Do not call the function from non-UI
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // threads.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CapsLockIsEnabled() = 0;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a mask (e.g. 1U<<4) for Num Lock. On error, returns 0. Do not call
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the function from non-UI threads.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Move this and webdriver::GetXModifierMask() functions in
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chrome/test/webdriver/keycode_text_conversion_x.cc to ui/base/x/x11_util.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The two functions are almost the same.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual unsigned int GetNumLockMask() = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set true on |out_caps_lock_enabled| if Caps Lock is enabled. Set true on
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |out_num_lock_enabled| if Num Lock is enabled. Both out parameters can be
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL. Do not call the function from non-UI threads.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetLockedModifiers(bool* out_caps_lock_enabled,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool* out_num_lock_enabled) = 0;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turns on and off the auto-repeat of the keyboard. Returns true on success.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not call the function from non-UI threads.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Make this function non-static so we can mock it.
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static CHROMEOS_EXPORT bool SetAutoRepeatEnabled(bool enabled);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the auto-repeat rate of the keyboard, initial delay in ms, and repeat
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interval in ms.  Returns true on success. Do not call the function from
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // non-UI threads.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Make this function non-static so we can mock it.
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static CHROMEOS_EXPORT bool SetAutoRepeatRate(const AutoRepeatRate& rate);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if auto repeat is enabled. This function is protected: for
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // testability.
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static CHROMEOS_EXPORT bool GetAutoRepeatEnabledForTesting();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On success, set current auto repeat rate on |out_rate| and returns true.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false otherwise. This function is protected: for testability.
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static CHROMEOS_EXPORT bool GetAutoRepeatRateForTesting(
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutoRepeatRate* out_rate);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if |layout_name| contains a bad character.
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static CHROMEOS_EXPORT bool CheckLayoutNameForTesting(
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& layout_name);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: At this moment, classes other than InputMethodManager should not
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instantiate the XKeyboard class.
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static XKeyboard* Create();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace input_method
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROMEOS_IME_XKEYBOARD_H_
134