OSDN Git Service

Add a class to create a list of IMEs. Fix a bug where the properties
[xkeymacs/xkeymacs.git] / xkeymacs / profile.cpp
index f15f471..07f9580 100644 (file)
@@ -7,10 +7,9 @@
 #include "Profile.h"\r
 #include "MainFrm.h"\r
 #include "DotXkeymacs.h"\r
-#include <Imm.h>\r
+#include "imelist.h"\r
 #include <Shlwapi.h>\r
 #include <TlHelp32.h>\r
-#include <vector>\r
 \r
 #ifdef _DEBUG\r
 #undef THIS_FILE\r
@@ -305,108 +304,33 @@ static const KeyName KeyNames[] = {
        {0xff,                  _T("Fn")},\r
 };\r
 \r
-CData CProfile::m_Data[MAX_APP];\r
+CONFIG CProfile::m_Config;\r
+TCHAR CProfile::m_szAppTitle[MAX_APP][WINDOW_TEXT_LENGTH];\r
 TASK_LIST CProfile::m_TaskList[MAX_TASKS];\r
 DWORD CProfile::m_dwTasks;\r
 \r
-enum { INITIAL_SIZE    = 51200 };\r
-enum { EXTEND_SIZE     = 25600 };\r
-\r
-void CProfile::Item2AppName(CString *const sz)\r
-{\r
-       if (IsTheString(*sz, IDS_DEFAULT_TITLE)) {\r
-               sz->LoadString(IDS_DEFAULT);\r
-       }\r
-\r
-       if (IsTheString(*sz, IDS_DIALOG_TITLE)) {\r
-               sz->LoadString(IDS_DIALOG);\r
-       }\r
-\r
-       int nStart, nEnd, nCount;\r
-\r
-       nStart  = sz->ReverseFind(_T('(')) + 1;\r
-       nEnd    = sz->Find(_T(')'), nStart) - 1;\r
-       nCount  = (nEnd + 1) - nStart;\r
-       *sz             = sz->Mid(nStart, nCount);\r
-}\r
-\r
-int CProfile::IsNotSameString(CComboBox *const pApplication, const CString szListItem)\r
-{\r
-       CString szItem, szList;\r
-       szList = szListItem;\r
-       Item2AppName(&szList);\r
-\r
-       for (int i = 0; i < pApplication->GetCount(); ++i) {\r
-               pApplication->GetLBText(i, szItem);\r
-               Item2AppName(&szItem);\r
-               if (!_tcsicmp(szItem, szList)) {\r
-                       return 0;\r
-               }\r
-       }\r
-\r
-       return 1;\r
-}\r
-\r
-int CProfile::CountSeparator(const CString szMainString, const CString szSeparator)\r
+// This function returns the nth string in a window name separated by " - ".\r
+// If there aren't a sufficient number of strings, it returns the last string\r
+// appropriate for the title.\r
+bool CProfile::GetAppTitle(CString& appTitle, const CString& windowName, int nth)\r
 {\r
-       int index       = 0;\r
-       int counter     = 0;\r
-\r
-       while ((index = szMainString.Find(szSeparator, index)) != -1) {\r
-               ++index;\r
-               ++counter;\r
+       const CString sep(MAKEINTRESOURCE(IDS_SEPARATE_WINDOWTITLE));\r
+       const int nSep = windowName.Find(sep);\r
+       if (nSep < 0) {\r
+               appTitle = windowName;\r
+               return false;\r
        }\r
-\r
-       return counter;\r
-}\r
-\r
-void CProfile::GetNthString(CString *const szAppName, const CString szWindowName, const CString szSeparator, int n)\r
-{\r
-       int index = -1;\r
-\r
-       while (--n) {\r
-               index = szWindowName.Find(szSeparator, index + 1);\r
-       }\r
-\r
-       int nStart;\r
-       if (index != -1) {\r
-               nStart = index + szSeparator.GetLength();\r
-       } else {\r
-               nStart = 0;\r
-       }\r
-\r
-       int nEnd = szWindowName.Find(szSeparator, nStart);\r
-       if (nEnd == -1) {\r
-               nEnd = szWindowName.GetLength();\r
-       }\r
-\r
-       *szAppName = szWindowName.Mid(nStart, nEnd - nStart);\r
-}\r
-\r
-void CProfile::GetAppName(CString *const szAppName, LPCTSTR pWindowName)\r
-{\r
-       CString szWindowName(pWindowName);\r
-       CString szSeparator(MAKEINTRESOURCE(IDS_SEPARATE_WINDOWTITLE));\r
-       int nWord = CountSeparator(szWindowName, szSeparator) + 1;\r
-\r
-       while (nWord) {\r
-               GetNthString(szAppName, szWindowName, szSeparator, nWord);\r
-               if (szAppName->GetAt(0) == _T('[')\r
-                || szAppName->Find(_T('.'), 0) != -1           // for Microsoft Project\r
-                || szAppName->Find(_T(']'), 0) != -1) {        // for the file name like [foo - bar]\r
-                       --nWord;\r
-               } else {\r
-                       return;\r
-               }\r
-       }\r
-\r
-       *szAppName = szWindowName;\r
+       if (GetAppTitle(appTitle, windowName.Right(windowName.GetLength() - nSep - sep.GetLength()), --nth) ||\r
+                       !nth || nth > 0 && appTitle.GetAt(0) != _T('[') && appTitle.FindOneOf(_T(".]")) == -1)\r
+               return true;\r
+       appTitle = windowName.Left(nSep);\r
+       return false;\r
 }\r
 \r
 BOOL CALLBACK CProfile::EnumWindowsProc(const HWND hWnd, const LPARAM lParam)\r
 {\r
-       CComboBox               *pApplication   = (CComboBox*)lParam;\r
-       PTASK_LIST              pTask                   = CProfile::m_TaskList;\r
+       CProperties *pProperties = reinterpret_cast<CProperties*>(lParam);\r
+       PTASK_LIST pTask = CProfile::m_TaskList;\r
        \r
        TCHAR szWindowName[WINDOW_TEXT_LENGTH];\r
        TCHAR szClassName[CLASS_NAME_LENGTH];\r
@@ -416,7 +340,7 @@ BOOL CALLBACK CProfile::EnumWindowsProc(const HWND hWnd, const LPARAM lParam)
        ::GetWindowText(hWnd, szWindowName, sizeof(szWindowName));\r
        GetClassName(hWnd, szClassName, sizeof(szClassName));\r
 \r
-       CString szAppName;\r
+       CString appTitle;\r
        // Get Process Name\r
        DWORD dwProcessId = 0;\r
        GetWindowThreadProcessId(hWnd, &dwProcessId);\r
@@ -429,69 +353,47 @@ BOOL CALLBACK CProfile::EnumWindowsProc(const HWND hWnd, const LPARAM lParam)
                                continue;\r
                        }\r
                        if (!_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_B2)), sizeof(pTask[i].ProcessName))) {\r
-                               szAppName.LoadString(IDS_BECKY);\r
+                               appTitle.LoadString(IDS_BECKY);\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_EXPLORER)), sizeof(pTask[i].ProcessName))) {\r
-                               szAppName.LoadString(IDS_PROGRAM_MANAGER);\r
+                               appTitle.LoadString(IDS_PROGRAM_MANAGER);\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_MSIMN)), sizeof(pTask[i].ProcessName))) {\r
-                               szAppName.LoadString(IDS_OUTLOOK_EXPRESS);\r
+                               appTitle.LoadString(IDS_OUTLOOK_EXPRESS);\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_PROJECT)), sizeof(pTask[i].ProcessName))\r
                                        || !_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_EXCEL)), sizeof(pTask[i].ProcessName))\r
                                        || !_tcsnicmp(pTask[i].ProcessName, _T("psp.exe"), sizeof(pTask[i].ProcessName))) {\r
-                               GetNthString(&szAppName, szWindowName, CString(MAKEINTRESOURCE(IDS_SEPARATE_WINDOWTITLE)), 1);\r
+                               GetAppTitle(appTitle, szWindowName, 1);\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, _T("sakura.exe"), sizeof(pTask[i].ProcessName))) {\r
-                               GetNthString(&szAppName, szWindowName, CString(MAKEINTRESOURCE(IDS_SEPARATE_WINDOWTITLE)), 2);  // '.' is included, so...\r
+                               GetAppTitle(appTitle, szWindowName, 2); // '.' is included, so...\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, CString(MAKEINTRESOURCE(IDS_MSDN)), sizeof(pTask[i].ProcessName))) {\r
-                               szAppName = szWindowName;\r
+                               appTitle = szWindowName;\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, _T("devenv.exe"), sizeof(pTask[i].ProcessName))) {\r
-                               szAppName.Format(_T("Microsoft Visual Studio .NET"));\r
+                               appTitle.Format(_T("Microsoft Visual Studio .NET"));\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, _T("vb6.exe"), sizeof(pTask[i].ProcessName))) {\r
-                               szAppName.Format(_T("Microsoft Visual Basic"));\r
+                               appTitle.Format(_T("Microsoft Visual Basic"));\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, _T("ssexp.exe"), sizeof(pTask[i].ProcessName))) {\r
-                               szAppName.LoadString(IDS_VISUAL_SOURCESAFE_EXPLORER);\r
+                               appTitle.LoadString(IDS_VISUAL_SOURCESAFE_EXPLORER);\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, _T("sh.exe"), sizeof(pTask[i].ProcessName))) {\r
-                               szAppName.Format(_T("MKS Korn Shell"));\r
+                               appTitle.Format(_T("MKS Korn Shell"));\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, _T("csh.exe"), sizeof(pTask[i].ProcessName))) {\r
-                               szAppName.Format(_T("C Shell"));\r
+                               appTitle.Format(_T("C Shell"));\r
                        } else if (!_tcsnicmp(pTask[i].ProcessName, _T("vim.exe"), sizeof(pTask[i].ProcessName))) {\r
-                               szAppName.Format(_T("VIM"));\r
+                               appTitle.Format(_T("VIM"));\r
                        } else {\r
                                CUtils::SetCorrectApplicationName(pTask[i].ProcessName, szWindowName);\r
-                               GetAppName(&szAppName, szWindowName);\r
+                               GetAppTitle(appTitle, szWindowName);\r
                        }\r
                        break;\r
                }\r
        }\r
        \r
