int QuickView::ProcessKey(const Manager::Key& Key) { int LocalKey=Key.FarKey(); if (!IsVisible()) return FALSE; if (LocalKey>=KEY_RCTRL0 && LocalKey<=KEY_RCTRL9) { ExecShortcutFolder(LocalKey-KEY_RCTRL0); return TRUE; } if (LocalKey == KEY_F1) { Help::create(L"QViewPanel"); return TRUE; } if (LocalKey==KEY_F3 || LocalKey==KEY_NUMPAD5 || LocalKey == KEY_SHIFTNUMPAD5) { auto AnotherPanel = Parent()->GetAnotherPanel(this); if (AnotherPanel->GetType()==FILE_PANEL) AnotherPanel->ProcessKey(Manager::Key(KEY_F3)); return TRUE; } if (LocalKey==KEY_ADD || LocalKey==KEY_SUBTRACT) { auto AnotherPanel = Parent()->GetAnotherPanel(this); if (AnotherPanel->GetType()==FILE_PANEL) AnotherPanel->ProcessKey(Manager::Key(LocalKey==KEY_ADD?KEY_DOWN:KEY_UP)); return TRUE; } if (QView && !Directory && LocalKey>=256) { int ret = QView->ProcessKey(Manager::Key(LocalKey)); if (LocalKey == KEY_F2 || LocalKey == KEY_SHIFTF2 || LocalKey == KEY_F4 || LocalKey == KEY_SHIFTF4 || LocalKey == KEY_F8 || LocalKey == KEY_SHIFTF8) { DynamicUpdateKeyBar(); Parent()->GetKeybar().Redraw(); } if (LocalKey == KEY_F7 || LocalKey == KEY_SHIFTF7) { //__int64 Pos; //int Length; //DWORD Flags; //QView->GetSelectedParam(Pos,Length,Flags); Redraw(); Parent()->GetAnotherPanel(this)->Redraw(); //QView->SelectText(Pos,Length,Flags|1); } return ret; } return FALSE; }
bool Panel::ExecShortcutFolder(int Pos) { Shortcuts::data Data; return Shortcuts(Pos).Get(Data) && ExecShortcutFolder(std::move(Data.Folder), Data.PluginGuid, Data.PluginFile, Data.PluginData, true); }
int Panel::SetPluginCommand(int Command,int Param1,void* Param2) { _ALGO(CleverSysLog clv(L"Panel::SetPluginCommand")); _ALGO(SysLog(L"(Command=%s, Param1=[%d/0x%08X], Param2=[%d/0x%08X])",_FCTL_ToName(Command),(int)Param1,Param1,(int)Param2,Param2)); int Result=FALSE; ProcessingPluginCommand++; switch (Command) { case FCTL_SETVIEWMODE: Result = Parent()->ChangePanelViewMode(shared_from_this(), Param1, Parent()->IsTopWindow()); break; case FCTL_SETSORTMODE: { int Mode=Param1; if ((Mode>SM_DEFAULT) && (Mode < SM_COUNT)) { SetSortMode(panel_sort(Mode - 1)); // Уменьшим на 1 из-за SM_DEFAULT Result=TRUE; } break; } case FCTL_SETSORTORDER: { ChangeSortOrder(Param1 != 0); Result=TRUE; break; } case FCTL_SETDIRECTORIESFIRST: { ChangeDirectoriesFirst(Param1 != 0); Result=TRUE; break; } case FCTL_CLOSEPANEL: if (m_PanelMode == panel_mode::PLUGIN_PANEL) { string folder=NullToEmpty((const wchar_t *)Param2); SetCurDir(folder,true); if (folder.empty()) Update(UPDATE_KEEP_SELECTION); Redraw(); } Result=TRUE; break; case FCTL_GETPANELINFO: { PanelInfo *Info=(PanelInfo *)Param2; if(!CheckStructSize(Info)) break; *Info = {}; Info->StructSize = sizeof(PanelInfo); UpdateIfRequired(); Info->OwnerGuid=FarGuid; Info->PluginHandle=nullptr; switch (GetType()) { case panel_type::FILE_PANEL: Info->PanelType=PTYPE_FILEPANEL; break; case panel_type::TREE_PANEL: Info->PanelType=PTYPE_TREEPANEL; break; case panel_type::QVIEW_PANEL: Info->PanelType=PTYPE_QVIEWPANEL; break; case panel_type::INFO_PANEL: Info->PanelType=PTYPE_INFOPANEL; break; } int X1,Y1,X2,Y2; GetPosition(X1,Y1,X2,Y2); Info->PanelRect.left=X1; Info->PanelRect.top=Y1; Info->PanelRect.right=X2; Info->PanelRect.bottom=Y2; Info->ViewMode=GetViewMode(); Info->SortMode = static_cast<OPENPANELINFO_SORTMODES>((GetSortMode() < panel_sort::COUNT? SM_UNSORTED - static_cast<int>(panel_sort::UNSORTED) : 0) + static_cast<int>(GetSortMode())); Info->Flags |= Global->Opt->ShowHidden? PFLAGS_SHOWHIDDEN : 0; Info->Flags |= Global->Opt->Highlight? PFLAGS_HIGHLIGHT : 0; Info->Flags |= GetSortOrder()? PFLAGS_REVERSESORTORDER : 0; Info->Flags |= GetSortGroups()? PFLAGS_USESORTGROUPS : 0; Info->Flags |= GetSelectedFirstMode()? PFLAGS_SELECTEDFIRST : 0; Info->Flags |= GetDirectoriesFirst()? PFLAGS_DIRECTORIESFIRST : 0; Info->Flags |= (GetMode() == panel_mode::PLUGIN_PANEL)? PFLAGS_PLUGIN : 0; Info->Flags |= IsVisible()? PFLAGS_VISIBLE : 0; Info->Flags |= IsFocused()? PFLAGS_FOCUS : 0; Info->Flags |= Parent()->IsLeft(this)? PFLAGS_PANELLEFT : 0; if (GetType() == panel_type::FILE_PANEL) { FileList *DestFilePanel=(FileList *)this; if (Info->Flags&PFLAGS_PLUGIN) { Info->OwnerGuid = DestFilePanel->GetPluginHandle()->plugin()->Id(); Info->PluginHandle = DestFilePanel->GetPluginHandle()->panel(); static int Reenter=0; if (!Reenter) { Reenter++; OpenPanelInfo PInfo; DestFilePanel->GetOpenPanelInfo(&PInfo); if (PInfo.Flags & OPIF_REALNAMES) Info->Flags |= PFLAGS_REALNAMES; if (PInfo.Flags & OPIF_DISABLEHIGHLIGHTING) Info->Flags &= ~PFLAGS_HIGHLIGHT; if (PInfo.Flags & OPIF_USECRC32) Info->Flags |= PFLAGS_USECRC32; if (PInfo.Flags & OPIF_SHORTCUT) Info->Flags |= PFLAGS_SHORTCUT; Reenter--; } } DestFilePanel->PluginGetPanelInfo(*Info); } if (!(Info->Flags&PFLAGS_PLUGIN)) // $ 12.12.2001 DJ - на неплагиновой панели - всегда реальные имена Info->Flags |= PFLAGS_REALNAMES; Result=TRUE; break; } case FCTL_GETPANELPREFIX: { string strTemp; if (GetType() == panel_type::FILE_PANEL && GetMode() == panel_mode::PLUGIN_PANEL) { PluginInfo PInfo = {sizeof(PInfo)}; FileList *DestPanel = ((FileList*)this); if (DestPanel->GetPluginInfo(&PInfo)) strTemp = NullToEmpty(PInfo.CommandPrefix); } if (Param1&&Param2) xwcsncpy((wchar_t*)Param2, strTemp.c_str(), Param1); Result=(int)strTemp.size()+1; break; } case FCTL_GETPANELHOSTFILE: case FCTL_GETPANELFORMAT: { string strTemp; if (GetType() == panel_type::FILE_PANEL) { FileList *DestFilePanel=(FileList *)this; static int Reenter=0; if (!Reenter && GetMode() == panel_mode::PLUGIN_PANEL) { Reenter++; OpenPanelInfo PInfo; DestFilePanel->GetOpenPanelInfo(&PInfo); switch (Command) { case FCTL_GETPANELHOSTFILE: strTemp=NullToEmpty(PInfo.HostFile); break; case FCTL_GETPANELFORMAT: strTemp=NullToEmpty(PInfo.Format); break; } Reenter--; } } if (Param1&&Param2) xwcsncpy((wchar_t*)Param2, strTemp.c_str(), Param1); Result=(int)strTemp.size()+1; break; } case FCTL_GETPANELDIRECTORY: { static int Reenter=0; if(!Reenter) { Reenter++; ShortcutInfo Info; GetShortcutInfo(Info); Result = static_cast<int>(aligned_sizeof<FarPanelDirectory>()); const auto folderOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.ShortcutFolder.size()+1)); const auto pluginFileOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.PluginFile.size()+1)); const auto pluginDataOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.PluginData.size()+1)); const auto dirInfo = static_cast<FarPanelDirectory*>(Param2); if(Param1>=Result && CheckStructSize(dirInfo)) { dirInfo->StructSize=sizeof(FarPanelDirectory); dirInfo->PluginId=Info.PluginGuid; dirInfo->Name = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + folderOffset)); dirInfo->Param = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + pluginDataOffset)); dirInfo->File = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + pluginFileOffset)); *std::copy(ALL_CONST_RANGE(Info.ShortcutFolder), const_cast<wchar_t*>(dirInfo->Name)) = L'\0'; *std::copy(ALL_CONST_RANGE(Info.PluginData), const_cast<wchar_t*>(dirInfo->Param)) = L'\0'; *std::copy(ALL_CONST_RANGE(Info.PluginFile), const_cast<wchar_t*>(dirInfo->File)) = L'\0'; } Reenter--; } break; } case FCTL_GETCOLUMNTYPES: case FCTL_GETCOLUMNWIDTHS: if (GetType() == panel_type::FILE_PANEL) { string strColumnTypes,strColumnWidths; ((FileList *)this)->PluginGetColumnTypesAndWidths(strColumnTypes,strColumnWidths); if (Command==FCTL_GETCOLUMNTYPES) { if (Param1&&Param2) xwcsncpy((wchar_t*)Param2,strColumnTypes.c_str(),Param1); Result=(int)strColumnTypes.size()+1; } else { if (Param1&&Param2) xwcsncpy((wchar_t*)Param2,strColumnWidths.c_str(),Param1); Result=(int)strColumnWidths.size()+1; } } break; case FCTL_GETPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) Result = static_cast<int>(static_cast<FileList*>(this)->PluginGetPanelItem(Param1, static_cast<FarGetPluginPanelItem*>(Param2))); break; } case FCTL_GETSELECTEDPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) Result = static_cast<int>(static_cast<FileList*>(this)->PluginGetSelectedPanelItem(Param1, static_cast<FarGetPluginPanelItem*>(Param2))); break; } case FCTL_GETCURRENTPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) { PanelInfo Info; const auto DestPanel = static_cast<FileList*>(this); DestPanel->PluginGetPanelInfo(Info); Result = static_cast<int>(DestPanel->PluginGetPanelItem(static_cast<int>(Info.CurrentItem), static_cast<FarGetPluginPanelItem*>(Param2))); } break; } case FCTL_BEGINSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginBeginSelection(); Result=TRUE; } break; } case FCTL_SETSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginSetSelection(Param1, Param2 != nullptr); Result=TRUE; } break; } case FCTL_CLEARSELECTION: { if (GetType() == panel_type::FILE_PANEL) { static_cast<FileList*>(this)->PluginClearSelection(Param1); Result=TRUE; } break; } case FCTL_ENDSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginEndSelection(); Result=TRUE; } break; } case FCTL_UPDATEPANEL: Update(Param1?UPDATE_KEEP_SELECTION:0); if (GetType() == panel_type::QVIEW_PANEL) UpdateViewPanel(); Result=TRUE; break; case FCTL_REDRAWPANEL: { PanelRedrawInfo *Info=(PanelRedrawInfo *)Param2; if (CheckStructSize(Info)) { m_CurFile=static_cast<int>(Info->CurrentItem); m_CurTopFile=static_cast<int>(Info->TopPanelItem); } // $ 12.05.2001 DJ перерисовываемся только в том случае, если мы - текущее окно if (Parent()->IsTopWindow()) Redraw(); Result=TRUE; break; } case FCTL_SETPANELDIRECTORY: { const auto dirInfo = static_cast<const FarPanelDirectory*>(Param2); if (CheckStructSize(dirInfo)) { Result = ExecShortcutFolder(NullToEmpty(dirInfo->Name), dirInfo->PluginId, NullToEmpty(dirInfo->File), NullToEmpty(dirInfo->Param), false, false, true); // restore current directory to active panel path if (!IsFocused()) { Parent()->ActivePanel()->SetCurPath(); } } break; } case FCTL_SETACTIVEPANEL: { if (IsVisible()) { Parent()->SetActivePanel(this); Result=TRUE; } break; } } ProcessingPluginCommand--; return Result; }
bool CommandLine::ProcessKey(const Manager::Key& Key) { auto LocalKey = Key; if ((LocalKey()==KEY_CTRLEND || LocalKey()==KEY_RCTRLEND || LocalKey()==KEY_CTRLNUMPAD1 || LocalKey()==KEY_RCTRLNUMPAD1) && (CmdStr.GetCurPos()==CmdStr.GetLength())) { if (LastCmdPartLength==-1) strLastCmdStr = CmdStr.GetString(); auto strStr = strLastCmdStr; const auto CurCmdPartLength = strStr.size(); Global->CtrlObject->CmdHistory->GetSimilar(strStr,LastCmdPartLength); if (LastCmdPartLength==-1) { strLastCmdStr = CmdStr.GetString(); LastCmdPartLength = static_cast<int>(CurCmdPartLength); } { SCOPED_ACTION(SetAutocomplete)(&CmdStr); CmdStr.SetString(strStr); CmdStr.Select(LastCmdPartLength,static_cast<int>(strStr.size())); } Show(); return true; } if (LocalKey() == KEY_UP || LocalKey() == KEY_NUMPAD8) { if (Global->CtrlObject->Cp()->LeftPanel()->IsVisible() || Global->CtrlObject->Cp()->RightPanel()->IsVisible()) return false; LocalKey=KEY_CTRLE; } else if (LocalKey() == KEY_DOWN || LocalKey() == KEY_NUMPAD2) { if (Global->CtrlObject->Cp()->LeftPanel()->IsVisible() || Global->CtrlObject->Cp()->RightPanel()->IsVisible()) return false; LocalKey=KEY_CTRLX; } // $ 25.03.2002 VVM + При погашенных панелях колесом крутим историю if (!Global->CtrlObject->Cp()->LeftPanel()->IsVisible() && !Global->CtrlObject->Cp()->RightPanel()->IsVisible()) { switch (LocalKey()) { case KEY_MSWHEEL_UP: LocalKey = KEY_CTRLE; break; case KEY_MSWHEEL_DOWN: LocalKey = KEY_CTRLX; break; case KEY_MSWHEEL_LEFT: LocalKey = KEY_CTRLS; break; case KEY_MSWHEEL_RIGHT: LocalKey = KEY_CTRLD; break; } } switch (LocalKey()) { case KEY_CTRLE: case KEY_RCTRLE: case KEY_CTRLX: case KEY_RCTRLX: { if (Global->CtrlObject->CmdHistory->IsOnTop()) { m_CurCmdStr = CmdStr.GetString(); } SCOPED_ACTION(SetAutocomplete)(&CmdStr); const auto strStr = LocalKey() == KEY_CTRLE || LocalKey() == KEY_RCTRLE? Global->CtrlObject->CmdHistory->GetPrev() : Global->CtrlObject->CmdHistory->GetNext(); SetString(Global->CtrlObject->CmdHistory->IsOnTop()? m_CurCmdStr : strStr, true); } return true; case KEY_ESC: { // $ 24.09.2000 SVS - Если задано поведение по "Несохранению при Esc", то позицию в хистори не меняем и ставим в первое положение. if (Global->Opt->CmdHistoryRule) Global->CtrlObject->CmdHistory->ResetPosition(); SetString(L"", true); return true; } case KEY_F2: { UserMenu(false); return true; } case KEY_ALTF8: case KEY_RALTF8: { history_record_type Type; string strStr; const auto SelectType = Global->CtrlObject->CmdHistory->Select(msg(lng::MHistoryTitle), L"History"sv, strStr, Type); if (SelectType == HRT_ENTER || SelectType == HRT_SHIFTETNER || SelectType == HRT_CTRLENTER || SelectType == HRT_CTRLALTENTER) { std::unique_ptr<SetAutocomplete> disable; if(SelectType != HRT_CTRLENTER) { disable = std::make_unique<SetAutocomplete>(&CmdStr); } SetString(strStr, true); if (SelectType != HRT_CTRLENTER) { ProcessKey(SelectType == HRT_CTRLALTENTER? Manager::Key(KEY_CTRLALTENTER) : (SelectType == HRT_ENTER? Manager::Key(KEY_ENTER) : Manager::Key(KEY_SHIFTENTER))); } } } return true; case KEY_ALTF10: case KEY_RALTF10: if (!Global->Opt->Tree.TurnOffCompletely) { string strStr; const auto ActivePanel = Global->CtrlObject->Cp()->ActivePanel(); { // TODO: здесь можно добавить проверку, что мы в корне диска и отсутствие файла Tree.Far... FolderTree::create(strStr, MODALTREE_ACTIVE, TRUE, false); } Global->CtrlObject->Cp()->RedrawKeyBar(); if (!strStr.empty()) { ActivePanel->SetCurDir(strStr,true); ActivePanel->Show(); if (ActivePanel->GetType() == panel_type::TREE_PANEL) ActivePanel->ProcessKey(Manager::Key(KEY_ENTER)); } else { // TODO: ... а здесь проверить факт изменения/появления файла Tree.Far и мы опять же в корне (чтобы лишний раз не апдейтить панель) ActivePanel->Update(UPDATE_KEEP_SELECTION); ActivePanel->Redraw(); const auto AnotherPanel = Global->CtrlObject->Cp()->PassivePanel(); if (AnotherPanel->NeedUpdatePanel(ActivePanel.get())) { AnotherPanel->Update(UPDATE_KEEP_SELECTION);//|UPDATE_SECONDARY); AnotherPanel->Redraw(); } } } return true; case KEY_ALTF11: case KEY_RALTF11: ShowViewEditHistory(); Global->CtrlObject->Cp()->Redraw(); return true; case KEY_ALTF12: case KEY_RALTF12: { history_record_type Type; GUID Guid; string strFile, strData, strStr; const auto SelectType = Global->CtrlObject->FolderHistory->Select(msg(lng::MFolderHistoryTitle), L"HistoryFolders"sv, strStr, Type, &Guid, &strFile, &strData); switch(SelectType) { case HRT_ENTER: case HRT_SHIFTETNER: case HRT_CTRLSHIFTENTER: { if (SelectType == HRT_SHIFTETNER) Global->CtrlObject->FolderHistory->SetAddMode(false,2,true); // пусть плагин сам прыгает... ;-) auto Panel = Global->CtrlObject->Cp()->ActivePanel(); if (SelectType == HRT_CTRLSHIFTENTER) Panel = Global->CtrlObject->Cp()->PassivePanel(); //Type==1 - плагиновый путь //Type==0 - обычный путь Panel->ExecShortcutFolder(std::move(strStr), Guid, strFile, strData, true); // Panel may be changed if(SelectType == HRT_CTRLSHIFTENTER) { Panel = Global->CtrlObject->Cp()->ActivePanel(); Panel->SetCurPath(); Panel = Global->CtrlObject->Cp()->PassivePanel(); } else { Panel = Global->CtrlObject->Cp()->ActivePanel(); } Panel->Redraw(); Global->CtrlObject->FolderHistory->SetAddMode(true,2,true); } break; case HRT_CTRLENTER: SetString(strStr, true); break; default: break; } } return true; case KEY_NUMENTER: case KEY_SHIFTNUMENTER: case KEY_ENTER: case KEY_SHIFTENTER: case KEY_CTRLALTENTER: case KEY_RCTRLRALTENTER: case KEY_CTRLRALTENTER: case KEY_RCTRLALTENTER: case KEY_CTRLALTNUMENTER: case KEY_RCTRLRALTNUMENTER: case KEY_CTRLRALTNUMENTER: case KEY_RCTRLALTNUMENTER: { const auto ActivePanel = Global->CtrlObject->Cp()->ActivePanel(); CmdStr.RemoveSelection(); Refresh(); const auto& strStr = CmdStr.GetString(); bool TryExecute = true; if (!strStr.empty()) { ActivePanel->SetCurPath(); if (!(Global->Opt->ExcludeCmdHistory&EXCLUDECMDHISTORY_NOTCMDLINE)) Global->CtrlObject->CmdHistory->AddToHistory(strStr, HR_DEFAULT, nullptr, {}, m_CurDir); TryExecute = !ActivePanel->ProcessPluginEvent(FE_COMMAND, UNSAFE_CSTR(strStr)); } if (TryExecute) { const auto KeyCode = LocalKey(); const auto IsNewWindow = (KeyCode & KEY_SHIFT) != 0; const auto IsRunAs = (KeyCode & KEY_CTRL || KeyCode & KEY_RCTRL) && (KeyCode & KEY_ALT || KeyCode & KEY_RALT); execute_info Info; Info.Command = strStr; Info.NewWindow = IsNewWindow; Info.RunAs = IsRunAs; SetString(L"", false); ExecString(Info); } } return true; case KEY_CTRLU: case KEY_RCTRLU: CmdStr.RemoveSelection(); Refresh(); return true; case KEY_OP_XLAT: { // 13.12.2000 SVS - ! Для CmdLine - если нет выделения, преобразуем всю строку (XLat) CmdStr.Xlat((Global->Opt->XLat.Flags&XLAT_CONVERTALLCMDLINE) != 0); // иначе неправильно работает ctrl-end strLastCmdStr = CmdStr.GetString(); LastCmdPartLength = static_cast<int>(strLastCmdStr.size()); return true; } /* дополнительные клавиши для выделения в ком строке. ВНИМАНИЕ! Для сокращения кода этот кусок должен стоять перед "default" */ case KEY_ALTSHIFTLEFT: case KEY_ALTSHIFTNUMPAD4: case KEY_RALTSHIFTLEFT: case KEY_RALTSHIFTNUMPAD4: case KEY_ALTSHIFTRIGHT: case KEY_ALTSHIFTNUMPAD6: case KEY_RALTSHIFTRIGHT: case KEY_RALTSHIFTNUMPAD6: case KEY_ALTSHIFTEND: case KEY_ALTSHIFTNUMPAD1: case KEY_RALTSHIFTEND: case KEY_RALTSHIFTNUMPAD1: case KEY_ALTSHIFTHOME: case KEY_ALTSHIFTNUMPAD7: case KEY_RALTSHIFTHOME: case KEY_RALTSHIFTNUMPAD7: LocalKey&=~(KEY_ALT|KEY_RALT); [[fallthrough]]; default: // Сбрасываем выделение на некоторых клавишах if (!Global->Opt->CmdLine.EditBlock) { static const unsigned int UnmarkKeys[]= { KEY_LEFT, KEY_NUMPAD4, KEY_CTRLS, KEY_RCTRLS, KEY_RIGHT, KEY_NUMPAD6, KEY_CTRLD, KEY_RCTRLD, KEY_CTRLLEFT, KEY_CTRLNUMPAD4, KEY_RCTRLLEFT, KEY_RCTRLNUMPAD4, KEY_CTRLRIGHT, KEY_CTRLNUMPAD6, KEY_RCTRLRIGHT, KEY_RCTRLNUMPAD6, KEY_CTRLHOME, KEY_CTRLNUMPAD7, KEY_RCTRLHOME, KEY_RCTRLNUMPAD7, KEY_CTRLEND, KEY_CTRLNUMPAD1, KEY_RCTRLEND, KEY_RCTRLNUMPAD1, KEY_HOME, KEY_NUMPAD7, KEY_END, KEY_NUMPAD1 }; if (contains(UnmarkKeys, LocalKey())) { CmdStr.RemoveSelection(); } } if (LocalKey() == KEY_CTRLD || LocalKey() == KEY_RCTRLD) LocalKey=KEY_RIGHT; if(LocalKey() == KEY_CTRLSPACE || LocalKey() == KEY_RCTRLSPACE) { SCOPED_ACTION(SetAutocomplete)(&CmdStr, true); CmdStr.AutoComplete(true,false); return true; } if (!CmdStr.ProcessKey(LocalKey)) return Global->WindowManager->Desktop()->ProcessKey(Key); LastCmdPartLength=-1; return true; } }