OSDN Git Service

- Support GetReadingString() API under TSF framework
authortimothy.lee <timothy.lee@exodus.worldlight.com.hk>
Sat, 17 Nov 2012 02:08:52 +0000 (10:08 +0800)
committertimothy.lee <timothy.lee@exodus.worldlight.com.hk>
Sat, 17 Nov 2012 02:08:52 +0000 (10:08 +0800)
nvdaHelper/remote/ime.cpp
nvdaHelper/remote/tsf.cpp
nvdaHelper/remote/tsf.h

index be002a8..325da1d 100644 (file)
@@ -127,6 +127,32 @@ DWORD getIMEVersion(HKL kbd_layout, wchar_t* filename) {
        return version;\r
 }\r
 \r
+bool getTIPFilename(REFCLSID clsid, WCHAR* filename, DWORD len) {\r
+       // Format registry path for CLSID\r
+       WCHAR reg_path[100];\r
+       _snwprintf(reg_path, ARRAYSIZE(reg_path),\r
+               L"CLSID\\{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\\InProcServer32",\r
+               clsid.Data1, clsid.Data2, clsid.Data3,\r
+               clsid.Data4[0], clsid.Data4[1], clsid.Data4[2], clsid.Data4[3],\r
+               clsid.Data4[4], clsid.Data4[5], clsid.Data4[6], clsid.Data4[7]);\r
+       HKEY reg_key = NULL;\r
+       RegOpenKeyW(HKEY_CLASSES_ROOT, reg_path, &reg_key);\r
+       if (!reg_key)  return false;\r
+       DWORD type = REG_NONE;\r
+       DWORD l = 0;\r
+       bool  result = false;\r
+       if ((ERROR_SUCCESS == RegQueryValueExW(reg_key, 0, 0, &type, 0, &l)) &&\r
+                       (type == REG_SZ) && (l > 0) && (len >= l)) {\r
+               if (ERROR_SUCCESS ==\r
+                               RegQueryValueExW(reg_key, 0, 0, 0, (LPBYTE)filename, &len)) {\r
+                       filename[len] = '\0';\r
+                       result = true;\r
+               }\r
+       }\r
+       RegCloseKey(reg_key);\r
+       return result;\r
+}\r
+\r
 typedef UINT (WINAPI* GetReadingString_funcType)(HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT);\r
 \r
 void handleOpenStatus(HWND hwnd) {\r
@@ -162,6 +188,13 @@ void handleReadingStringUpdate(HWND hwnd) {
                        version=getIMEVersion(kbd_layout,filename);\r
                }\r
        }\r
+       else if(getTIPFilename(curTSFClsID, filename, MAX_PATH)) {\r
+               // Look up filename of active TIP\r
+               IMEFile=LoadLibrary(filename);\r
+               if(IMEFile) {\r
+                       GetReadingString=(GetReadingString_funcType)GetProcAddress(IMEFile, "GetReadingString");\r
+               }\r
+       }\r
        if(GetReadingString) {\r
                // Use GetReadingString() API if available\r
                UINT   len = 0;\r
@@ -397,7 +430,7 @@ static LRESULT handleIMEWindowMessage(HWND hwnd, UINT message, WPARAM wParam, LP
                                        break;\r
 \r
                                case IMN_PRIVATE:\r
-                                       if(!isTSFThread(true)) handleReadingStringUpdate(hwnd);\r
+                                       handleReadingStringUpdate(hwnd);\r
                                        break;\r
                        }\r
                        break;\r
index ba594af..8be6e07 100644 (file)
@@ -26,6 +26,7 @@ http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 \r
 using namespace std;\r
 \r
+CLSID curTSFClsID={0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
 bool isUIElementMgrSafe=false;\r
 \r
 \r
@@ -526,10 +527,12 @@ STDMETHODIMP TsfSink::OnEndEdit(
 STDMETHODIMP TsfSink::OnActivated(REFCLSID rClsID, REFGUID rProfGUID, BOOL activated) {\r
        const CLSID null_clsid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
        if (!activated) {\r
+               curTSFClsID=null_clsid;\r
                hasActiveProfile=false;\r
                return S_OK;\r
        }\r
        //Re-enable IME conversion mode update reporting as input lang change window message disabled it while completing the switch\r
+       curTSFClsID=rClsID;\r
        disableIMEConversionModeUpdateReporting=false;\r
        if (IsEqualCLSID(rClsID, null_clsid)) {\r
                hasActiveProfile = false;\r
index e0109bd..09dd672 100644 (file)
@@ -19,5 +19,6 @@ void TSF_inProcess_initialize();
 void TSF_inProcess_terminate();\r
 void TSF_thread_detached();\r
 bool isTSFThread(bool checkProfile);\r
+extern CLSID curTSFClsID;\r
 \r
 #endif\r