OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef UI_BASE_IME_INPUT_METHOD_AURALINUX_H_ | 5 #ifndef UI_BASE_IME_INPUT_METHOD_AURALINUX_H_ |
6 #define UI_BASE_IME_INPUT_METHOD_AURALINUX_H_ | 6 #define UI_BASE_IME_INPUT_METHOD_AURALINUX_H_ |
7 | 7 |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "ui/base/ime/composition_text.h" |
9 #include "ui/base/ime/input_method_base.h" | 10 #include "ui/base/ime/input_method_base.h" |
10 #include "ui/base/ime/linux/linux_input_method_context.h" | 11 #include "ui/base/ime/linux/linux_input_method_context.h" |
11 | 12 |
12 namespace ui { | 13 namespace ui { |
13 | 14 |
14 // A ui::InputMethod implementation for Aura on Linux platforms. The | 15 // A ui::InputMethod implementation for Aura on Linux platforms. The |
15 // implementation details are separated to ui::LinuxInputMethodContext | 16 // implementation details are separated to ui::LinuxInputMethodContext |
16 // interface. | 17 // interface. |
17 class UI_BASE_IME_EXPORT InputMethodAuraLinux | 18 class UI_BASE_IME_EXPORT InputMethodAuraLinux |
18 : public InputMethodBase, | 19 : public InputMethodBase, |
19 public LinuxInputMethodContextDelegate { | 20 public LinuxInputMethodContextDelegate { |
20 public: | 21 public: |
21 explicit InputMethodAuraLinux(internal::InputMethodDelegate* delegate); | 22 explicit InputMethodAuraLinux(internal::InputMethodDelegate* delegate); |
22 ~InputMethodAuraLinux() override; | 23 ~InputMethodAuraLinux() override; |
23 | 24 |
| 25 LinuxInputMethodContext* GetContextForTesting(bool is_simple); |
| 26 |
24 // Overriden from InputMethod. | 27 // Overriden from InputMethod. |
25 void Init(bool focused) override; | 28 void Init(bool focused) override; |
26 bool OnUntranslatedIMEMessage(const base::NativeEvent& event, | 29 bool OnUntranslatedIMEMessage(const base::NativeEvent& event, |
27 NativeEventResult* result) override; | 30 NativeEventResult* result) override; |
28 bool DispatchKeyEvent(const ui::KeyEvent& event) override; | 31 bool DispatchKeyEvent(const ui::KeyEvent& event) override; |
29 void OnTextInputTypeChanged(const TextInputClient* client) override; | 32 void OnTextInputTypeChanged(const TextInputClient* client) override; |
30 void OnCaretBoundsChanged(const TextInputClient* client) override; | 33 void OnCaretBoundsChanged(const TextInputClient* client) override; |
31 void CancelComposition(const TextInputClient* client) override; | 34 void CancelComposition(const TextInputClient* client) override; |
32 void OnInputLocaleChanged() override; | 35 void OnInputLocaleChanged() override; |
33 std::string GetInputLocale() override; | 36 std::string GetInputLocale() override; |
34 bool IsActive() override; | 37 bool IsActive() override; |
35 bool IsCandidatePopupOpen() const override; | 38 bool IsCandidatePopupOpen() const override; |
| 39 void OnFocus() override; |
| 40 void OnBlur() override; |
| 41 |
36 | 42 |
37 // Overriden from ui::LinuxInputMethodContextDelegate | 43 // Overriden from ui::LinuxInputMethodContextDelegate |
38 void OnCommit(const base::string16& text) override; | 44 void OnCommit(const base::string16& text) override; |
39 void OnPreeditChanged(const CompositionText& composition_text) override; | 45 void OnPreeditChanged(const CompositionText& composition_text) override; |
40 void OnPreeditEnd() override; | 46 void OnPreeditEnd() override; |
41 void OnPreeditStart() override; | 47 void OnPreeditStart() override; |
42 | 48 |
43 protected: | 49 protected: |
44 // Overridden from InputMethodBase. | 50 // Overridden from InputMethodBase. |
| 51 void OnWillChangeFocusedClient(TextInputClient* focused_before, |
| 52 TextInputClient* focused) override; |
45 void OnDidChangeFocusedClient(TextInputClient* focused_before, | 53 void OnDidChangeFocusedClient(TextInputClient* focused_before, |
46 TextInputClient* focused) override; | 54 TextInputClient* focused) override; |
47 | 55 |
48 private: | 56 private: |
49 // Allows to fire a VKEY_PROCESSKEY key event. | 57 void ProcessInputMethodResult(const KeyEvent& key, |
50 void AllowToFireProcessKey(const ui::KeyEvent& event); | 58 bool filtered); |
51 // Fires a VKEY_PROCESSKEY key event if allowed. | 59 bool NeedInsertChar() const; |
52 void MaybeFireProcessKey(); | 60 void SendFakeProcessKeyEvent(bool pressed) const; |
53 // Stops firing VKEY_PROCESSKEY key events. | 61 void ConfirmCompositionText(); |
54 void StopFiringProcessKey(); | 62 void UpdateContextFocusState(); |
| 63 void ResetContext(); |
55 | 64 |
56 scoped_ptr<LinuxInputMethodContext> input_method_context_; | 65 scoped_ptr<LinuxInputMethodContext> context_; |
| 66 scoped_ptr<LinuxInputMethodContext> context_simple_; |
57 | 67 |
58 // IBus in async mode eagerly consumes all the key events first regardless of | 68 base::string16 result_text_; |
59 // whether the underlying IME consumes the key event or not, and makes | 69 |
60 // gtk_im_context_filter_keypress() always return true, and later pushes | 70 ui::CompositionText composition_; |
61 // the key event back to the GDK event queue when it turns out that the | 71 |
62 // underlying IME doesn't consume the key event. | 72 // Indicates if |context_| and |context_simple_| are focused or not. |
63 // | 73 bool context_focused_; |
64 // Thus we have to defer a decision whether or not to dispatch a | 74 |
65 // VKEY_PROCESSKEY key event. Unlike other InputMethod's subclasses, | 75 // Indicates if we are handling a key event. |
66 // DispatchKeyEvent() in this class does not directly dispatch a | 76 bool handling_key_event_; |
67 // VKEY_PROCESSKEY event, OnCommit or OnPreedit{Start,Changed,End} dispatch | 77 |
68 // a VKEY_PROCESSKEY event instead. | 78 // Indicates if there is an ongoing composition text. |
69 // | 79 bool composing_text_; |
70 // Because of this hack, there could be chances that we accidentally dispatch | 80 |
71 // VKEY_PROCESSKEY events and other key events in out of order. | 81 // Indicates if the composition text is changed or deleted. |
72 // | 82 bool composition_changed_; |
73 // |allowed_to_fire_vkey_process_key_| is used not to dispatch a | 83 |
74 // VKEY_PROCESSKEY event twice for a single key event. | 84 // If it's true then all input method result received before the next key |
75 bool allowed_to_fire_vkey_process_key_; | 85 // event will be discarded. |
76 int vkey_processkey_flags_; | 86 bool suppress_next_result_; |
77 | 87 |
78 DISALLOW_COPY_AND_ASSIGN(InputMethodAuraLinux); | 88 DISALLOW_COPY_AND_ASSIGN(InputMethodAuraLinux); |
79 }; | 89 }; |
80 | 90 |
81 } // namespace ui | 91 } // namespace ui |
82 | 92 |
83 #endif // UI_BASE_IME_INPUT_METHOD_AURALINUX_H_ | 93 #endif // UI_BASE_IME_INPUT_METHOD_AURALINUX_H_ |
OLD | NEW |