From f31ff3a9dcd64ee3932f98b2d4e5ba91a8faa121 Mon Sep 17 00:00:00 2001 From: "timothy.lee" Date: Sat, 17 Nov 2012 10:08:52 +0800 Subject: [PATCH] - Support GetReadingString() API under TSF framework --- nvdaHelper/remote/ime.cpp | 35 ++++++++++++++++++++++++++++++++++- nvdaHelper/remote/tsf.cpp | 3 +++ nvdaHelper/remote/tsf.h | 1 + 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/nvdaHelper/remote/ime.cpp b/nvdaHelper/remote/ime.cpp index be002a85b..325da1d73 100644 --- a/nvdaHelper/remote/ime.cpp +++ b/nvdaHelper/remote/ime.cpp @@ -127,6 +127,32 @@ DWORD getIMEVersion(HKL kbd_layout, wchar_t* filename) { return version; } +bool getTIPFilename(REFCLSID clsid, WCHAR* filename, DWORD len) { + // Format registry path for CLSID + WCHAR reg_path[100]; + _snwprintf(reg_path, ARRAYSIZE(reg_path), + L"CLSID\\{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\\InProcServer32", + clsid.Data1, clsid.Data2, clsid.Data3, + clsid.Data4[0], clsid.Data4[1], clsid.Data4[2], clsid.Data4[3], + clsid.Data4[4], clsid.Data4[5], clsid.Data4[6], clsid.Data4[7]); + HKEY reg_key = NULL; + RegOpenKeyW(HKEY_CLASSES_ROOT, reg_path, ®_key); + if (!reg_key) return false; + DWORD type = REG_NONE; + DWORD l = 0; + bool result = false; + if ((ERROR_SUCCESS == RegQueryValueExW(reg_key, 0, 0, &type, 0, &l)) && + (type == REG_SZ) && (l > 0) && (len >= l)) { + if (ERROR_SUCCESS == + RegQueryValueExW(reg_key, 0, 0, 0, (LPBYTE)filename, &len)) { + filename[len] = '\0'; + result = true; + } + } + RegCloseKey(reg_key); + return result; +} + typedef UINT (WINAPI* GetReadingString_funcType)(HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT); void handleOpenStatus(HWND hwnd) { @@ -162,6 +188,13 @@ void handleReadingStringUpdate(HWND hwnd) { version=getIMEVersion(kbd_layout,filename); } } + else if(getTIPFilename(curTSFClsID, filename, MAX_PATH)) { + // Look up filename of active TIP + IMEFile=LoadLibrary(filename); + if(IMEFile) { + GetReadingString=(GetReadingString_funcType)GetProcAddress(IMEFile, "GetReadingString"); + } + } if(GetReadingString) { // Use GetReadingString() API if available UINT len = 0; @@ -397,7 +430,7 @@ static LRESULT handleIMEWindowMessage(HWND hwnd, UINT message, WPARAM wParam, LP break; case IMN_PRIVATE: - if(!isTSFThread(true)) handleReadingStringUpdate(hwnd); + handleReadingStringUpdate(hwnd); break; } break; diff --git a/nvdaHelper/remote/tsf.cpp b/nvdaHelper/remote/tsf.cpp index ba594afd4..8be6e07cc 100644 --- a/nvdaHelper/remote/tsf.cpp +++ b/nvdaHelper/remote/tsf.cpp @@ -26,6 +26,7 @@ http://www.gnu.org/licenses/old-licenses/gpl-2.0.html using namespace std; +CLSID curTSFClsID={0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}}; bool isUIElementMgrSafe=false; @@ -526,10 +527,12 @@ STDMETHODIMP TsfSink::OnEndEdit( STDMETHODIMP TsfSink::OnActivated(REFCLSID rClsID, REFGUID rProfGUID, BOOL activated) { const CLSID null_clsid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}}; if (!activated) { + curTSFClsID=null_clsid; hasActiveProfile=false; return S_OK; } //Re-enable IME conversion mode update reporting as input lang change window message disabled it while completing the switch + curTSFClsID=rClsID; disableIMEConversionModeUpdateReporting=false; if (IsEqualCLSID(rClsID, null_clsid)) { hasActiveProfile = false; diff --git a/nvdaHelper/remote/tsf.h b/nvdaHelper/remote/tsf.h index e0109bdcb..09dd672c4 100644 --- a/nvdaHelper/remote/tsf.h +++ b/nvdaHelper/remote/tsf.h @@ -19,5 +19,6 @@ void TSF_inProcess_initialize(); void TSF_inProcess_terminate(); void TSF_thread_detached(); bool isTSFThread(bool checkProfile); +extern CLSID curTSFClsID; #endif -- 2.11.0