-       \r
-       if ((IsWindowVisible(hWnd))                                                                     // Is visible?\r
-        && (GetWindow(hWnd, GW_OWNER) == NULL)                                         // Is top level window?\r
-        && (lstrlen(szWindowName) > 0)                                                         // Have caption?\r
-        && (pApplication->FindString(-1, szClassName) == CB_ERR)) {// Is not same string?\r
-               CString szListItem;\r
-               szListItem.Format(IDS_APPLICATION_LIST_ITEM, szAppName, pTask[i].ProcessName);\r
-               if (IsNotSameString(pApplication, szListItem)) {\r
-                       pApplication->AddString(szListItem);\r
-               }\r
+       if (IsWindowVisible(hWnd) && // Is visible?\r
+                       GetWindow(hWnd, GW_OWNER) == NULL && // Is top level window?\r
+                       lstrlen(szWindowName) > 0) { // Have caption?\r
+               pProperties->AddItem(appTitle, pTask[i].ProcessName);\r
        }\r
        return TRUE;\r
 }\r
 \r
-struct {\r
-       int type;\r
-       CString cstr;\r
-} WindowTextTypes[] = {\r
-       { IDS_WINDOW_TEXT_MATCH, CString(MAKEINTRESOURCE(IDS_WINDOW_TEXT_MATCH)) },\r
-       { IDS_WINDOW_TEXT_MATCH_FORWARD, CString(MAKEINTRESOURCE(IDS_WINDOW_TEXT_MATCH_FORWARD)) },\r
-       { IDS_WINDOW_TEXT_MATCH_BACKWARD, CString(MAKEINTRESOURCE(IDS_WINDOW_TEXT_MATCH_BACKWARD)) },\r
-};\r
-\r
-inline int WindowTextType(const CString& cstr) {\r
-       for (int i = 0; i < _countof(WindowTextTypes); ++i)\r
-               if (WindowTextTypes[i].cstr == cstr)\r
-                       return WindowTextTypes[i].type;\r
-       return IDS_WINDOW_TEXT_IGNORE;\r
-}\r
-\r
 void CProfile::LoadRegistry()\r
 {\r
        bool bDialog = false;\r
@@ -510,28 +412,24 @@ void CProfile::LoadRegistry()
                                appName.LoadString(IDS_DEFAULT);\r
                } else if (appName == CString(MAKEINTRESOURCE(IDS_DIALOG)))\r
                        bDialog = true;\r
-               m_Data[nAppID].SetApplicationName(appName);\r
-\r
+               _tcsncpy_s(m_Config.szSpecialApp[nAppID], appName, _TRUNCATE);\r
                entry.LoadString(IDS_REG_ENTRY_APPLICATOIN_TITLE);\r
-               m_Data[nAppID].SetApplicationTitle(AfxGetApp()->GetProfileString(appName, entry));\r
+               _tcsncpy_s(m_szAppTitle[nAppID], AfxGetApp()->GetProfileString(appName, entry), _TRUNCATE);\r
                entry.LoadString(IDS_REG_ENTRY_WINDOW_TEXT);\r
-               m_Data[nAppID].SetWindowText(AfxGetApp()->GetProfileString(appName, entry, _T("*")));\r
-               entry.LoadString(IDS_REG_ENTRY_WINDOW_TEXT_TYPE);\r
-               m_Data[nAppID].SetWindowTextType(WindowTextType(AfxGetApp()->GetProfileString(appName, entry)));\r
+               _tcsncpy_s(m_Config.szWindowText[nAppID], AfxGetApp()->GetProfileString(appName, entry, _T("*")), _TRUNCATE);\r
 \r
