OSDN Git Service

Add GetIMEInfo to CProfile. Make InitApplicationList uses it.
authorco <cogood@gmail.com>
Tue, 5 Jul 2011 03:12:33 +0000 (12:12 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Wed, 6 Jul 2011 02:53:23 +0000 (11:53 +0900)
GetIMEInfo uses TSF to get the description of IME if IMM32 isn't
available.

xkeymacs/profile.cpp
xkeymacs/profile.h

index fc8d930..7145944 100644 (file)
@@ -10,7 +10,7 @@
 #include <Imm.h>\r
 #include <Shlwapi.h>\r
 #include <TlHelp32.h>\r
-\r
+#include <msctf.h>\r
 \r
 #ifdef _DEBUG\r
 #undef THIS_FILE\r
@@ -992,11 +992,12 @@ void CProfile::InitApplicationList(CComboBox *const cApplicationList)
 \r
        EnumWindows(EnumWindowsProc, (LPARAM)cApplicationList);\r
 \r
+       CString szListItem;\r
        for (int i = 0; i < MAX_APP; ++i) {\r
                CString szApplicationName       = m_Data[i].GetApplicationName();\r
                CString szApplicationTitle      = m_Data[i].GetApplicationTitle();\r
-\r
-               CString szListItem;\r
+               if (szApplicationName == _T("IME")) // IDS_IME_FILE_NAME\r
+                       continue;\r
                szListItem.Format(IDS_APPLICATION_LIST_ITEM, szApplicationTitle, szApplicationName);\r
                if (IsNotSameString(cApplicationList, szListItem)\r
                 && !IsDefault(szApplicationName)\r
@@ -1006,42 +1007,12 @@ void CProfile::InitApplicationList(CComboBox *const cApplicationList)
                }\r
        }\r
 \r
-       // Add IME\r
-       HKL hKL = GetKeyboardLayout(0);\r
-       if (ImmIsIME(hKL)) {\r
-               LPTSTR szIMEDescription = NULL;\r
-               UINT nIMEDescription = ImmGetDescription(hKL, NULL, 0);\r
-               if (nIMEDescription) {\r
-                       nIMEDescription += sizeof(TCHAR);       // for NULL\r
-                       if ((szIMEDescription = new TCHAR[nIMEDescription]) != NULL) {\r
-                               ImmGetDescription(hKL, szIMEDescription, nIMEDescription);\r
-                       }\r
-//                     CUtils::Log(_T("nIMEDescription = %d, szIMEDescription = _%s_"), nIMEDescription, szIMEDescription);\r
-               }\r
-\r
-               LPTSTR szIMEFileName = NULL;\r
-               UINT nIMEFileName = ImmGetIMEFileName(hKL, NULL, 0);\r
-               if (nIMEFileName) {\r
-                       nIMEFileName += sizeof(TCHAR);\r
-                       if ((szIMEFileName = new TCHAR[nIMEFileName]) != NULL) {\r
-                               ImmGetIMEFileName(hKL, szIMEFileName, nIMEFileName);\r
-                       }\r
-//                     CUtils::Log(_T("nIMEFileName = %d, szIMEFileName = _%s_"), nIMEFileName, szIMEFileName);\r
-               }\r
-\r
-               CString szIMETitle;\r
-               CString szIME(MAKEINTRESOURCE(IDS_IME_FILE_NAME));\r
-               szIMETitle.Format(IDS_APPLICATION_LIST_ITEM, szIMEDescription ? szIMEDescription : szIME, szIMEFileName ? szIMEFileName : szIME);\r
-//             CUtils::Log(_T("szIMETitle = _%s_, szIMEDescription = _%s_, szIMEFileName = _%s_"), szIMETitle, szIMEDescription, szIMEFileName);\r
-               if (IsNotSameString(cApplicationList, szIMETitle)) {\r
-                       cApplicationList->AddString(szIMETitle);\r
-               }\r
-\r
-               delete[] szIMEDescription;\r
-               szIMEDescription = NULL;\r
-               delete[] szIMEFileName;\r
-               szIMEFileName = NULL;\r
-       }\r
+       TCHAR szFilename[MAX_PATH];\r
+       TCHAR szDescription[WINDOW_TEXT_LENGTH];\r
+       GetIMEInfo(szFilename, szDescription);\r
+       szListItem.Format(IDS_APPLICATION_LIST_ITEM, szDescription, szFilename);\r
+       if (IsNotSameString(cApplicationList, szListItem))\r
+               cApplicationList->AddString(szListItem);\r
 \r
        // Add Dialog\r
        cApplicationList->InsertString(0, CString(MAKEINTRESOURCE(IDS_DIALOG_TITLE)));\r
@@ -1051,6 +1022,48 @@ void CProfile::InitApplicationList(CComboBox *const cApplicationList)
        cApplicationList->SelectString(-1, CString(MAKEINTRESOURCE(IDS_DEFAULT_TITLE)));\r
 }\r
 \r
