summaryrefslogtreecommitdiffstats
path: root/chromeos/ime/xkeyboard.h
blob: b2f48e0b840dbf588712cebecd9d1c2d87bade1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Copyright 2013 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 CHROMEOS_IME_XKEYBOARD_H_
#define CHROMEOS_IME_XKEYBOARD_H_

#include <string>
#include <vector>

#include "base/basictypes.h"
#include "chromeos/chromeos_export.h"

namespace chromeos {
namespace input_method {

struct AutoRepeatRate {
  AutoRepeatRate() : initial_delay_in_ms(0), repeat_interval_in_ms(0) {}
  unsigned int initial_delay_in_ms;
  unsigned int repeat_interval_in_ms;
};

enum ModifierLockStatus {
  kDisableLock = 0,
  kEnableLock,
  kDontChange,
};

enum ModifierKey {
  kSearchKey = 0,  // Customizable.
  kControlKey,  // Customizable.
  kAltKey,  // Customizable.
  kVoidKey,
  kCapsLockKey,
  kEscapeKey,
  // IMPORTANT: You should update kCustomizableKeys[] in .cc file, if you
  // add a customizable key.
  kNumModifierKeys,
};

class InputMethodUtil;

class CHROMEOS_EXPORT XKeyboard {
 public:
  virtual ~XKeyboard() {}

  // Sets the current keyboard layout to |layout_name|. This function does not
  // change the current mapping of the modifier keys. Returns true on success.
  virtual bool SetCurrentKeyboardLayoutByName(
      const std::string& layout_name) = 0;

  // Sets the current keyboard layout again. We have to call the function every
  // time when "XI_HierarchyChanged" XInput2 event is sent to Chrome. See
  // xinput_hierarchy_changed_event_listener.h for details.
  virtual bool ReapplyCurrentKeyboardLayout() = 0;

  // Updates keyboard LEDs on all keyboards.
  // XKB asymmetrically propagates keyboard modifier indicator state changes to
  // slave keyboards. If the state change is initiated from a client to the
  // "core/master keyboard", XKB changes global state and pushes an indication
  // change down to all keyboards. If the state change is initiated by one slave
  // (physical) keyboard, it changes global state but only pushes an indicator
  // state change down to that one keyboard.
  // This function changes LEDs on all keyboards by explicitly updating the
  // core/master keyboard.
  virtual void ReapplyCurrentModifierLockStatus() = 0;

  // Sets the Caps Lock and Num Lock status. Do not call the function from
  // non-UI threads.
  virtual void SetLockedModifiers(ModifierLockStatus new_caps_lock_status,
                                  ModifierLockStatus new_num_lock_status) = 0;

  // Sets the num lock status to |enable_num_lock|. Do not call the function
  // from non-UI threads.
  virtual void SetNumLockEnabled(bool enable_num_lock) = 0;

  // Sets the caps lock status to |enable_caps_lock|. Do not call the function
  // from non-UI threads.
  virtual void SetCapsLockEnabled(bool enable_caps_lock) = 0;

  // Returns true if num lock is enabled. Do not call the function from non-UI
  // threads.
  virtual bool NumLockIsEnabled() = 0;

  // Returns true if caps lock is enabled. Do not call the function from non-UI
  // threads.
  virtual bool CapsLockIsEnabled() = 0;

  // Returns a mask (e.g. 1U<<4) for Num Lock. On error, returns 0. Do not call
  // the function from non-UI threads.
  // TODO(yusukes): Move this and webdriver::GetXModifierMask() functions in
  // chrome/test/webdriver/keycode_text_conversion_x.cc to ui/base/x/x11_util.
  // The two functions are almost the same.
  virtual unsigned int GetNumLockMask() = 0;

  // Set true on |out_caps_lock_enabled| if Caps Lock is enabled. Set true on
  // |out_num_lock_enabled| if Num Lock is enabled. Both out parameters can be
  // NULL. Do not call the function from non-UI threads.
  virtual void GetLockedModifiers(bool* out_caps_lock_enabled,
                                  bool* out_num_lock_enabled) = 0;

  // Turns on and off the auto-repeat of the keyboard. Returns true on success.
  // Do not call the function from non-UI threads.
  // TODO(yusukes): Make this function non-static so we can mock it.
  static CHROMEOS_EXPORT bool SetAutoRepeatEnabled(bool enabled);

  // Sets the auto-repeat rate of the keyboard, initial delay in ms, and repeat
  // interval in ms.  Returns true on success. Do not call the function from
  // non-UI threads.
  // TODO(yusukes): Make this function non-static so we can mock it.
  static CHROMEOS_EXPORT bool SetAutoRepeatRate(const AutoRepeatRate& rate);

  // Returns true if auto repeat is enabled. This function is protected: for
  // testability.
  static CHROMEOS_EXPORT bool GetAutoRepeatEnabledForTesting();

  // On success, set current auto repeat rate on |out_rate| and returns true.
  // Returns false otherwise. This function is protected: for testability.
  static CHROMEOS_EXPORT bool GetAutoRepeatRateForTesting(
      AutoRepeatRate* out_rate);

  // Returns false if |layout_name| contains a bad character.
  static CHROMEOS_EXPORT bool CheckLayoutNameForTesting(
      const std::string& layout_name);

  // Note: At this moment, classes other than InputMethodManager should not
  // instantiate the XKeyboard class.
  static XKeyboard* Create();
};

}  // namespace input_method
}  // namespace chromeos

#endif  // CHROMEOS_IME_XKEYBOARD_H_