// pRCon may be NULL // Returns either NULL or valid pointer to ConEmuHotKey const ConEmuHotKey* ConEmuHotKeyList::FindHotKey(const ConEmuChord& VkState, CRealConsole* pRCon) { // На сами модификаторы - действий не вешается switch (VkState.Vk) { case VK_LWIN: case VK_RWIN: case VK_SHIFT: case VK_LSHIFT: case VK_RSHIFT: case VK_CONTROL: case VK_LCONTROL: case VK_RCONTROL: case VK_MENU: case VK_LMENU: case VK_RMENU: return NULL; case 0: _ASSERTE(VkState.Vk!=0); return NULL; } const ConEmuHotKey* p = NULL; // Теперь бежим по mp_HotKeys и сравниваем требуемые модификаторы for (int i = 0;; i++) { const ConEmuHotKey* pi = GetHotKeyPtr(i); if (!pi) break; if (pi->HkType == chk_Modifier) continue; // Hotkey was not set in settings? if (!pi->Key.Vk) continue; // May be disabled by settings or context? if (pi->Enabled) { if (!pi->Enabled()) continue; } // Do compare (chord keys are planned) if (!pi->Key.IsEqual(VkState)) continue; // The function if (pi->fkey) { // Допускается ли этот хоткей в текущем контексте? if (pi->fkey(VkState, true, pi, pRCon)) { p = pi; break; // Нашли } } else { // Хоткей должен знать, что он "делает" _ASSERTE(pi->fkey!=NULL); } } return p; }
// pRCon may be NULL const ConEmuHotKey* ConEmuHotKeyList::GetHotKeyInfo(const ConEmuChord& VkState, bool bKeyDown, CRealConsole* pRCon) { // На сами модификаторы - действий не вешается switch (VkState.Vk) { case VK_LWIN: case VK_RWIN: case VK_SHIFT: case VK_LSHIFT: case VK_RSHIFT: case VK_CONTROL: case VK_LCONTROL: case VK_RCONTROL: case VK_MENU: case VK_LMENU: case VK_RMENU: return NULL; case 0: _ASSERTE(VkState.Vk!=0); return NULL; } const ConEmuHotKey* p = NULL; // Теперь бежим по mp_HotKeys и сравниваем требуемые модификаторы for (int i = 0;; i++) { const ConEmuHotKey* pi = GetHotKeyPtr(i); if (!pi) break; if (pi->HkType == chk_Modifier) continue; // Hotkey was not set in settings? if (!pi->Key.Vk) continue; // May be disabled by settings or context? if (pi->Enabled) { if (!pi->Enabled()) continue; } // Do compare (chord keys are planned) if (!pi->Key.IsEqual(VkState)) continue; // The function if (pi->fkey) { // Допускается ли этот хоткей в текущем контексте? if (pi->fkey(VkState, true, pi, pRCon)) { p = pi; break; // Нашли } } else { // Хоткей должен знать, что он "делает" _ASSERTE(pi->fkey!=NULL); } } // Некоторые комбинации нужно обрабатывать "на отпускание" во избежание глюков с интерфейсом if (p) { // Поэтому проверяем, совпадает ли требование "нажатости" if (p->OnKeyUp == bKeyDown) p = ConEmuSkipHotKey; } return p; }