+void CProfile::GetIMEInfo(const LPTSTR szFilename, const LPTSTR szDescription)\r
+{\r
+       _tcscpy_s(szFilename, MAX_PATH, _T("IME")); // IDS_IME_FILE_NAME;\r
+       _tcscpy_s(szDescription, WINDOW_TEXT_LENGTH, _T("Input Method Editor"));\r
+       HKL hKL = GetKeyboardLayout(0);\r
+       if (!ImmIsIME(hKL))\r
+               return;\r
+       TCHAR buf[MAX_PATH]; // larger than WINDOW_TEXT_LENGTH\r
+       if (ImmGetDescription(hKL, buf, WINDOW_TEXT_LENGTH)) {\r
+               _tcscpy_s(szDescription, WINDOW_TEXT_LENGTH, buf);\r
+               goto filename;\r
+       }\r
+       // try TSF\r
+       CoInitialize(NULL);\r
+       HRESULT hr;\r
+       ITfInputProcessorProfiles *pProfiles;\r
+       hr = CoCreateInstance(CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_INPROC_SERVER, IID_ITfInputProcessorProfiles, reinterpret_cast<LPVOID*>(&pProfiles));\r
+       if (SUCCEEDED(hr)) {\r
+               const LANGID langid = GetUserDefaultLangID();\r
+               CLSID clsid;\r
+               GUID guid;\r
+               hr = pProfiles->GetDefaultLanguageProfile(langid, GUID_TFCAT_TIP_KEYBOARD, &clsid, &guid);\r
+               if (SUCCEEDED(hr)) {\r
+                       BSTR bstr;\r
+                       hr = pProfiles->GetLanguageProfileDescription(clsid, langid, guid, &bstr);\r
+                       if (SUCCEEDED(hr)) {\r
+#ifdef _MBCS\r
+                               WideCharToMultiByte(CP_ACP, 0, bstr, -1, szDescription, MAX_PATH, NULL, NULL);\r
+#else\r
+                               wcscpy_s(szDescription, WINDOW_TEXT_LENGTH, bstr);\r
+#endif\r
+                               SysFreeString(bstr);\r
+                       }\r
+               }\r
+               pProfiles->Release();\r
+       }\r
+       CoUninitialize();\r
+filename:\r
+       if (ImmGetIMEFileName(hKL, buf, MAX_PATH))\r
+               _tcscpy_s(szFilename, MAX_PATH, buf);\r
+}\r
+\r
 void CProfile::GetTaskList()\r
 {\r
        ZeroMemory(m_TaskList, sizeof(m_TaskList));\r
index 46e5664..1044b6e 100644 (file)
@@ -91,6 +91,7 @@ private:
        static CString WriteKeyBind(int nCommandType, int nKey);\r
        static void LoadRegistory();\r
        static void SaveRegistory();\r
+       static void GetIMEInfo(const LPTSTR szFilename, const LPTSTR szDescription);\r
 };\r
 \r
 #endif // !defined(AFX_PROFILE_H__9415254D_4656_484B_A730_E02580D8A221__INCLUDED_)\r