-               CString regApp(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
-               regApp += _T("\\") + appName;\r
-               for (int nComID = 1; nComID < MAX_COMMAND; ++nComID) {\r
+               const CString regApp = CString(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA)) + _T("\\") + appName;\r
+               for (BYTE nComID = 1; nComID < MAX_COMMAND; ++nComID) {\r
                        entry = CCommands::GetCommandName(nComID);\r
                        HKEY hKey;\r
-                       const CString& regKey = regApp + _T("\\") + entry;\r
+                       const CString regKey = regApp + _T("\\") + entry;\r
                        if (RegOpenKeyEx(HKEY_CURRENT_USER, regKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\r
                                TCHAR szKeyBind[128];\r
                                DWORD dwKeyBind = _countof(szKeyBind);\r
                                for (DWORD dwIndex = 0; RegEnumKeyEx(hKey, dwIndex, szKeyBind, &dwKeyBind, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++dwIndex) {\r
                                        int nType, nKey;\r
-                                       ReadKeyBind(&nType, &nKey, szKeyBind);\r
-                                       m_Data[nAppID].SetCommandID(nType, nKey, nComID);\r
+                                       ReadKeyBind(nType, nKey, szKeyBind);\r
+                                       m_Config.nCommandID[nAppID][nType][nKey] = nComID;\r
                                        dwKeyBind = _countof(szKeyBind);\r
                                }\r
                                RegCloseKey(hKey);\r
@@ -541,7 +439,7 @@ void CProfile::LoadRegistry()
                                        if (CCommands::GetDefaultControlID(nComID, i) == IDC_CO2)\r
                                                continue;\r
                                        const int nType = CCommands::GetDefaultCommandType(nComID, i);\r
-                                       m_Data[nAppID].SetCommandID(nType, nKey, nComID);\r
+                                       m_Config.nCommandID[nAppID][nType][nKey] = nComID;\r
                                }\r
                        }\r
                }\r
@@ -554,7 +452,7 @@ void CProfile::LoadRegistry()
                                DWORD dwKeyBind = _countof(szKeyBind);\r
                                for (DWORD dwIndex = 0; RegEnumKeyEx(hKey, dwIndex, szKeyBind, &dwKeyBind, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++dwIndex) {\r
                                        int nType, nKey;\r
-                                       ReadKeyBind(&nType, &nKey, szKeyBind);\r
+                                       ReadKeyBind(nType, nKey, szKeyBind);\r
                                        CDotXkeymacs::SetKey(nFuncID, nAppID, nType, nKey);\r
                                        dwKeyBind = _countof(szKeyBind);\r
                                }\r
@@ -563,19 +461,20 @@ void CProfile::LoadRegistry()
                }\r
 \r
                entry.LoadString(IDS_REG_ENTRY_KILL_RING_MAX);\r
-               m_Data[nAppID].SetKillRingMax(AfxGetApp()->GetProfileInt(appName, entry, 1));\r
+               int n = AfxGetApp()->GetProfileInt(appName, entry, 1);\r
+               m_Config.nKillRingMax[nAppID] = static_cast<BYTE>(n > 255 ? 255 : n);\r
                entry.LoadString(IDS_REG_ENTRY_USE_DIALOG_SETTING);\r
-               m_Data[nAppID].SetUseDialogSetting(AfxGetApp()->GetProfileInt(appName, entry, 1));\r
+               m_Config.bUseDialogSetting[nAppID] = static_cast<BYTE>(AfxGetApp()->GetProfileInt(appName, entry, 1));\r
                entry.LoadString(IDS_REG_ENTRY_DISABLE_XKEYMACS);\r
-               m_Data[nAppID].SetSettingStyle(AfxGetApp()->GetProfileInt(appName, entry, 0) ? SETTING_DISABLE : SETTING_SPECIFIC);\r
+               m_Config.nSettingStyle[nAppID] = static_cast<BYTE>(AfxGetApp()->GetProfileInt(appName, entry, 0) ? SETTING_DISABLE : SETTING_SPECIFIC);\r
                entry.LoadString(IDC_REG_ENTRY_IGNORE_META_CTRL);\r
-               m_Data[nAppID].SetIgnoreUndefinedMetaCtrl(AfxGetApp()->GetProfileInt(appName, entry, 0));\r
+               m_Config.bIgnoreUndefinedMetaCtrl[nAppID] = static_cast<BYTE>(AfxGetApp()->GetProfileInt(appName, entry, 0));\r
                entry.LoadString(IDC_REG_ENTRY_IGNORE_C_X);\r
-               m_Data[nAppID].SetIgnoreUndefinedC_x(AfxGetApp()->GetProfileInt(appName, entry, 0));\r
+               m_Config.bIgnoreUndefinedC_x[nAppID] = static_cast<BYTE>(AfxGetApp()->GetProfileInt(appName, entry, 0));\r
                entry.LoadString(IDC_REG_ENTRY_ENABLE_CUA);\r
-               m_Data[nAppID].SetEnableCUA(AfxGetApp()->GetProfileInt(appName, entry, 0));\r
+               m_Config.bEnableCUA[nAppID] = static_cast<BYTE>(AfxGetApp()->GetProfileInt(appName, entry, 0));\r
                entry.LoadString(IDS_REG_ENTRY_326_COMPATIBLE);\r
-               m_Data[nAppID].Set326Compatible(AfxGetApp()->GetProfileInt(appName, entry, 0));\r
+               m_Config.b326Compatible[nAppID] = static_cast<BYTE>(AfxGetApp()->GetProfileInt(appName, entry, 0));\r
        }\r
 }\r
 \r
@@ -583,54 +482,51 @@ void CProfile::SaveRegistry()
 {\r
        const CString section(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION));    \r
        for (int nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-               const CString& appName = m_Data[nAppID].GetApplicationName();\r
+               const LPCTSTR szAppName = m_Config.szSpecialApp[nAppID];\r
                CString entry;\r
                entry.Format(IDS_REG_ENTRY_APPLICATION, nAppID);\r
-               if (appName.IsEmpty()) {\r
+               if (!szAppName[0]) {\r
                        if (!AfxGetApp()->GetProfileString(section, entry).IsEmpty())\r
                                AfxGetApp()->WriteProfileString(section, entry, _T(""));\r
                        continue;\r
                }\r
-               AfxGetApp()->WriteProfileString(section, entry, appName);\r
+               AfxGetApp()->WriteProfileString(section, entry, szAppName);\r
 \r
                entry.LoadString(IDS_REG_ENTRY_APPLICATOIN_TITLE);\r
-               CString appTitle = m_Data[nAppID].GetApplicationTitle();\r
+               CString appTitle = m_szAppTitle[nAppID];\r
                appTitle.TrimLeft(_T(' '));\r
-               AfxGetApp()->WriteProfileString(appName, entry, appTitle);\r
+               AfxGetApp()->WriteProfileString(szAppName, entry, appTitle);\r
                entry.LoadString(IDS_REG_ENTRY_WINDOW_TEXT);\r
-               AfxGetApp()->WriteProfileString(appName, entry, m_Data[nAppID].GetWindowText());\r
-               entry.LoadString(IDS_REG_ENTRY_WINDOW_TEXT_TYPE);\r
-               AfxGetApp()->WriteProfileString(appName, entry, CString(MAKEINTRESOURCE(m_Data[nAppID].GetWindowTextType())));\r
+               AfxGetApp()->WriteProfileString(szAppName, entry, m_Config.szWindowText[nAppID]);\r
 \r
-               CString regApp(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
-               regApp += _T("\\") + appName;\r
+               const CString regApp = CString(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA)) + _T("\\") + szAppName;\r
                // Create all commands\r
                for (int nComID = 1; nComID < MAX_COMMAND; ++nComID)\r
-                       SaveCommand(appName, nComID);\r
+                       SaveCommand(szAppName, nComID);\r
                for (int nType = 0; nType < MAX_COMMAND_TYPE; ++nType)\r
                        for (int nKey = 0; nKey < MAX_KEY; ++nKey)\r
-                               SaveKeyBind(appName, m_Data[nAppID].GetCommandID(nType, nKey), nType, nKey);\r
+                               SaveKeyBind(szAppName, m_Config.nCommandID[nAppID][nType][nKey], nType, nKey);\r
                for (int nFuncID = 0; nFuncID < CDotXkeymacs::GetFunctionNumber(); ++nFuncID)\r
                        for (int nKeyID = 0; nKeyID < CDotXkeymacs::GetKeyNumber(nFuncID, nAppID); ++nKeyID) {\r
                                int nType, nKey;\r
                                CDotXkeymacs::GetKey(nFuncID, nAppID, nKeyID, &nType, &nKey);\r
-                               SaveKeyBind(appName, CDotXkeymacs::GetFunctionSymbol(nFuncID), nType, nKey);\r
+                               SaveKeyBind(szAppName, CDotXkeymacs::GetFunctionSymbol(nFuncID), nType, nKey);\r
                        }\r
 \r
                entry.LoadString(IDS_REG_ENTRY_KILL_RING_MAX);\r
-               AfxGetApp()->WriteProfileInt(appName, entry, m_Data[nAppID].GetKillRingMax());\r
+               AfxGetApp()->WriteProfileInt(szAppName, entry, m_Config.nKillRingMax[nAppID]);\r
                entry.LoadString(IDS_REG_ENTRY_USE_DIALOG_SETTING);\r
-               AfxGetApp()->WriteProfileInt(appName, entry, m_Data[nAppID].GetUseDialogSetting());\r
+               AfxGetApp()->WriteProfileInt(szAppName, entry, m_Config.bUseDialogSetting[nAppID]);\r
                entry.LoadString(IDS_REG_ENTRY_DISABLE_XKEYMACS);\r
-               AfxGetApp()->WriteProfileInt(appName, entry, m_Data[nAppID].GetSettingStyle() == SETTING_DISABLE);\r
+               AfxGetApp()->WriteProfileInt(szAppName, entry, m_Config.nSettingStyle[nAppID] == SETTING_DISABLE);\r
                entry.LoadString(IDC_REG_ENTRY_IGNORE_META_CTRL);\r
-               AfxGetApp()->WriteProfileInt(appName, entry, m_Data[nAppID].GetIgnoreUndefinedMetaCtrl());\r
+               AfxGetApp()->WriteProfileInt(szAppName, entry, m_Config.bIgnoreUndefinedMetaCtrl[nAppID]);\r
                entry.LoadString(IDC_REG_ENTRY_IGNORE_C_X);\r
-               AfxGetApp()->WriteProfileInt(appName, entry, m_Data[nAppID].GetIgnoreUndefinedC_x());\r
+               AfxGetApp()->WriteProfileInt(szAppName, entry, m_Config.bIgnoreUndefinedC_x[nAppID]);\r
                entry.LoadString(IDC_REG_ENTRY_ENABLE_CUA);\r
-               AfxGetApp()->WriteProfileInt(appName, entry, m_Data[nAppID].GetEnableCUA());\r
+               AfxGetApp()->WriteProfileInt(szAppName, entry, m_Config.bEnableCUA[nAppID]);\r
                entry.LoadString(IDS_REG_ENTRY_326_COMPATIBLE);\r
-               AfxGetApp()->WriteProfileInt(appName, entry, m_Data[nAppID].Get326Compatible());\r
+               AfxGetApp()->WriteProfileInt(szAppName, entry, m_Config.b326Compatible[nAppID]);\r
        }\r
 }\r
 \r
