Index: ui/base/ime/win/tsf_input_scope.cc |
diff --git a/ui/base/ime/win/tsf_input_scope.cc b/ui/base/ime/win/tsf_input_scope.cc |
index dac701b0a8b85e41694515b1a90ec0affc81653f..62ad5e8350e499a52d80a364bcd1dfcb7653496a 100644 |
--- a/ui/base/ime/win/tsf_input_scope.cc |
+++ b/ui/base/ime/win/tsf_input_scope.cc |
@@ -87,16 +87,13 @@ class TSFInputScope : public ITfInputScope { |
DISALLOW_COPY_AND_ASSIGN(TSFInputScope); |
}; |
-typedef HRESULT (WINAPI *SetInputScopeFunc)(HWND window_handle, |
- InputScope input_scope); |
- |
-SetInputScopeFunc g_set_input_scope = NULL; |
-bool g_get_proc_done = false; |
- |
-SetInputScopeFunc GetSetInputScope() { |
+template <typename Proc> |
+Proc GetTSFProcedure(LPCSTR procedure_name) { |
Yohei Yukawa
2013/07/31 05:47:35
We prefer to use |const wchar_t *| instead of |pro
yoichio
2013/07/31 06:13:54
Done.
|
+ static Proc procedure = NULL; |
+ static bool get_proc_done = false; |
// Thread safety is not required. |
- if (!g_get_proc_done) { |
- g_get_proc_done = true; |
+ if (!get_proc_done) { |
+ get_proc_done = true; |
// For stability reasons, we do not support Windows XP. |
if (base::win::GetVersion() < base::win::VERSION_VISTA) |
@@ -104,15 +101,18 @@ SetInputScopeFunc GetSetInputScope() { |
HMODULE module = NULL; |
if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_PIN, L"msctf.dll", |
- &module)) { |
- return NULL; |
+ &module)) { |
Yohei Yukawa
2013/07/31 05:47:35
nit: indent.
yoichio
2013/07/31 06:13:54
Done.
|
+ return NULL; |
Yohei Yukawa
2013/07/31 05:47:35
nit: indent.
yoichio
2013/07/31 06:13:54
Done.
|
} |
- g_set_input_scope = reinterpret_cast<SetInputScopeFunc>( |
- GetProcAddress(module, "SetInputScope")); |
+ |
+ procedure = reinterpret_cast<Proc>(GetProcAddress(module, procedure_name)); |
} |
- return g_set_input_scope; |
+ return procedure; |
} |
+typedef HRESULT (WINAPI *SetInputScopeFunc)(HWND window_handle, |
+ InputScope input_scope); |
+ |
InputScope GetInputScopeType(TextInputType text_input_type) { |
// Following mapping is based in IE10 on Windows 8. |
switch (text_input_type) { |
@@ -133,6 +133,40 @@ InputScope GetInputScopeType(TextInputType text_input_type) { |
} |
} |
+typedef HRESULT (WINAPI *SetInputScopesFunc)(HWND window_handle, |
+ const InputScope *pInputScopes, |
+ UINT cInputScopes, |
+ WCHAR **ppszPhraseList, |
+ UINT cPhrases, |
+ WCHAR *pszRegExp, |
+ WCHAR *pszSRGS); |
+ |
+InputScope GetInputScopeType(TextInputMode text_input_mode) { |
+ switch (text_input_mode) { |
+ case TEXT_INPUT_MODE_VERBATIM: |
Yohei Yukawa
2013/07/31 05:47:35
Have you tested if IS_ALPHANUMERIC_HALFWIDTH is su
yoichio
2013/07/31 06:13:54
TEXT_INPUT_MODE_VERBATIM corresponds to inputmode=
Yohei Yukawa
2013/07/31 06:23:19
So what happens when MS-IME finds IS_ALPHANUMERIC_
|
+ case TEXT_INPUT_MODE_LATIN: |
+ case TEXT_INPUT_MODE_LATIN_NAME: |
+ case TEXT_INPUT_MODE_LATIN_PROSE: |
+ return IS_ALPHANUMERIC_HALFWIDTH; |
+ case TEXT_INPUT_MODE_FULL_WIDTH_LATIN: |
+ return IS_ALPHANUMERIC_FULLWIDTH; |
+ case TEXT_INPUT_MODE_KANA: |
+ return IS_HIRAGANA; |
+ case TEXT_INPUT_MODE_KATAKANA: |
+ return IS_KATAKANA_FULLWIDTH; |
+ case TEXT_INPUT_MODE_NUMERIC: |
+ return IS_NUMBER; |
+ case TEXT_INPUT_MODE_TEL: |
+ return IS_TELEPHONE_FULLTELEPHONENUMBER; |
+ case TEXT_INPUT_MODE_EMAIL: |
+ return IS_EMAIL_SMTPEMAILADDRESS; |
+ case TEXT_INPUT_MODE_URL: |
+ return IS_URL; |
+ default: |
+ return IS_DEFAULT; |
+ } |
+} |
+ |
} // namespace |
ITfInputScope* CreateInputScope(TextInputType text_input_type) { |
@@ -141,10 +175,27 @@ ITfInputScope* CreateInputScope(TextInputType text_input_type) { |
void SetInputScopeForTsfUnawareWindow(HWND window_handle, |
TextInputType text_input_type) { |
- SetInputScopeFunc set_input_scope = GetSetInputScope(); |
+ SetInputScopeFunc set_input_scope = |
+ GetTSFProcedure<SetInputScopeFunc> ("SetInputScope"); |
Yohei Yukawa
2013/07/31 05:47:35
GetTSFProcedure<SetInputScopeFunc>("SetInputScope"
yoichio
2013/07/31 06:13:54
Done.
|
if (set_input_scope) |
set_input_scope(window_handle, GetInputScopeType(text_input_type)); |
} |
+void SetInputScopesForTsfUnawareWindow( |
+ HWND window_handle, |
+ TextInputType text_input_type, |
+ TextInputMode text_input_mode) { |
+ SetInputScopesFunc set_input_scopes = |
+ GetTSFProcedure<SetInputScopesFunc> ("SetInputScopes"); |
+ if (set_input_scopes) { |
+ InputScope input_scopes[] = { |
+ GetInputScopeType(text_input_type), |
Yohei Yukawa
2013/07/31 05:47:35
We should consider if |GetInputScopeType(text_inpu
yoichio
2013/07/31 06:13:54
Done.
|
+ GetInputScopeType(text_input_mode), |
+ }; |
+ |
+ set_input_scopes(window_handle, input_scopes, 2, NULL, 0, NULL, NULL); |
+ } |
+} |
+ |
} // namespace tsf_inputscope |
} // namespace ui |