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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
// Copyright (c) 2011 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 UI_BASE_IME_INPUT_METHOD_WIN_H_
#define UI_BASE_IME_INPUT_METHOD_WIN_H_
#include <windows.h>
#include <string>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "ui/base/ime/input_method_base.h"
#include "ui/base/ime/win/imm32_manager.h"
namespace ui {
// A common InputMethod implementation based on IMM32.
class UI_BASE_EXPORT InputMethodWin : public InputMethodBase {
public:
InputMethodWin(internal::InputMethodDelegate* delegate,
HWND toplevel_window_handle);
// Overridden from InputMethod:
virtual void Init(bool focused) OVERRIDE;
virtual void OnFocus() OVERRIDE;
virtual void OnBlur() OVERRIDE;
virtual bool OnUntranslatedIMEMessage(const base::NativeEvent& event,
NativeEventResult* result) OVERRIDE;
virtual bool DispatchKeyEvent(const ui::KeyEvent& event) OVERRIDE;
virtual void OnTextInputTypeChanged(const TextInputClient* client) OVERRIDE;
virtual void OnCaretBoundsChanged(const TextInputClient* client) OVERRIDE;
virtual void CancelComposition(const TextInputClient* client) OVERRIDE;
virtual void OnInputLocaleChanged() OVERRIDE;
virtual std::string GetInputLocale() OVERRIDE;
virtual bool IsActive() OVERRIDE;
virtual bool IsCandidatePopupOpen() const OVERRIDE;
protected:
// Overridden from InputMethodBase:
// If a derived class overrides this method, it should call parent's
// implementation.
virtual void OnWillChangeFocusedClient(TextInputClient* focused_before,
TextInputClient* focused) OVERRIDE;
virtual void OnDidChangeFocusedClient(TextInputClient* focused_before,
TextInputClient* focused) OVERRIDE;
private:
// For both WM_CHAR and WM_SYSCHAR
LRESULT OnChar(HWND window_handle,
UINT message,
WPARAM wparam,
LPARAM lparam,
BOOL* handled);
LRESULT OnImeSetContext(HWND window_handle,
UINT message,
WPARAM wparam,
LPARAM lparam,
BOOL* handled);
LRESULT OnImeStartComposition(HWND window_handle,
UINT message,
WPARAM wparam,
LPARAM lparam,
BOOL* handled);
LRESULT OnImeComposition(HWND window_handle,
UINT message,
WPARAM wparam,
LPARAM lparam,
BOOL* handled);
LRESULT OnImeEndComposition(HWND window_handle,
UINT message,
WPARAM wparam,
LPARAM lparam,
BOOL* handled);
LRESULT OnImeNotify(UINT message,
WPARAM wparam,
LPARAM lparam,
BOOL* handled);
// Some IMEs rely on WM_IME_REQUEST message even when TSF is enabled. So
// OnImeRequest (and its actual implementations as OnDocumentFeed,
// OnReconvertString, and OnQueryCharPosition) are placed in this base class.
LRESULT OnImeRequest(UINT message,
WPARAM wparam,
LPARAM lparam,
BOOL* handled);
LRESULT OnDocumentFeed(RECONVERTSTRING* reconv);
LRESULT OnReconvertString(RECONVERTSTRING* reconv);
LRESULT OnQueryCharPosition(IMECHARPOSITION* char_positon);
// Returns the window handle to which |text_input_client| is bound.
// On Aura environment, |toplevel_window_handle_| is always returned.
HWND GetAttachedWindowHandle(const TextInputClient* text_input_client) const;
// Returns true if the Win32 native window bound to |client| is considered
// to be ready for receiving keyboard input.
bool IsWindowFocused(const TextInputClient* client) const;
bool DispatchFabricatedKeyEvent(const ui::KeyEvent& event);
// Asks the client to confirm current composition text.
void ConfirmCompositionText();
// Enables or disables the IME according to the current text input type.
void UpdateIMEState();
// Windows IMM32 wrapper.
// (See "ui/base/ime/win/ime_input.h" for its details.)
ui::IMM32Manager imm32_manager_;
// The toplevel window handle.
// On non-Aura environment, this value is not used and always NULL.
const HWND toplevel_window_handle_;
// Name of the current input locale.
std::string locale_;
// The new text direction and layout alignment requested by the user by
// pressing ctrl-shift. It'll be sent to the text input client when the key
// is released.
base::i18n::TextDirection pending_requested_direction_;
// Represents if WM_CHAR[wparam=='\r'] should be dispatched to the focused
// text input client or ignored silently. This flag is introduced as a quick
// workaround against crbug.com/319100
// TODO(yukawa, IME): Figure out long-term solution.
bool accept_carriage_return_;
// Indicates if the current input locale has an IME.
bool active_;
// True when an IME should be allowed to process key events.
bool enabled_;
// True if we know for sure that a candidate window is open.
bool is_candidate_popup_open_;
// Window handle where composition is on-going. NULL when there is no
// composition.
HWND composing_window_handle_;
DISALLOW_COPY_AND_ASSIGN(InputMethodWin);
};
} // namespace ui
#endif // UI_BASE_IME_INPUT_METHOD_WIN_H_
|