@@ -650,54 +546,27 @@ void CProfile::SaveData()
 \r
 void CProfile::SetDllData()\r
 {\r
-       CXkeymacsDll::ClearFunctionDefinition();\r
-       for (int nFuncID = 0; nFuncID < CDotXkeymacs::GetFunctionNumber(); ++nFuncID) {\r
-               CXkeymacsDll::SetFunctionDefinition(nFuncID, CDotXkeymacs::GetFunctionDefinition(nFuncID));\r
-       }\r
+       memset(m_Config.nFunctionID, -1, sizeof(m_Config.nFunctionID));\r
+       for (int nFuncID = 0; nFuncID < CDotXkeymacs::GetFunctionNumber(); ++nFuncID)\r
+               _tcscpy_s(m_Config.szFunctionDefinition[nFuncID], CDotXkeymacs::GetFunctionDefinition(nFuncID));\r
 \r
        for (int nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-\r
-               CString szApplicationName = m_Data[nAppID].GetApplicationName();\r
-\r
-               if (szApplicationName.IsEmpty()) {\r
-                       CXkeymacsDll::Clear(nAppID);\r
-                       continue;\r
-               }\r
-\r
-               CXkeymacsDll::SetApplicationName(nAppID, szApplicationName);\r
-               CXkeymacsDll::SetWindowText(nAppID, m_Data[nAppID].GetWindowText());\r
-               CXkeymacsDll::SetCommandID(nAppID, CONTROL, 'X', 0);\r
-\r
-               for (int nType = 0; nType < MAX_COMMAND_TYPE; ++nType) {\r
-                       for (int nKey = 0; nKey < MAX_KEY; ++nKey) {\r
-                               const int nComID = m_Data[nAppID].GetCommandID(nType, nKey);\r
-                               CXkeymacsDll::SetCommandID(nAppID, nType, nKey, nComID);\r
-                               if ((nType & CONTROLX) && nComID) {\r
-                                       CXkeymacsDll::SetCommandID(nAppID, CONTROL, 'X', 1);                    // Commands[1] is C-x\r
-                               }\r
-                       }\r
-               }\r
-\r
-               for (int nFuncID = 0; nFuncID < CDotXkeymacs::GetFunctionNumber(); ++nFuncID) {\r
+               m_Config.nCommandID[nAppID][CONTROL]['X'] = 0; // C-x is unassigned.\r
+               for (int nType = 0; nType < MAX_COMMAND_TYPE; ++nType)\r
+                       for (int nKey = 0; nKey < MAX_KEY; ++nKey)\r
+                               if ((nType & CONTROLX) && m_Config.nCommandID[nAppID][nType][nKey])\r
+                                       m_Config.nCommandID[nAppID][CONTROL]['X'] = 1; // C-x is available.\r
+               for (BYTE nFuncID = 0; nFuncID < CDotXkeymacs::GetFunctionNumber(); ++nFuncID)\r
                        for (int nKeyID = 0; nKeyID < CDotXkeymacs::GetKeyNumber(nFuncID, nAppID); ++nKeyID) {\r
-                               int nType = 0;\r
-                               int nKey = 0;\r
+                               int nType, nKey;\r
                                CDotXkeymacs::GetKey(nFuncID, nAppID, nKeyID, &nType, &nKey);\r
-                               CXkeymacsDll::SetFunctionKey(nFuncID, nAppID, nType, nKey);\r
-                               if (nType & CONTROLX) {\r
-                                       CXkeymacsDll::SetCommandID(nAppID, CONTROL, 'X', 1);                    // Commands[1] is C-x\r
-                               }\r
+                               m_Config.nFunctionID[nAppID][nType][nKey] = nFuncID;\r
+                               if (nType & CONTROLX)\r
+                                       m_Config.nCommandID[nAppID][CONTROL]['X'] = 1; // C-x is available.\r
                        }\r
-               }\r
-\r
-               CXkeymacsDll::SetKillRingMax(nAppID, m_Data[nAppID].GetKillRingMax());\r
-               CXkeymacsDll::SetUseDialogSetting(nAppID, m_Data[nAppID].GetUseDialogSetting());\r
-               CXkeymacsDll::SetSettingStyle(nAppID, m_Data[nAppID].GetSettingStyle());\r
-               CXkeymacsDll::SetIgnoreUndefinedMetaCtrl(nAppID, m_Data[nAppID].GetIgnoreUndefinedMetaCtrl());\r
-               CXkeymacsDll::SetIgnoreUndefinedC_x(nAppID, m_Data[nAppID].GetIgnoreUndefinedC_x());\r
-               CXkeymacsDll::SetEnableCUA(nAppID, m_Data[nAppID].GetEnableCUA());\r
-               CXkeymacsDll::Set326Compatible(nAppID, m_Data[nAppID].Get326Compatible());\r
        }\r
+       m_Config.b106Keyboard = static_cast<BYTE>(Is106Keyboard());\r
+       CXkeymacsDll::SetConfig(m_Config);\r
        CXkeymacsApp *pApp = static_cast<CXkeymacsApp *>(AfxGetApp());\r
        if (!pApp->IsWow64())\r
                return;\r
@@ -706,10 +575,10 @@ void CProfile::SetDllData()
        pApp->SendIPCMessage(XKEYMACS_RELOAD);\r
 }\r
 \r
-void CProfile::ReadKeyBind(int *const pnCommandType, int *const pnKey, LPCTSTR szKeyBind)\r
+void CProfile::ReadKeyBind(int& nCommandType, int& nKey, const LPCTSTR szKeyBind)\r
 {\r
-       *pnCommandType = KeyBind2CommandType(szKeyBind);\r
-       *pnKey = KeyBind2Key(szKeyBind + _tcslen(CommandType2String(*pnCommandType)));\r
+       nCommandType = KeyBind2CommandType(szKeyBind);\r
+       nKey = KeyBind2Key(szKeyBind + _tcslen(CommandType2String(nCommandType)));\r
 }\r
 \r
 CString CProfile::WriteKeyBind(const int nType, const int nKey)\r
@@ -783,170 +652,95 @@ BOOL CProfile::IsCommandType(const int nType, LPCTSTR szKeyBind)
        return FALSE;\r
 }\r
 \r
