OSDN Git Service

Specify the dependency of projects in the solution file instead of
[xkeymacs/xkeymacs.git] / xkeymacsdll / Commands.cpp
index 1b4bef9..bde626d 100644 (file)
@@ -283,13 +283,10 @@ BOOL CCommands::m_bC_u = FALSE;
 SEARCH_DIRECTION CCommands::m_SearchDirection = NA;\r
 int (*CCommands::m_LastKillCommand)() = NULL;\r
 int (*CCommands::m_LastCommand)() = NULL;\r
-CPtrList CCommands::m_CaretPos;\r
-CPtrList CCommands::m_ScrollInfo;\r
-CPtrList CCommands::m_FindText;\r
 BOOL CCommands::m_bFirstFindDialog = FALSE;\r
 BOOL CCommands::m_bTemporarilyDisableXKeymacs = FALSE;\r
 CArray<CClipboardSnap *, CClipboardSnap *> CCommands::m_oClipboardData;\r
-OriginalWindowPosition_t CCommands::m_OriginalWindowPosition[MAX_WINDOW] = {'\0'};\r
+OriginalWindowPosition CCommands::m_OriginalWindowPosition[MAX_WINDOW] = {'\0'};\r
 BOOL CCommands::m_bIsSu = FALSE;\r
 #pragma data_seg()\r
 \r
