-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTextService.h
More file actions
313 lines (268 loc) · 12.3 KB
/
TextService.h
File metadata and controls
313 lines (268 loc) · 12.3 KB
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
//////////////////////////////////////////////////////////////////////
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
// TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// TextService.h
//
// CTextService declaration.
//
//////////////////////////////////////////////////////////////////////
#ifndef TEXTSERVICE_H
#define TEXTSERVICE_H
#include <cstdint>
#include <chrono>
#include <condition_variable>
#include <msctf.h>
#include <mutex>
#include <string>
#include <thread>
#include <vector>
#include "CompositionState.h"
#include "ComposingText.h"
#include "InputModeState.h"
#include "InputScopeEvaluator.h"
#include "KanaKanjiConverter.h"
#include "KeymapStore.h"
#include "RomajiKanaConverter.h"
class CLangBarItemButton;
class CCandidateList;
class CTextService : public ITfTextInputProcessorEx,
public ITfThreadMgrEventSink,
public ITfThreadFocusSink,
public ITfCompartmentEventSink,
public ITfTextEditSink,
public ITfKeyEventSink,
public ITfCompositionSink,
public ITfDisplayAttributeProvider
{
public:
CTextService();
~CTextService();
// IUnknown
STDMETHODIMP QueryInterface(REFIID riid, void** ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// ITfTextInputProcessor
STDMETHODIMP Activate(ITfThreadMgr* pThreadMgr, TfClientId tfClientId);
STDMETHODIMP Deactivate();
// ITfTextInputProcessorEx
STDMETHODIMP ActivateEx(ITfThreadMgr* pThreadMgr, TfClientId tfClientId, DWORD dwFlags);
// ITfThreadMgrEventSink
STDMETHODIMP OnInitDocumentMgr(ITfDocumentMgr* pDocMgr);
STDMETHODIMP OnUninitDocumentMgr(ITfDocumentMgr* pDocMgr);
STDMETHODIMP OnSetFocus(ITfDocumentMgr* pDocMgrFocus, ITfDocumentMgr* pDocMgrPrevFocus);
STDMETHODIMP OnPushContext(ITfContext* pContext);
STDMETHODIMP OnPopContext(ITfContext* pContext);
STDMETHODIMP OnSetThreadFocus();
STDMETHODIMP OnKillThreadFocus();
STDMETHODIMP OnChange(REFGUID rguid);
// ITfTextEditSink
STDMETHODIMP OnEndEdit(ITfContext* pContext, TfEditCookie ecReadOnly, ITfEditRecord* pEditRecord);
// ITfKeyEventSink
STDMETHODIMP OnSetFocus(BOOL fForeground);
STDMETHODIMP OnTestKeyDown(ITfContext* pContext, WPARAM wParam, LPARAM lParam, BOOL* pfEaten);
STDMETHODIMP OnKeyDown(ITfContext* pContext, WPARAM wParam, LPARAM lParam, BOOL* pfEaten);
STDMETHODIMP OnTestKeyUp(ITfContext* pContext, WPARAM wParam, LPARAM lParam, BOOL* pfEaten);
STDMETHODIMP OnKeyUp(ITfContext* pContext, WPARAM wParam, LPARAM lParam, BOOL* pfEaten);
STDMETHODIMP OnPreservedKey(ITfContext* pContext, REFGUID rguid, BOOL* pfEaten);
// ITfCompositionSink
STDMETHODIMP OnCompositionTerminated(TfEditCookie ecWrite, ITfComposition* pComposition);
// ITfDisplayAttributeProvider
STDMETHODIMP EnumDisplayAttributeInfo(IEnumTfDisplayAttributeInfo** ppEnum);
STDMETHODIMP GetDisplayAttributeInfo(REFGUID guidInfo, ITfDisplayAttributeInfo** ppInfo);
// CClassFactory factory callback
static HRESULT CreateInstance(IUnknown* pUnkOuter, REFIID riid, void** ppvObj);
ITfThreadMgr* _GetThreadMgr() { return _pThreadMgr; }
TfClientId _GetClientId() { return _tfClientId; }
ITfComposition* _GetComposition() { return _pComposition; }
CCandidateList* _GetCandidateList() { return _pCandidateList; }
CompositionState& _GetCompositionState() { return _compositionState; }
const CompositionState& _GetCompositionState() const { return _compositionState; }
// utility function for compartment
BOOL _IsKeyboardDisabled();
BOOL _IsKeyboardOpen();
HRESULT _SetKeyboardOpen(BOOL fOpen);
// ★ LanguageBar からも使うコンパートメント更新ヘルパー(public にする)★
HRESULT _SetCompartment(REFGUID rguid, const VARIANT* pvar);
// functions for the composition object.
void _StartComposition(ITfContext* pContext);
void _EndComposition(ITfContext* pContext);
void _TerminateComposition(TfEditCookie ec, ITfContext* pContext);
BOOL _IsComposing();
void _SetComposition(ITfComposition* pComposition);
HRESULT _UpdateCompositionText(TfEditCookie ec, ITfContext* pContext);
HRESULT _ClearCompositionText(TfEditCookie ec, ITfContext* pContext);
void _ResetCompositionState();
// key event handlers.
HRESULT _HandleCharacterKey(TfEditCookie ec, ITfContext* pContext, WPARAM wParam, LPARAM lParam);
HRESULT _HandleShiftKey(TfEditCookie ec, ITfContext* pContext);
HRESULT _HandleArrowKey(TfEditCookie ec, ITfContext* pContext, WPARAM wParam);
HRESULT _HandleShiftArrowKey(TfEditCookie ec, ITfContext* pContext, WPARAM wParam);
HRESULT _HandleReturnKey(TfEditCookie ec, ITfContext* pContext);
HRESULT _HandleSpaceKey(TfEditCookie ec, ITfContext* pContext);
HRESULT _HandleBackspaceKey(TfEditCookie ec, ITfContext* pContext);
HRESULT _HandleDeleteKey(TfEditCookie ec, ITfContext* pContext);
HRESULT _HandleEscapeKey(TfEditCookie ec, ITfContext* pContext);
HRESULT _HandleModeToggleKey(TfEditCookie ec, ITfContext* pContext);
HRESULT _SelectNextCandidate(TfEditCookie ec, ITfContext* pContext);
HRESULT _SelectPrevCandidate(TfEditCookie ec, ITfContext* pContext);
HRESULT _SelectNextCandidatePage(TfEditCookie ec, ITfContext* pContext);
HRESULT _SelectPrevCandidatePage(TfEditCookie ec, ITfContext* pContext);
HRESULT _SelectFirstCandidate(TfEditCookie ec, ITfContext* pContext);
HRESULT _SelectLastCandidate(TfEditCookie ec, ITfContext* pContext);
HRESULT _CommitCurrentCandidate(TfEditCookie ec, ITfContext* pContext);
HRESULT _CancelConversion(TfEditCookie ec, ITfContext* pContext);
HRESULT _ShowCandidateList(TfEditCookie ec, ITfContext* pContext);
void _CloseCandidateList();
HRESULT _InvokeKeyHandler(ITfContext* pContext, WPARAM wParam, LPARAM lParam);
HRESULT _HandleKeymapCommand(TfEditCookie ec, ITfContext* pContext, const std::wstring& command, WPARAM wParam, LPARAM lParam);
bool _TryGetKeymapCommand(WPARAM wParam, LPARAM lParam, std::wstring* command) const;
void _ClearCompositionDisplayAttributes(TfEditCookie ec, ITfContext* pContext);
BOOL _SetCompositionDisplayAttributes(TfEditCookie ec, ITfContext* pContext, TfGuidAtom gaDisplayAttribute);
BOOL _InitDisplayAttributeGuidAtom();
// 入力モードの操作
void SetUserInputMode(InputMode mode);
InputMode GetUserInputMode() const;
InputMode GetEffectiveInputMode() const;
void SetLiveConversionEnabled(BOOL enabled);
BOOL IsLiveConversionEnabled() const;
int GetCandidatePageSize() const;
BOOL HasInputScopeOverride() const;
void SetInputScopeOverride(InputMode mode);
void ClearInputScopeOverride();
// 既存呼び出し用の互換アクセサ
void SetInputMode(InputMode mode) { SetUserInputMode(mode); }
void ToggleInputMode()
{
if (GetUserInputMode() == InputMode::Hiragana)
{
SetUserInputMode(InputMode::DirectInput);
}
else
{
SetUserInputMode(InputMode::Hiragana);
}
}
InputMode GetInputMode() const { return GetEffectiveInputMode(); }
void SetCompositionPhase(CompositionPhase phase);
CompositionPhase GetCompositionPhase() const;
// InputScope 評価用の内部ヘルパー。
// TSF の read edit session から呼ばれるため public に公開する。
void _ApplyInputScopeOverride(ITfContext* pContext, TfEditCookie ec);
void _MarkInternalEdit();
InputMode _GetCompositionInputMode() const;
void _ApplyCompletedLiveConversionPreview();
void _PaintLiveConversionSourceView(HDC hdc, const RECT& bounds) const;
void _UpdateLiveConversionSourceViewFromRect(const RECT& rc);
private:
BOOL _InitLiveConversionAsync();
void _UninitLiveConversionAsync();
void _QueueLiveConversionRequest(const std::wstring& reading, const std::wstring& leftContext);
void _CancelLiveConversionRequests();
bool _CanUseLiveConversionPreview() const;
BOOL _InitLiveConversionSourceView();
void _UninitLiveConversionSourceView();
void _HideLiveConversionSourceView();
void _RequestLiveConversionSourceViewUpdate(ITfContext* pContext, ITfRange* pRangeComposition);
bool _IsLiveConversionBusyForCurrentReading(const std::wstring& reading);
std::wstring _GetLeftContextText(TfEditCookie ec, ITfRange* pRangeComposition) const;
void _ReloadSettings();
// initialize and uninitialize ThreadMgrEventSink.
BOOL _InitThreadMgrEventSink();
void _UninitThreadMgrEventSink();
BOOL _InitThreadFocusSink();
void _UninitThreadFocusSink();
BOOL _InitCompartmentEventSink();
void _UninitCompartmentEventSink();
// initialize TextEditSink.
BOOL _InitTextEditSink(ITfDocumentMgr* pDocMgr);
// initialize and uninitialize LanguageBar Item.
BOOL _InitLanguageBar();
void _UninitLanguageBar();
void _UpdateLanguageBar();
void _UpdateLanguageBarCompartments();
// initialize and uninitialize KeyEventSink.
BOOL _InitKeyEventSink();
void _UninitKeyEventSink();
// initialize and uninitialize PreservedKey.
BOOL _InitPreservedKey();
void _UninitPreservedKey();
// utility function for KeyEventSink
BOOL _IsKeyEaten(ITfContext* pContext, WPARAM wParam, LPARAM lParam);
std::wstring _GetKeymapStatus() const;
void _UpdateInputScopeForDocumentMgr(ITfDocumentMgr* pDocMgr);
void _KeyboardOpenCloseChanged();
void _KeyboardInputConversionChanged();
//
// state
//
ITfThreadMgr* _pThreadMgr;
TfClientId _tfClientId;
// The cookie of ThreadMgrEventSink
DWORD _dwThreadMgrEventSinkCookie;
DWORD _dwThreadFocusSinkCookie;
DWORD _dwCompartmentEventSinkOpenCloseCookie;
DWORD _dwCompartmentEventSinkInputmodeConversionCookie;
//
// private variables for TextEditSink
//
ITfContext* _pTextEditSinkContext;
DWORD _dwTextEditSinkCookie;
// LangBar items
CLangBarItemButton* _pLangBarItemBrand; // ブランドアイコン
CLangBarItemButton* _pLangBarItemMode; // IME モードアイコン
// the current composition object.
ITfComposition* _pComposition;
// guidatom for the display attibute.
TfGuidAtom _gaDisplayAttributeInput;
TfGuidAtom _gaDisplayAttributeConverted;
TfGuidAtom _gaDisplayAttributeFocusedConverted;
// the candidate list object.
CCandidateList* _pCandidateList;
CompositionState _compositionState;
ComposingText _composingText;
InputModeState _inputModeState;
InputScopeEvaluator _inputScopeEvaluator;
KanaKanjiConverter _kanaKanjiConverter;
RomajiKanaConverter _romajiConverter;
BOOL _liveConversionEnabled;
BOOL _liveConversionSourceViewEnabled;
int _candidatePageSize;
BOOL _pendingAlphabeticShift;
HWND _liveConversionWindow;
HWND _liveConversionSourceViewWindow;
std::thread _liveConversionWorker;
std::mutex _liveConversionMutex;
std::condition_variable _liveConversionCv;
bool _liveConversionWorkerRunning;
bool _liveConversionHasPendingRequest;
int _liveConversionActiveJobs;
std::wstring _liveConversionPendingReading;
std::wstring _liveConversionPendingLeftContext;
std::wstring _liveConversionLatestRequestedReading;
std::wstring _liveConversionLatestRequestedLeftContext;
std::chrono::steady_clock::time_point _liveConversionLatestRequestedAt;
std::wstring _liveConversionCompletedReading;
std::wstring _liveConversionCompletedLeftContext;
std::vector<ConversionCandidate> _liveConversionCompletedCandidates;
std::uint64_t _liveConversionLatestRequestedVersion;
std::uint64_t _liveConversionCompletedVersion;
bool _liveConversionCompletedIsFinal;
std::wstring _liveZenzCandidateReading;
std::wstring _liveZenzCandidateLeftContext;
std::wstring _liveZenzCandidateSurface;
std::uint64_t _liveZenzCandidateVersion;
bool _liveZenzCandidateHasFinal;
std::wstring _liveConversionSourceViewText;
bool _liveConversionSourceViewBusy;
std::wstring _converterSettingsSignature;
SumireKeymap::RuntimeKeymap _keymap;
// 現在の composition セッション段階
CompositionPhase _compositionPhase;
LONG _pendingInternalEdits;
LONG _cRef; // COM ref count
};
#endif // TEXTSERVICE_H