-void CProfile::SaveKeyBind(const CString szApplicationName, const int nComID, const int nType, const int nKey)\r
+void CProfile::SaveKeyBind(const LPCSTR szAppName, const int nComID, const int nType, const int nKey)\r
 {\r
-       if (!nComID) {\r
+       if (!nComID)\r
                return;\r
-       }\r
-\r
-       CString szCommandName = CCommands::GetCommandName(nComID);\r
-       if (szCommandName.IsEmpty()) {\r
+       const LPCSTR szComName = CCommands::GetCommandName(nComID);\r
+       if (!szComName[0])\r
                return;\r
-       }\r
-\r
-       SaveKeyBind(szApplicationName, szCommandName, nType, nKey);\r
+       SaveKeyBind(szAppName, szComName, nType, nKey);\r
 }\r
 \r
-void CProfile::SaveKeyBind(const CString szApplicationName, const CString szCommandName, const int nType, const int nKey)\r
+void CProfile::SaveKeyBind(const LPCSTR szAppName, const LPCSTR szComName, const int nType, const int nKey)\r
 {\r
-       CString szKeyBind = WriteKeyBind(nType, nKey);\r
-       CString szSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
-       szSubKey += _T("\\") + szApplicationName + _T("\\") + szCommandName;\r
-       if (!szKeyBind.IsEmpty()) {\r
+       const CString szKeyBind = WriteKeyBind(nType, nKey);\r
+       CString szSubKey = CString(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA)) + _T("\\") + szAppName + _T("\\") + szComName;\r
+       if (!szKeyBind.IsEmpty())\r
                szSubKey += _T("\\") + szKeyBind;\r
-       }\r
-\r
        HKEY hKey = NULL;\r
-       if (RegCreateKeyEx(HKEY_CURRENT_USER, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) == ERROR_SUCCESS) {\r
+       if (RegCreateKeyEx(HKEY_CURRENT_USER, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) == ERROR_SUCCESS)\r
                RegCloseKey(hKey);\r
-       }\r
 }\r
 \r
-void CProfile::SaveCommand(const CString szApplicationName, const int nComID)\r
+void CProfile::SaveCommand(const LPCSTR szAppName, const int nComID)\r
 {\r
-       SaveKeyBind(szApplicationName, nComID, 0, 0);\r
+       SaveKeyBind(szAppName, nComID, 0, 0);\r
 }\r
 \r