@@ -333,6 +330,8 @@ void CCommands::Kdu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)
                ReleaseKey(VK_CONTROL);\r
        }\r
        if (bIsAltDown) {\r
+               if (CUtils::IsVisualStudio2010())\r
+                       CXkeymacsDll::SetHookAltRelease(); // Ignore Alt release\r
                ReleaseKey(VK_MENU);\r
        }\r
        if (bIsShiftDown) {\r
@@ -669,7 +668,7 @@ int CCommands::EndOfLine()
 // C-f: Right\r
 int CCommands::ForwardChar()\r
 {\r
-//     TCHAR szWindowText[0x100] = {'\0'};\r
+//     TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
 //     GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
 //     CUtils::Log("C-f: %s", szWindowText);\r
 \r
@@ -1181,8 +1180,8 @@ int CCommands::SaveBuffersKillEmacs()
 \r
        HWND hWnd = GetForegroundWindow();\r
        if (hWnd) {\r
-               OriginalWindowPosition_t *pOriginalWindowPosition = GetOriginalWindowPosition(hWnd);\r
-               if (pOriginalWindowPosition && pOriginalWindowPosition->bMax[ROLL_UP_UNROLL]) {\r
+               OriginalWindowPosition *pPos = GetOriginalWindowPosition(hWnd);\r
+               if (pPos && pPos->bMax[ROLL_UP_UNROLL]) {\r
                        RollUpUnroll();\r
                }\r
        }\r
@@ -1277,20 +1276,18 @@ int CCommands::Maximize()
        return Reset(GOTO_HOOK);\r
 }\r
 \r
-OriginalWindowPosition_t* CCommands::GetOriginalWindowPosition(HWND hWnd)\r
+OriginalWindowPosition* CCommands::GetOriginalWindowPosition(HWND hWnd)\r
 {\r
-       const int nOriginalWindowPosition = sizeof(m_OriginalWindowPosition) / sizeof(m_OriginalWindowPosition[0]);\r
-\r
-       for (int i = 0; i < nOriginalWindowPosition; ++i) {\r
+       for (int i = 0; i < MAX_WINDOW; i++) {\r
                if (m_OriginalWindowPosition[i].hWnd == hWnd) {\r
                        return &m_OriginalWindowPosition[i];\r
                }\r
        }\r
 \r
-       for (int j = 0; j < nOriginalWindowPosition; ++j) {\r
+       for (int j = 0; j < MAX_WINDOW; j++) {\r
                if (m_OriginalWindowPosition[j].hWnd == 0) {\r
                        m_OriginalWindowPosition[j].hWnd = hWnd;\r
-                       memset(&m_OriginalWindowPosition[(j + 1) % nOriginalWindowPosition], 0, sizeof(m_OriginalWindowPosition[0]));\r
+                       memset(&m_OriginalWindowPosition[(j + 1) % MAX_WINDOW], 0, sizeof(OriginalWindowPosition));\r
                        return &m_OriginalWindowPosition[j];\r
                }\r
        }\r
@@ -1318,8 +1315,8 @@ int CCommands::Maximize(MAXIMIZE_DIRECTION direction)
                return Reset(GOTO_HOOK);\r
        }\r
 \r
-       OriginalWindowPosition_t *pOriginalWindowPosition = GetOriginalWindowPosition(hWnd);\r
-       if (!pOriginalWindowPosition) {\r
+       OriginalWindowPosition *pPos = GetOriginalWindowPosition(hWnd);\r
+       if (!pPos) {\r
                return Reset(GOTO_HOOK);\r
        }\r
 \r
@@ -1330,34 +1327,34 @@ int CCommands::Maximize(MAXIMIZE_DIRECTION direction)
 \r
        switch (direction) {\r
        case VERTICAL:\r
-               if (pOriginalWindowPosition->bMax[direction]) {\r
-                       Y = pOriginalWindowPosition->nOriginalY;\r
-                       nHeight = pOriginalWindowPosition->nOriginalHeight;\r
+               if (pPos->bMax[direction]) {\r
+                       Y = pPos->nOriginalY;\r
+                       nHeight = pPos->nOriginalHeight;\r
                } else {\r
-                       pOriginalWindowPosition->nOriginalY = Y;\r
-                       pOriginalWindowPosition->nOriginalHeight = nHeight;\r
+                       pPos->nOriginalY = Y;\r
+                       pPos->nOriginalHeight = nHeight;\r
 \r
                        Y = workarea.top;\r
                        nHeight = workarea.bottom - workarea.top;\r
                }\r
                break;\r
        case HORIZONTAL:\r
-               if (pOriginalWindowPosition->bMax[direction]) {\r
-                       X = pOriginalWindowPosition->nOriginalX;\r
-                       nWidth = pOriginalWindowPosition->nOriginalWidth;\r
+               if (pPos->bMax[direction]) {\r
+                       X = pPos->nOriginalX;\r
+                       nWidth = pPos->nOriginalWidth;\r
                } else {\r
-                       pOriginalWindowPosition->nOriginalX = X;\r
-                       pOriginalWindowPosition->nOriginalWidth = nWidth;\r
+                       pPos->nOriginalX = X;\r
+                       pPos->nOriginalWidth = nWidth;\r
 \r
                        X = workarea.left;\r
                        nWidth = workarea.right - workarea.left;\r
                }\r
                break;\r
        case ROLL_UP_UNROLL:\r
-               if (pOriginalWindowPosition->bMax[direction]) {\r
-                       nHeight = pOriginalWindowPosition->nOriginalHeight;\r
+               if (pPos->bMax[direction]) {\r
+                       nHeight = pPos->nOriginalHeight;\r
                } else {\r
-                       pOriginalWindowPosition->nOriginalHeight = nHeight;\r
+                       pPos->nOriginalHeight = nHeight;\r
 \r
                        nHeight = 0x15;\r
                }\r
@@ -1368,7 +1365,7 @@ int CCommands::Maximize(MAXIMIZE_DIRECTION direction)
        }\r
 \r
        MoveWindow(hWnd, X, Y, nWidth, nHeight, TRUE);\r
-       pOriginalWindowPosition->bMax[direction] = !pOriginalWindowPosition->bMax[direction];\r
+       pPos->bMax[direction] = !pPos->bMax[direction];\r
        return Reset(GOTO_HOOK);\r
 }\r
 \r
@@ -1468,9 +1465,14 @@ DWORD CCommands::DeactivateMark()
                AdKduAu('E', 'I');\r
                return ERROR_SUCCESS;   // i.e. return 0;\r
        }\r
-       if (CUtils::IsVisualStudioDotNet()) {   // Ctrl + Click select a word on Visual Studio .NET\r
-               ReleaseKey(VK_CONTROL);\r
-               return ClickCaret();\r
+       if (CUtils::IsVisualStudio()) { // Ctrl + Click select a word on Visual Studio .NET\r
+               BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+               if (bIsCtrlDown)\r
+                       ReleaseKey(VK_CONTROL);\r
+               DWORD res = ClickCaret();\r
+               if (bIsCtrlDown)\r
+                       DepressKey(VK_CONTROL);\r
+               return res;\r
        }\r
 \r
        return ClickCaret();\r
@@ -1483,7 +1485,7 @@ int CCommands::FindFile()
        if (CUtils::IsFlash()\r
         || CUtils::IsSleipnir()) {\r
                CdKduCu('O');\r
-       } else if (CUtils::IsVisualStudioDotNet()) {\r
+       } else if (CUtils::IsVisualStudio()) {\r
                AdKduAu('F', 'O', 'F');\r
        } else {\r
                AdKduAu('F', 'O');\r
@@ -1605,7 +1607,6 @@ BOOL CCommands::bC_()
 void CCommands::bC_(BOOL b)\r
 {\r
        m_bC_ = b;\r
-       CXkeymacsDll::ModifyShell_NotifyIcon(CTRL_ICON, m_bC_);\r
 }\r
 \r
 BOOL CCommands::bC_x()\r
@@ -1616,7 +1617,6 @@ BOOL CCommands::bC_x()
 void CCommands::bC_x(BOOL b)\r
 {\r
        m_bC_x = b;\r
-       CXkeymacsDll::ModifyShell_NotifyIcon(CX_ICON, m_bC_x);\r
 }\r
 \r
 BOOL CCommands::bM_x()\r
@@ -1629,9 +1629,9 @@ void CCommands::bM_x(const BOOL b)
        m_bM_x = b;\r
 \r
        if (b) {\r
-               CXkeymacsDll::ModifyM_xTip("");\r
+               CXkeymacsDll::SetM_xTip("");\r
        } else {\r
-               CXkeymacsDll::ModifyM_xTip(NULL);\r
+               CXkeymacsDll::SetM_xTip(NULL);\r
        }\r
 }\r
 \r
@@ -1794,9 +1794,10 @@ int CCommands::YankPop()
 // M-!: cmd.exe/command.com\r
 int CCommands::ShellCommand()\r
 {\r
-       if (!CUtils::Run(_tgetenv(_T("XKEYMACS_SHELL")))) {\r
-               CUtils::Run(_tgetenv(_T("COMSPEC")));\r
-       }\r
+       TCHAR szShell[MAX_PATH];\r
+       size_t len;\r
+       !_tgetenv_s(&len, szShell, _T("XKEYMACS_SHELL")) && len != 0 && CUtils::Run(szShell) ||\r
+               !_tgetenv_s(&len, szShell, _T("COMSPEC")) && len != 0 && CUtils::Run(szShell);\r
        return Reset(GOTO_HOOK);\r
 }\r
 \r
@@ -1809,7 +1810,6 @@ int CCommands::Ignore()
 void CCommands::bM_(BOOL b)\r
 {\r
        m_bM_ = b;\r
-       CXkeymacsDll::ModifyShell_NotifyIcon(META_ICON, m_bM_);\r
 }\r
 \r
 BOOL CCommands::bM_()\r
@@ -2458,7 +2458,6 @@ void CCommands::OpenFindDialog()
         || CUtils::IseMemoPad()\r
         || CUtils::IsJmEditor()\r
         || CUtils::IsK2Editor()\r
-        || (CUtils::IsNotepad() && CUtils::IsNTor9x())\r
         || CUtils::IsOedit()\r
         || CUtils::IsOpenJane()\r
         || CUtils::IsPHPEditor()\r
@@ -2471,7 +2470,7 @@ void CCommands::OpenFindDialog()
                AdKduAu('S', VK_RETURN);\r
        } else if (CUtils::IsNami2000()) {\r
                AdKduAu('D', 'F');\r
-       } else if (CUtils::IsVisualStudioDotNet()) {\r
+       } else if (CUtils::IsVisualStudio()) {\r
                AdKduAu('E', 'F', 'F');\r
        } else if (CUtils::IsDirector()) {\r
                AdKduAu('E', 'F', 'T');\r
@@ -2544,7 +2543,7 @@ int CCommands::Search(SEARCH_DIRECTION direction)
        }\r
 \r
        if (CUtils::IsVisualCpp()\r
-        || CUtils::IsVisualStudioDotNet()) {\r
+        || CUtils::IsVisualStudio()) {\r
                switch (direction) {\r
                case FORWARD:\r
                        CdKduCu('I');\r
@@ -2861,7 +2860,7 @@ int CCommands::KillBuffer()
 \r
 BOOL CCommands::IsKillCommand(int (*nFunctionPointer)())\r
 {\r
-       for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+       for (int nCommandID = 1; nCommandID < MAX_COMMAND; ++nCommandID) {\r
                if (Commands[nCommandID].fCommand == nFunctionPointer) {\r
                        return !_tcsncmp(Commands[nCommandID].szCommandName, _T("kill-"), 5);\r
                }\r
@@ -3091,7 +3090,7 @@ int CCommands::Escape()
 int CCommands::Tilde()\r
 {\r
        ClearNumericArgument();\r
-       if (CXkeymacsData::Is106Keyboard()) {\r
+       if (CXkeymacsDll::Is106Keyboard()) {\r
                SdKduSu(0xDE);  // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
                Su();                   //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
        } else {\r
@@ -3104,7 +3103,7 @@ int CCommands::Tilde()
 int CCommands::BackQuote()\r
 {\r
        ClearNumericArgument();\r
-       if (CXkeymacsData::Is106Keyboard()) {\r
+       if (CXkeymacsDll::Is106Keyboard()) {\r
                SdKduSu(0xC0);\r
                Su();\r
        } else {\r
@@ -3193,7 +3192,7 @@ BYTE CCommands::GetDirectionForwardKey()
         || CUtils::IsOpenJane()\r
         || CUtils::IsStoryEditor()\r
         || CUtils::IsVisualBasicEditor()\r
-        || CUtils::IsVisualStudioDotNet()\r
+        || CUtils::IsVisualStudio()\r
         || CUtils::IsWordpad()) {\r
                bDirectionForward = 0;\r
        } else if (CUtils::IsLotusNotes()\r
@@ -3280,130 +3279,6 @@ BYTE CCommands::GetDirectionBackwardKey()
        return bDirectionBackward;\r
 }\r
 \r
-void CCommands::GetCaretPosition()\r
-{\r
-//     CUtils::Log(_T("GetClipboardTextLength = %d"), CUtils::GetClipboardTextLength());\r
-\r
-       try {\r
-               POINT *pCaretPos = new POINT;\r
-               if (pCaretPos && GetCaretPos(pCaretPos)) {\r
-//                     CUtils::Log(_T("x = %d, y = %d"), pCaretPos->x, pCaretPos->y);\r
-                       m_CaretPos.AddTail(pCaretPos);\r
-               } else {\r
-                       delete pCaretPos;\r
-                       pCaretPos = NULL;\r
-               }\r
-       }\r
-       catch (CMemoryException* e) {\r
-               e->Delete();\r
-//             CUtils::Log("GetCaretPosition: pCaretPos: 'new' threw an exception");\r
-       }\r
-\r
-       try {\r
-               SCROLLINFO *pScrollInfo = new SCROLLINFO;\r
-               if (pScrollInfo) {\r
-                       memset(pScrollInfo, 0, sizeof(SCROLLINFO));\r
-                       pScrollInfo->cbSize = sizeof(SCROLLINFO);\r
-                       pScrollInfo->fMask = SIF_ALL;\r
-                       if (GetScrollInfo(GetFocus(), SB_VERT, pScrollInfo)) {\r
-//                             CUtils::Log(_T("page = %d, pos = %d, max = %d, min = %d, trackpos = %d"), pScrollInfo->nPage, pScrollInfo->nPos, pScrollInfo->nMax, pScrollInfo->nMin, pScrollInfo->nTrackPos);\r
-                               m_ScrollInfo.AddTail(pScrollInfo);\r
-                       } else {\r
-//                             CUtils::Log(_T("GetScrollInfo Error: %d"), GetLastError());\r
-                               delete pScrollInfo;\r
-                               pScrollInfo = NULL;\r
-                       }\r
-               }\r
-       }\r
-       catch (CMemoryException* e) {\r
-               e->Delete();\r
-//             CUtils::Log("GetCaretPosition: pScrollInfo: 'new' threw an exception");\r
-       }\r
-\r
-       try {\r
-               CString* pClipboardText = new CString;\r
-               if (pClipboardText) {\r
-                       CUtils::GetClipboardText(pClipboardText);\r
-                       CUtils::SetClipboardText(pClipboardText);\r
-                       m_FindText.AddTail(pClipboardText);\r
-               }\r
-       }\r
-       catch (CMemoryException* e) {\r
-               e->Delete();\r
-//             CUtils::Log("GetCaretPosition: pClipboardText: 'new' threw an exception");\r
-       }\r
-}\r
-\r
-BOOL CCommands::SetCaretPosition()\r
-{\r
-       {\r
-//             TCHAR buf[0x100] = {'\0'};\r
-//             GetWindowText(GetForegroundWindow(), buf, sizeof(buf));\r
-//             CUtils::Log(buf);\r
-       }\r
-\r
-       if (!m_ScrollInfo.IsEmpty()) {\r
-               SCROLLINFO* pScrollInfo = (SCROLLINFO*)m_ScrollInfo.GetTail();\r
-               delete pScrollInfo;\r
-               pScrollInfo = NULL;\r
-               m_ScrollInfo.RemoveTail();\r
-       }\r
-       if (!m_ScrollInfo.IsEmpty()) {\r
-               SCROLLINFO* pScrollInfo = (SCROLLINFO*)m_ScrollInfo.GetTail();\r
-               SendMessage(GetFocus(), WM_VSCROLL, SB_THUMBPOSITION | (pScrollInfo->nPos << 0x10), NULL);\r
-       }\r
-\r
-       BOOL bMoveCaret = FALSE;\r
-       if (!m_CaretPos.IsEmpty()) {\r
-               POINT* pCaretPos = (POINT*)m_CaretPos.GetTail();\r
-               delete pCaretPos;\r
-               pCaretPos = NULL;\r
-               m_CaretPos.RemoveTail();\r
-       }\r
-       if (!m_CaretPos.IsEmpty()) {\r
-               POINT* pCaretPos = (POINT*)m_CaretPos.GetTail();\r
-               SetCaretPos(pCaretPos->x, pCaretPos->y);\r
-\r
-//             CUtils::Log(_T("set x = %d), y = %d", p->x, p->y);\r
-\r
-               DeactivateMark();\r
-\r
-               const int nPreviousFindTextLength = CUtils::GetClipboardTextLength();\r
-               if (0 < nPreviousFindTextLength) {\r
-                       if (CUtils::IsWordpad()) {\r
-                               POSITION position = m_FindText.GetTailPosition();\r
-                               CString* pPreviousFindText = (CString*)m_FindText.GetPrev(position);\r
-                               CString* pNextFindText = (CString*)m_FindText.GetPrev(position);\r
-                               if (*pPreviousFindText == *pNextFindText) {\r
-                                       for (int i = 0; i <= nPreviousFindTextLength; ++i) {\r
-                                               Kdu(VK_LEFT);\r
-                                       }\r
-                               } else {\r
-                                       Kdu(VK_LEFT);\r
-                               }\r
-                       }\r
-                       bMoveCaret = TRUE;\r
-               }\r
-       } else {\r
-               Kdu(VK_LEFT);\r
-       }\r
-\r
-//     CUtils::Log(_T("scrollInfo.GetCount() = %d, szFindText.GetLength() = %d"), scrollInfo.GetCount(), szFindText.GetLength());\r
-\r
-       if (!m_FindText.IsEmpty()) {\r
-               CString *pFindText = (CString *)m_FindText.GetTail();\r
-               delete pFindText;\r
-               pFindText = NULL;\r
-               m_FindText.RemoveTail();\r
-       }\r
-       if (!m_FindText.IsEmpty()) {\r
-               CString *pFindText = (CString *)m_FindText.GetTail();\r
-               CUtils::SetClipboardText(pFindText);\r
-       }\r
-\r
-       return bMoveCaret;\r
-}\r
-\r
 void CCommands::SetMark(BOOL bSetMark)\r
 {\r
        m_bSetMark = bSetMark;\r
@@ -3812,7 +3687,7 @@ BOOL CCommands::IsEmptyClipboardData(const int nID)
 \r
 void CCommands::PrintFunctionName(int (*nFunctionPointer)())\r
 {\r
-       for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+       for (int nCommandID = 1; nCommandID < MAX_COMMAND; ++nCommandID) {\r
                if (Commands[nCommandID].fCommand == nFunctionPointer) {\r
                        CUtils::Log(_T("m_LastCommand: %s"), Commands[nCommandID].szCommandName);\r
                }\r
@@ -3829,7 +3704,7 @@ int CCommands::CapsLock()
 int CCommands::Underscore()\r
 {\r
        ClearNumericArgument();\r
-       if (CXkeymacsData::Is106Keyboard()) {\r
+       if (CXkeymacsDll::Is106Keyboard()) {\r
                SdKduSu(0xE2);  // VK_OEM_102   Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard\r
                Su();\r
        } else {\r
@@ -3968,27 +3843,6 @@ int CCommands::TransposeWords()
        return Reset(GOTO_HOOK);\r
 }\r
 \r
-BOOL CCommands::GetCaretPos(LPPOINT lpPoint)\r
-{\r
-       if (CUtils::IsMicrosoftWord()\r
-        || CUtils::IsThunderbird()) {\r
-               IMECHARPOSITION ImeCharPosition = {sizeof(IMECHARPOSITION)};\r
-\r
-               CallWindowProc((WNDPROC)GetWindowLongPtr(GetFocus(), GWLP_WNDPROC), GetFocus(), WM_IME_REQUEST, IMR_QUERYCHARPOSITION, (LPARAM)&ImeCharPosition);\r
-//             CUtils::Log(_T("ImeCharPosition: rc = %d, x = %d, y = %d"), 0, ImeCharPosition.pt.x, ImeCharPosition.pt.y);\r
-\r
-               ScreenToClient(GetFocus(), &ImeCharPosition.pt);\r
-//             CUtils::Log(_T("ScreenToClient: rc = %d, x = %d, y = %d"), 0, ImeCharPosition.pt.x, ImeCharPosition.pt.y);\r
-\r
-               *lpPoint = ImeCharPosition.pt;\r
-//             CUtils::Log(_T("x = %d, y = %d"), lpPoint->x, lpPoint->y);\r
-\r
-               return TRUE;\r
-       }\r
-\r
-       return ::GetCaretPos(lpPoint);\r
-}\r
-\r
 LRESULT CCommands::VScroll(UINT nSBCode, const int nTimes)\r
 {\r
        if (CUtils::IsMicrosoftWord()\r
@@ -4384,3 +4238,147 @@ int CCommands::ExecuteExtendedCommand()
        bM_x(TRUE);\r
        return Reset(GOTO_HOOKX);\r
 }\r
+\r
+CString CCommands::GetCommandName(int nCommandID)\r
+{\r
+       CString szCommandName(Commands[nCommandID].szCommandName);\r
+       return szCommandName;\r
+}\r
+\r
+int CCommands::GetCategoryID(int nCommandID)\r
+{\r
+       return Commands[nCommandID].nCategoryID;\r
+}\r
+\r
+int CCommands::GetDescriptionID(int nCommandID)\r
+{\r
+       return Commands[nCommandID].nDescriptionID;\r
+}\r
+\r
+int CCommands::GetToolTipID(int nCommandID)\r
+{\r
+       return Commands[nCommandID].nToolTipID;\r
+}\r
+\r
+int CCommands::GetDefaultCommandType(int nCommandID, int nIndex)\r
+{\r
+       if (nCommandID < 0 || sizeof(Commands) / sizeof(Commands[0]) <= nCommandID\r
+        || nIndex < 0 || sizeof(Commands[nCommandID].keybind) / sizeof(Commands[nCommandID].keybind[0]) <= nIndex) {\r
+               ASSERT(0);\r
+               return NONE;\r
+       }\r
+\r
+       int nCommandType        = Commands[nCommandID].keybind[nIndex].nCommandType;\r
+       int bVk                         = Commands[nCommandID].keybind[nIndex].bVk;\r
+\r
+       if (CXkeymacsDll::Is106Keyboard()) {\r
+               if (nCommandType & SHIFT) {     // Shift\r
+                       switch (bVk) {\r
+                       case '2':\r
+                       case '6':\r
+                       case 0xBA:              // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
+                               nCommandType &= ~SHIFT;\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               } else {                                        // Normal\r
+                       switch (bVk) {\r
+                       case 0xBB:              // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
+                       case 0xC0:              // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
+                       case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+                               nCommandType |= SHIFT;\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return nCommandType;\r
+}\r
+\r
+int CCommands::GetDefaultCommandKey(int nCommandID, int nIndex)\r
+{\r
+       if (nCommandID < 0 || sizeof(Commands) / sizeof(Commands[0]) <= nCommandID\r
+        || nIndex < 0 || sizeof(Commands[nCommandID].keybind) / sizeof(Commands[nCommandID].keybind[0]) <= nIndex) {\r
+               ASSERT(0);\r
+               return 0;\r
+       }\r
+\r
+       int nCommandType        = Commands[nCommandID].keybind[nIndex].nCommandType;\r
+       int bVk                         = Commands[nCommandID].keybind[nIndex].bVk;\r
+\r
+       if (CXkeymacsDll::Is106Keyboard()) {\r
+               if (nCommandType & SHIFT) {     // Shift\r
+                       switch (bVk) {\r
+                       case '0':\r
+                               bVk = '9';\r
+                               break;\r
+                       case '2':\r
+                               bVk = 0xC0;     // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
+                               break;\r
+                       case '6':\r
+                               bVk = 0xDE;     // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+                               break;\r
+                       case '7':\r
+                               bVk = '6';\r
+                               break;\r
+                       case '8':\r
+                               bVk = 0xBA;     // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
+                               break;\r
+                       case '9':\r
+                               bVk = '8';\r
+                               break;\r
+                       case 0xBD:              // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
+                               bVk = 0xE2;     // VK_OEM_102   Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard\r
+                               break;\r
+                       case 0xC0:\r
+                               bVk = 0xDE;     // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+                               break;\r
+                       case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+                               bVk = '2';\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               } else {                                        // Normal\r
+                       switch (bVk) {\r
+                       case 0xBA:              // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
+                               bVk = 0xBB;     // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
+                               break;\r
+                       case 0xBB:              // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
+                               bVk = 0xBD;     // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
+                               break;\r
+                       case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
+                                                       //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+                               bVk = '7';\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return bVk;\r
+}\r
+\r
+int CCommands::GetDefaultControlID(int nCommandID, int nIndex)\r
+{\r
+       if (nCommandID < 0 || sizeof(Commands) / sizeof(Commands[0]) <= nCommandID\r
+        || nIndex < 0 || sizeof(Commands[nCommandID].keybind) / sizeof(Commands[nCommandID].keybind[0]) <= nIndex) {\r
+               ASSERT(0);\r
+               return 0;\r
+       }\r
+\r
+       return Commands[nCommandID].keybind[nIndex].nControlID;\r
+}\r