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_
|