-void CProfile::AddKeyBind2C_(const CString szApplicationName, const BYTE bVk)\r
+void CProfile::AddKeyBind2C_(const LPCSTR szAppName, const BYTE bVk)\r
 {\r
        int nComID;\r
-       for (nComID = 0; nComID < MAX_COMMAND; ++nComID) {\r
-               if (Commands[nComID].fCommand == CCommands::C_) {\r
+       for (nComID = 0; nComID < MAX_COMMAND; ++nComID)\r
+               if (Commands[nComID].fCommand == CCommands::C_)\r
                        break;\r
-               }\r
-       }\r
-\r
-       SaveKeyBind(szApplicationName, nComID, NONE, bVk);\r
+       SaveKeyBind(szAppName, nComID, NONE, bVk);\r
 }\r
 \r
 void CProfile::LevelUp()\r
 {\r
-       const int nDefalutLevel = 0;\r
-       const int nLatestLevel = 4;\r
-\r
-       CString szSection;\r
-       CString szEntry;\r
-       szEntry.Format(_T("Level"));\r
-\r
-       switch (AfxGetApp()->GetProfileInt(szSection, szEntry, nDefalutLevel)) {\r
-       case nDefalutLevel:\r
-               {\r
-                       for (int nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-                               CString szEntry;\r
-                               szEntry.Format(IDS_REG_ENTRY_APPLICATION, nAppID);\r
-\r
-                               CString szApplicationName;\r
-                               szApplicationName = AfxGetApp()->GetProfileString(CString(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION)), szEntry);\r
-                               if (szApplicationName.IsEmpty()) {\r
-                                       continue;\r
-                               }\r
-\r
-                               AddKeyBind2C_(szApplicationName, VK_LCONTROL);\r
-                               AddKeyBind2C_(szApplicationName, VK_RCONTROL);\r
-                       }\r
-               }\r
-               // Do NOT write break; here.\r
-       case 1:\r
-               {\r
-                       for (int nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-                               CString szEntry;\r
-                               szEntry.Format(IDS_REG_ENTRY_APPLICATION, nAppID);\r
-\r
-                               CString szApplicationName;\r
-                               szApplicationName = AfxGetApp()->GetProfileString(CString(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION)), szEntry);\r
-                               if (szApplicationName.IsEmpty()) {\r
-                                       continue;\r
-                               }\r
-\r
-                               // Set kill-ring-max 1 if it is 0.\r
-                               if (!AfxGetApp()->GetProfileInt(szApplicationName, CString(MAKEINTRESOURCE(IDS_REG_ENTRY_KILL_RING_MAX)), 0)) {\r
-                                       AfxGetApp()->WriteProfileInt(szApplicationName, CString(MAKEINTRESOURCE(IDS_REG_ENTRY_KILL_RING_MAX)), 1);\r
-                               }\r
-                       }\r
-               }\r
-               // Do NOT write break; here.\r
-       case 2:\r
-               {\r
-                       for (int nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-                               CString szEntry;\r
-                               szEntry.Format(IDS_REG_ENTRY_APPLICATION, nAppID);\r
-\r
-                               CString szApplicationName;\r
-                               szApplicationName = AfxGetApp()->GetProfileString(CString(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION)), szEntry);\r
-                               if (szApplicationName.IsEmpty()) {\r
-                                       continue;\r
-                               }\r
-\r
+       const int nCurrentLevel = AfxGetApp()->GetProfileInt(_T(""), _T("Level"), 0);\r
+       for (int nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
+               CString entry;\r
+               entry.Format(IDS_REG_ENTRY_APPLICATION, nAppID);\r
+               const CString appName = AfxGetApp()->GetProfileString(CString(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION)), entry);\r
+               if (appName.IsEmpty())\r
+                       continue;\r
+               switch (nCurrentLevel) {\r
+               case 0:\r
+                       AddKeyBind2C_(appName, VK_LCONTROL);\r
+                       AddKeyBind2C_(appName, VK_RCONTROL);\r
+               // fall through\r
+               case 1:\r
+                       // Set kill-ring-max 1 if it is 0.\r
+                       if (!AfxGetApp()->GetProfileInt(appName, CString(MAKEINTRESOURCE(IDS_REG_ENTRY_KILL_RING_MAX)), 0))\r
+                               AfxGetApp()->WriteProfileInt(appName, CString(MAKEINTRESOURCE(IDS_REG_ENTRY_KILL_RING_MAX)), 1);\r
+               // fall through\r
+               case 2:\r
+                       {\r
                                // Chaged a label from Enter to newline.\r
-                               CString szSrcSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
-                               szSrcSubKey += _T("\\") + szApplicationName + _T("\\") + _T("Enter");\r
-                               CString szDestSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
-                               szDestSubKey += _T("\\") + szApplicationName + _T("\\") + _T("newline");\r
-                               HKEY hKeyDest = NULL;\r
-                               if (RegCreateKeyEx(HKEY_CURRENT_USER, szDestSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyDest, NULL) == ERROR_SUCCESS) {\r
-                                       SHCopyKey(HKEY_CURRENT_USER, szSrcSubKey, hKeyDest, NULL);\r
-                                       SHDeleteKey(HKEY_CURRENT_USER, szSrcSubKey);\r
-                                       RegCloseKey(hKeyDest);\r
+                               const CString subKey = CString(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA)) + _T("\\") + appName;\r
+                               const CString srcKey = subKey + _T("\\") + _T("Enter");\r
+                               const CString dstKey = subKey + _T("\\") + _T("newline");\r
+                               HKEY hDstKey = NULL;\r
+                               if (RegCreateKeyEx(HKEY_CURRENT_USER, dstKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hDstKey, NULL) == ERROR_SUCCESS) {\r
+                                       SHCopyKey(HKEY_CURRENT_USER, srcKey, hDstKey, NULL);\r
+                                       SHDeleteKey(HKEY_CURRENT_USER, srcKey);\r
+                                       RegCloseKey(hDstKey);\r
                                }\r
                        }\r
-               }\r
-               // Do NOT write break; here.\r
-       case 3:\r
-               {\r
-                       for (int nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-                               CString szEntry;\r
-                               szEntry.Format(IDS_REG_ENTRY_APPLICATION, nAppID);\r
-\r
-                               CString szApplicationName;\r
-                               szApplicationName = AfxGetApp()->GetProfileString(CString(MAKEINTRESOURCE(IDS_REG_SECTION_APPLICATION)), szEntry);\r
-                               if (szApplicationName.IsEmpty()) {\r
-                                       continue;\r
-                               }\r
-\r
-                               // rename original function to remove IDS_REG_ORIGINAL_PREFIX\r
-                               for (int nFuncID = 0; nFuncID < CDotXkeymacs::GetFunctionNumber(); ++nFuncID) {\r
-                                       HKEY hKey = NULL;\r
-                                       CString szSubKey(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA));\r
-                                       szSubKey += _T("\\") + szApplicationName + _T("\\") + CString(MAKEINTRESOURCE(IDS_REG_ORIGINAL_PREFIX)) + CDotXkeymacs::GetFunctionSymbol(nFuncID);\r
-                                       if (RegOpenKeyEx(HKEY_CURRENT_USER, szSubKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\r
-                                               // Use registry data\r
-                                               TCHAR szKeyBind[128] = {'\0'};\r
-                                               DWORD dwKeyBind = sizeof(szKeyBind);\r
-                                               FILETIME ft = {'\0'};   // not use\r
-                                               for (DWORD dwIndex = 0; RegEnumKeyEx(hKey, dwIndex, szKeyBind, &dwKeyBind, NULL, NULL, NULL, &ft) == ERROR_SUCCESS; ++dwIndex) {\r
-                                                       int nType = 0;\r
-                                                       int nKey = 0;\r
-                                                       ReadKeyBind(&nType, &nKey, szKeyBind);\r
-                                                       SaveKeyBind(szApplicationName, CDotXkeymacs::GetFunctionSymbol(nFuncID), nType, nKey);\r
-\r
-                                                       memset(szKeyBind, 0, sizeof(szKeyBind));\r
-                                                       dwKeyBind = sizeof(szKeyBind);\r
-                                               }\r
-                                               RegCloseKey(hKey);\r
+               // fall through\r
+               case 3:\r
+                       // rename original function to remove IDS_REG_ORIGINAL_PREFIX\r
+                       for (int nFuncID = 0; nFuncID < CDotXkeymacs::GetFunctionNumber(); ++nFuncID) {\r
+                               HKEY hKey = NULL;\r
+                               const CString subKey = CString(MAKEINTRESOURCE(IDS_REGSUBKEY_DATA)) + _T("\\") + appName + _T("\\") + CString(MAKEINTRESOURCE(IDS_REG_ORIGINAL_PREFIX)) + CDotXkeymacs::GetFunctionSymbol(nFuncID);\r
+                               if (RegOpenKeyEx(HKEY_CURRENT_USER, subKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\r
+                                       // Use registry data\r
+                                       TCHAR szKeyBind[128];\r
+                                       DWORD dwKeyBind = sizeof(szKeyBind);\r
+                                       for (DWORD dwIndex = 0; RegEnumKeyEx(hKey, dwIndex, szKeyBind, &dwKeyBind, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++dwIndex) {\r
+                                               int nType, nKey;\r
+                                               ReadKeyBind(nType, nKey, szKeyBind);\r
+                                               SaveKeyBind(appName, CDotXkeymacs::GetFunctionSymbol(nFuncID), nType, nKey);\r
+                                               dwKeyBind = sizeof(szKeyBind);\r
                                        }\r
+                                       RegCloseKey(hKey);\r
                                }\r
                        }\r
                }\r
-//     case 4:\r
-//             foo();\r
-//     ...\r
-//     case nLatestLevel-1:\r
-//             bar();\r
-               AfxGetApp()->WriteProfileInt(szSection, szEntry, nLatestLevel);\r
-               break;\r
-       default:\r
-               break;\r
        }\r
+       AfxGetApp()->WriteProfileInt(_T(""), _T("Level"), 4);\r
 }\r
 \r
 void CProfile::InitDllData()\r
@@ -957,83 +751,48 @@ void CProfile::InitDllData()
 \r
 void CProfile::ClearData(const CString szCurrentApplication)\r
 {\r
-       int nAppID;\r
-       for (nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-               if (m_Data[nAppID].GetApplicationName() == szCurrentApplication) {\r
-                       break;\r
+       for (int nAppID = 0; nAppID < MAX_APP; ++nAppID)\r
+               if (szCurrentApplication == m_Config.szSpecialApp[nAppID]) {\r
+                       ZeroMemory(m_Config.nCommandID[nAppID], sizeof(m_Config.nCommandID[nAppID]));\r
+                       ZeroMemory(m_Config.szSpecialApp[nAppID], CLASS_NAME_LENGTH);\r
+                       return;\r
                }\r
-       }\r
-       if (nAppID < MAX_APP) {\r
-               m_Data[nAppID].ClearAll();\r
-       }\r
 }\r
 \r
 // return count of saved settings\r
 int CProfile::GetSavedSettingCount()\r
 {\r
        int nSavedSetting = 0;\r
-\r
-       for (int nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-               CString szApplicationName;\r
-               szApplicationName = m_Data[nAppID].GetApplicationName();\r
-               if (!szApplicationName.IsEmpty()) {\r
+       for (int nAppID = 0; nAppID < MAX_APP; ++nAppID)\r
+               if (m_Config.szSpecialApp[nAppID][0])\r
                        ++nSavedSetting;\r
-               }\r
-       }\r
-\r
        return nSavedSetting;\r
 }\r
 \r
-void CProfile::InitApplicationList(CComboBox *const cApplicationList)\r
+void CProfile::InitAppList(CProperties& cProperties)\r
 {\r
-       cApplicationList->ResetContent();\r
-\r
        GetTaskList();\r
 \r
-       EnumWindows(EnumWindowsProc, (LPARAM)cApplicationList);\r
+       EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&cProperties));\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
-               if (szApplicationName == _T("IME")) // IDS_IME_FILE_NAME\r
+               const LPCTSTR szAppName = m_Config.szSpecialApp[i];\r
+               const LPCTSTR szAppTitle = m_szAppTitle[i];\r
+               if (!szAppName[0] || !_tcscmp(szAppName, _T("IME")))\r
                        continue;\r
-               szListItem.Format(IDS_APPLICATION_LIST_ITEM, szApplicationTitle, szApplicationName);\r
-               if (IsNotSameString(cApplicationList, szListItem)\r
-                && !IsDefault(szApplicationName)\r
-                && !IsDialog(szApplicationName)\r
-                && !szApplicationName.IsEmpty()) {\r
-                       cApplicationList->AddString(szListItem);\r
-               }\r
+               if (CString(MAKEINTRESOURCE(IDS_DEFAULT)) == szAppName ||\r
+                               CString(MAKEINTRESOURCE(IDS_DIALOG)) == szAppName)\r
+                       continue;\r
+               cProperties.AddItem(szAppTitle, szAppName);\r
        }\r
-\r
-       AddIMEInfo(cApplicationList);\r
-\r
-       // Add Dialog\r
-       cApplicationList->InsertString(0, CString(MAKEINTRESOURCE(IDS_DIALOG_TITLE)));\r
-\r
-       // Add Default\r
-       cApplicationList->InsertString( 0, CString(MAKEINTRESOURCE(IDS_DEFAULT_TITLE)));\r
-       cApplicationList->SelectString(-1, CString(MAKEINTRESOURCE(IDS_DEFAULT_TITLE)));\r
+       AddIMEInfo(cProperties);\r
 }\r
 \r
-void CProfile::AddIMEInfo(CComboBox *cApplicationList)\r
+void CProfile::AddIMEInfo(CProperties& cProperties)\r
 {\r
-       const UINT n = GetKeyboardLayoutList(0, NULL);\r
-       if (!n)\r
-               return;\r
-       std::vector<HKL> hkls(n);\r
-       GetKeyboardLayoutList(n, &hkls[0]);\r
-       TCHAR szFileName[MAX_PATH];\r
-       TCHAR szDescription[WINDOW_TEXT_LENGTH];\r
-       for (std::vector<HKL>::const_iterator p = hkls.begin(); p != hkls.end(); ++p)\r
-               if (ImmGetDescription(*p, szDescription, WINDOW_TEXT_LENGTH) &&\r
-                               ImmGetIMEFileName(*p, szFileName, MAX_PATH)) {\r
-                       CString item;\r
-                       item.Format(IDS_APPLICATION_LIST_ITEM, szDescription, szFileName);\r
-                       if (IsNotSameString(cApplicationList, item))\r
-                               cApplicationList->AddString(item);\r
-               }\r
+       IMEList imeList;\r
+       for (IMEListIterator p = imeList.begin(); p != imeList.end(); ++p)\r
+               cProperties.AddItem(p->szDescription, p->szFileName);\r
 }\r
 \r
 void CProfile::GetTaskList()\r
@@ -1056,51 +815,40 @@ void CProfile::GetTaskList()
        CloseHandle(hProcessSnap);\r
 }\r
 \r
-// return application index\r
-// and update setting style\r
-// if there is NOT the application in the data, this function takes care of it.\r
-int CProfile::GetApplicationIndex(const CString szApplicationName, const BOOL bSaveAndValidate, int *const nSettingStyle)\r
+int CProfile::DefaultAppID()\r
 {\r
-       if (!bSaveAndValidate) {        // SetDialogData\r
-               *nSettingStyle = SETTING_UNDEFINED;\r
-       }\r
-\r
-       int nAppID = GetApplicationIndex(szApplicationName);\r
+       const CString name(MAKEINTRESOURCE(IDS_DEFAULT));\r
+       for(int nAppID = 0; nAppID < MAX_APP; ++nAppID)\r
+               if (name == m_Config.szSpecialApp[nAppID])\r
+                       return nAppID;\r
+       return MAX_APP;\r
+}\r
 \r
-       if (nAppID == MAX_APP) {\r
-               if (bSaveAndValidate) { // GetDialogData\r
-                       for (nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-                               CString sz = m_Data[nAppID].GetApplicationName();\r
-                               if (sz.IsEmpty()) {\r
-                                       m_Data[nAppID].SetApplicationName(szApplicationName);\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if (nAppID == MAX_APP) {\r
-                               return nAppID;\r
-                       }\r
-               } else {                                // SetDialogData\r
-                       for (nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-                               if (IsDefault(m_Data[nAppID].GetApplicationName())) {\r
-                                       *nSettingStyle = SETTING_DEFAULT;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if (nAppID == MAX_APP) {\r
-                               return nAppID;\r
-                       }\r
+int CProfile::AssignAppID(const LPCSTR szAppName)\r
+{\r
+       int nAppID = GetAppID(szAppName);\r
+       if (nAppID != MAX_APP)\r
+               return nAppID;\r
+       for (nAppID = 0; nAppID < MAX_APP; ++nAppID)\r
+               if (!m_Config.szSpecialApp[nAppID][0]) {\r
+                       _tcsncpy_s(m_Config.szSpecialApp[nAppID], szAppName, _TRUNCATE);\r
+                       return nAppID;\r
                }\r
-       }\r
+       return nAppID;\r
+}\r
 \r
-       if (bSaveAndValidate) { // GetDialogData\r
-               m_Data[nAppID].SetSettingStyle(*nSettingStyle);\r
-       } else {                                // SetDialogData\r
-               if (*nSettingStyle == SETTING_UNDEFINED) {      // It means that *nSettingStyle != SETTING_DEFAULT.\r
-                       *nSettingStyle = m_Data[nAppID].GetSettingStyle();\r
-               }\r
-       }\r
+int CProfile::GetSettingStyle(const int nAppID)\r
+{\r
+       if (nAppID == MAX_APP)\r
+               return SETTING_DEFAULT;\r
+       return m_Config.nSettingStyle[nAppID];\r
+}\r
 \r
-       return nAppID;\r
+void CProfile::SetSettingStyle(int nAppID, int nSettingStyle)\r
+{\r
+       if (nAppID == MAX_APP)\r
+               return;\r
+       m_Config.nSettingStyle[nAppID] = static_cast<BYTE>(nSettingStyle);\r
 }\r
 \r
 BOOL CProfile::Is106Keyboard()\r
@@ -1135,115 +883,63 @@ BOOL CProfile::Is106Keyboard()
        return keyboard == JAPANESE_KEYBOARD;\r
 }\r
 \r
-BOOL CProfile::IsTheString(const CString sz, const UINT nID)\r
-{\r
-       return sz == CString(MAKEINTRESOURCE(nID));\r
-}\r
-\r
-// if sz is "Default", return TRUE\r
-BOOL CProfile::IsDefault(const CString sz)\r
-{\r
-       return IsTheString(sz, IDS_DEFAULT);\r
-}\r
-\r
-// if sz is "Dialog", return TRUE\r
-BOOL CProfile::IsDialog(const CString sz)\r
-{\r
-       return IsTheString(sz, IDS_DIALOG);\r
-}\r
-\r
-void CProfile::GetApplicationTitle(CComboBox *const cApplicationList, CString &rList, const int nIndex)\r
-{\r
-       if (0 <= nIndex) {\r
-               cApplicationList->GetLBText(nIndex, rList);\r
-       } else {\r
-               cApplicationList->GetWindowText(rList);\r
-       }\r
-\r
-       if (IsTheString(rList, IDS_DEFAULT_TITLE)) {\r
-               rList.LoadString(IDS_DEFAULT);\r
-       }\r
-\r
-       if (IsTheString(rList, IDS_DIALOG_TITLE)) {\r
-               rList.LoadString(IDS_DIALOG);\r
-       }\r
-\r
-       return;\r
-}\r
-\r
-void CProfile::UpdateApplicationTitle(CComboBox *const cApplicationList, const CString szCurrentApplication, const int nAppID, const BOOL bSaveAndValidate)\r
+void CProfile::SetAppTitle(const int nAppID, const CString& appTitle)\r
 {\r
-       static CString szApplicationTitle;\r
-       if (bSaveAndValidate) { // GetDialogData\r
-               if (!CProfile::IsDefault(szCurrentApplication)) {\r
-                       m_Data[nAppID].SetApplicationTitle(szApplicationTitle);\r
-               }\r
-               szApplicationTitle.Empty();\r
-       } else {                                // SetDialogData\r
-               CString szListItem;\r
-               CProfile::GetApplicationTitle(cApplicationList, szListItem);\r
-               int nEndTitle = szListItem.ReverseFind(_T('('));\r
-               if (nEndTitle > 0) {\r
-                       szApplicationTitle = szListItem.Left(nEndTitle);\r
-               }\r
-       }\r
+       _tcsncpy_s(m_szAppTitle[nAppID], appTitle, _TRUNCATE);\r
 }\r
 \r
 void CProfile::SetCommandID(const int nAppID, const int nType, const int nKey, int nComID)\r
 {\r
-       if (nKey == 0xf0 && Commands[nComID].fCommand == CCommands::C_) {\r
+       if (nKey == 0xf0 && Commands[nComID].fCommand == CCommands::C_)\r
                // Change CommandID C_Eisu\r
-               for (nComID = 1; nComID < MAX_COMMAND; ++nComID) {\r
-                       if (Commands[nComID].fCommand == CCommands::C_Eisu) {\r
+               for (nComID = 1; nComID < MAX_COMMAND; ++nComID)\r
+                       if (Commands[nComID].fCommand == CCommands::C_Eisu)\r
                                break;\r
-                       }\r
-               }\r
-       }\r
-       m_Data[nAppID].SetCommandID(nType, nKey, nComID);\r
+       m_Config.nCommandID[nAppID][nType][nKey] = static_cast<BYTE>(nComID);\r
 }\r
 \r
 int CProfile::GetCommandID(const int nAppID, const int nType, const int nKey)\r
 {\r
-       int nComID = m_Data[nAppID].GetCommandID(nType, nKey);\r
-       if (nKey == 0xf0 && Commands[nComID].fCommand == CCommands::C_Eisu) {\r
+       int nComID = m_Config.nCommandID[nAppID][nType][nKey];\r
+       if (nKey == 0xf0 && Commands[nComID].fCommand == CCommands::C_Eisu)\r
                // Change CommandID C_\r
-               for (nComID = 1; nComID < MAX_COMMAND; ++nComID) {\r
-                       if (Commands[nComID].fCommand == CCommands::C_) {\r
+               for (nComID = 1; nComID < MAX_COMMAND; nComID++)\r
+                       if (Commands[nComID].fCommand == CCommands::C_)\r
                                break;\r
-                       }\r
-               }\r
-       }\r
        return nComID;\r
 }\r
 \r
 void CProfile::SetKillRingMax(const int nAppID, const int nKillRingMax)\r
 {\r
-       m_Data[nAppID].SetKillRingMax(nKillRingMax);\r
+       m_Config.nKillRingMax[nAppID] = static_cast<BYTE>(nKillRingMax > 255 ? 255 : nKillRingMax);\r
 }\r
 \r
 int CProfile::GetKillRingMax(const int nAppID)\r
 {\r
-       return m_Data[nAppID].GetKillRingMax();\r
+       return m_Config.nKillRingMax[nAppID];\r
 }\r
 \r
 void CProfile::SetUseDialogSetting(const int nAppID, const BOOL bUseDialogSetting)\r
 {\r
-       m_Data[nAppID].SetUseDialogSetting(bUseDialogSetting);\r
+       m_Config.bUseDialogSetting[nAppID] = static_cast<BYTE>(bUseDialogSetting);\r
 }\r
 \r
 BOOL CProfile::GetUseDialogSetting(const int nAppID)\r
 {\r
-       return m_Data[nAppID].GetUseDialogSetting();\r
+       return m_Config.bUseDialogSetting[nAppID];\r
 }\r
 \r
 void CProfile::SetWindowText(const int nAppID, const CString szWindowText)\r
 {\r
-       m_Data[nAppID].SetWindowText(szWindowText);\r
+       if (CUtils::GetWindowTextType(szWindowText) == IDS_WINDOW_TEXT_IGNORE)\r
+               _tcscpy_s(m_Config.szWindowText[nAppID], _T("*"));\r
+       else\r
+               _tcsncpy_s(m_Config.szWindowText[nAppID], szWindowText, _TRUNCATE);\r
 }\r
 \r
 CString CProfile::GetWindowText(const int nAppID)\r
 {\r
-       return m_Data[nAppID].GetWindowText();\r
+       return m_Config.szWindowText[nAppID];\r
 }\r
 \r
 void CProfile::DeleteAllRegistryData()\r
@@ -1268,52 +964,34 @@ void CProfile::DeleteAllRegistryData()
        }\r
 }\r
 \r
-int CProfile::GetCurrentApplicationID(CComboBox *const cApplicationList, const CString szCurrentApplication)\r
+void CProfile::CopyData(const CString szDstApp, const CString szSrcApp)\r
 {\r
-       int nCounter = cApplicationList->GetCount();\r
-       CString szListItem;\r
-       int nCurSel = cApplicationList->GetCurSel();\r
-\r
-       for (int i = 0; i < nCounter; ++i) {\r
-               cApplicationList->SetCurSel(i);\r
-               CProfile::GetApplicationTitle(cApplicationList, szListItem);\r
-               if (szListItem.Find(szCurrentApplication) != -1) {\r
-                       cApplicationList->SetCurSel(nCurSel);\r
-                       return i;\r
-               }\r
-       }\r
-       return -1;\r
-}\r
-\r
-void CProfile::CopyData(const CString szDestinationApplication, const CString szSourceApplication)\r
-{\r
-       int nSettingStyle = SETTING_SPECIFIC;\r
-       int nDestinationApplication = GetApplicationIndex(szDestinationApplication, TRUE, &nSettingStyle);\r
-       int nSourceApplication = GetApplicationIndex(szSourceApplication);\r
-\r
-       CString szApplicationName = m_Data[nDestinationApplication].GetApplicationName();\r
-       CString szApplicationTitle = m_Data[nDestinationApplication].GetApplicationTitle();\r
-       CString szWindowText = m_Data[nDestinationApplication].GetWindowText();\r
-       int nWindowTextType = m_Data[nDestinationApplication].GetWindowTextType();\r
-\r
-       m_Data[nDestinationApplication] = m_Data[nSourceApplication];\r
-\r
-       m_Data[nDestinationApplication].SetApplicationName(szApplicationName);\r
-       m_Data[nDestinationApplication].SetApplicationTitle(szApplicationTitle);\r
-       m_Data[nDestinationApplication].SetWindowText(szWindowText);\r
-       m_Data[nDestinationApplication].SetWindowTextType(nWindowTextType);\r
+       const int nDstApp = AssignAppID(szDstApp);\r
+       const int nSrcApp = GetAppID(szSrcApp);\r
+       if (nDstApp == MAX_APP || nSrcApp == MAX_APP)\r
+               return;\r
+       SetSettingStyle(nDstApp, SETTING_SPECIFIC);\r
+\r
+#define CopyMember(member) CopyMemory(&m_Config. ## member ## [nDstApp], &m_Config. ## member ## [nSrcApp], sizeof(m_Config. ## member ## [nSrcApp]))\r
+       CopyMember(b326Compatible);\r
+       CopyMember(nFunctionID);\r
+       CopyMember(bEnableCUA);\r
+       CopyMember(bUseDialogSetting);\r
+       CopyMember(bIgnoreUndefinedC_x);\r
+       CopyMember(bIgnoreUndefinedMetaCtrl);\r
+       CopyMember(nKillRingMax);\r
+       CopyMember(nCommandID);\r
+#undef CopyMember\r
 }\r
 \r
 // return application index\r
 // if there is NOT the application in the data, return MAX_APP\r
-int CProfile::GetApplicationIndex(const CString szApplicationName)\r
+int CProfile::GetAppID(const LPCSTR szAppName)\r
 {\r
        int nAppID = 0;\r
-       for (nAppID = 0; nAppID < MAX_APP; ++nAppID) {\r
-               if (m_Data[nAppID].GetApplicationName() == szApplicationName) {\r
+       for (nAppID = 0; nAppID < MAX_APP; ++nAppID)\r
+               if (!_tcscmp(szAppName, m_Config.szSpecialApp[nAppID]))\r
                        break;\r
-               }\r
-       }\r
        return nAppID;\r
 }\r
 \r
@@ -1418,12 +1096,12 @@ void CProfile::ImportProperties()
 \r
 BOOL CProfile::GetEnableCUA(const int nAppID)\r
 {\r
-       return m_Data[nAppID].GetEnableCUA();\r
+       return m_Config.bEnableCUA[nAppID];\r
 }\r
 \r
 void CProfile::SetEnableCUA(const int nAppID, const BOOL bEnableCUA)\r
 {\r
-       m_Data[nAppID].SetEnableCUA(bEnableCUA);\r
+       m_Config.bEnableCUA[nAppID] = static_cast<BYTE>(bEnableCUA);\r
 }\r
 \r
 int CProfile::GetKeyboardSpeed()\r