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,
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  kEscapeKey,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IMPORTANT: You should update kCustomizableKeys[] in .cc file, if you
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // add a customizable key.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kNumModifierKeys,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InputMethodUtil;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CHROMEOS_EXPORT XKeyboard {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~XKeyboard() {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the current keyboard layout to |layout_name|. This function does not
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // change the current mapping of the modifier keys. Returns true on success.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SetCurrentKeyboardLayoutByName(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& layout_name) = 0;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the current keyboard layout again. We have to call the function every
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time when "XI_HierarchyChanged" XInput2 event is sent to Chrome. See
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // xinput_hierarchy_changed_event_listener.h for details.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ReapplyCurrentKeyboardLayout() = 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates keyboard LEDs on all keyboards.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XKB asymmetrically propagates keyboard modifier indicator state changes to
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // slave keyboards. If the state change is initiated from a client to the
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "core/master keyboard", XKB changes global state and pushes an indication
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // change down to all keyboards. If the state change is initiated by one slave
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (physical) keyboard, it changes global state but only pushes an indicator
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state change down to that one keyboard.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function changes LEDs on all keyboards by explicitly updating the
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // core/master keyboard.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReapplyCurrentModifierLockStatus() = 0;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the Caps Lock and Num Lock status. Do not call the function from
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // non-UI threads.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetLockedModifiers(ModifierLockStatus new_caps_lock_status,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ModifierLockStatus new_num_lock_status) = 0;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the num lock status to |enable_num_lock|. Do not call the function
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from non-UI threads.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetNumLockEnabled(bool enable_num_lock) = 0;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the caps lock status to |enable_caps_lock|. Do not call the function
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from non-UI threads.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetCapsLockEnabled(bool enable_caps_lock) = 0;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if num lock is enabled. Do not call the function from non-UI
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // threads.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool NumLockIsEnabled() = 0;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if caps lock is enabled. Do not call the function from non-UI
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // threads.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CapsLockIsEnabled() = 0;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a mask (e.g. 1U<<4) for Num Lock. On error, returns 0. Do not call
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the function from non-UI threads.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Move this and webdriver::GetXModifierMask() functions in
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chrome/test/webdriver/keycode_text_conversion_x.cc to ui/base/x/x11_util.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The two functions are almost the same.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual unsigned int GetNumLockMask() = 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set true on |out_caps_lock_enabled| if Caps Lock is enabled. Set true on
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |out_num_lock_enabled| if Num Lock is enabled. Both out parameters can be
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL. Do not call the function from non-UI threads.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetLockedModifiers(bool* out_caps_lock_enabled,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool* out_num_lock_enabled) = 0;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turns on and off the auto-repeat of the keyboard. Returns true on success.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not call the function from non-UI threads.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Make this function non-static so we can mock it.
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static CHROMEOS_EXPORT bool SetAutoRepeatEnabled(bool enabled);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the auto-repeat rate of the keyboard, initial delay in ms, and repeat
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interval in ms.  Returns true on success. Do not call the function from
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // non-UI threads.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Make this function non-static so we can mock it.
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static CHROMEOS_EXPORT bool SetAutoRepeatRate(const AutoRepeatRate& rate);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if auto repeat is enabled. This function is protected: for
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // testability.
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static CHROMEOS_EXPORT bool GetAutoRepeatEnabledForTesting();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On success, set current auto repeat rate on |out_rate| and returns true.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false otherwise. This function is protected: for testability.
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static CHROMEOS_EXPORT bool GetAutoRepeatRateForTesting(
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutoRepeatRate* out_rate);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if |layout_name| contains a bad character.
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static CHROMEOS_EXPORT bool CheckLayoutNameForTesting(
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& layout_name);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: At this moment, classes other than InputMethodManager should not
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instantiate the XKeyboard class.
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static XKeyboard* Create();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace input_method
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROMEOS_IME_XKEYBOARD_H_
135