/*$ 22.06.2001 SKV Добавлен параметр для вызова после исполнения команды. */ int FileList::UpdateIfChanged(int UpdateMode) { //_SVS(SysLog(L"CurDir='%s' Opt.AutoUpdateLimit=%d <= FileCount=%d",CurDir,Opt.AutoUpdateLimit,FileCount)); if (!Opt.AutoUpdateLimit || static_cast<DWORD>(FileCount) <= Opt.AutoUpdateLimit) { /* $ 19.12.2001 VVM ! Сменим приоритеты. При Force обновление всегда! */ if ((IsVisible() && (clock()-LastUpdateTime>2000)) || (UpdateMode != UIC_UPDATE_NORMAL)) { if (UpdateMode == UIC_UPDATE_NORMAL) ProcessPluginEvent(FE_IDLE,nullptr); /* $ 24.12.2002 VVM ! Поменяем логику обновления панелей. */ if (// Нормальная панель, на ней установлено уведомление и есть сигнал (PanelMode==NORMAL_PANEL && FSWatcher.Signaled()) || // Или Нормальная панель, но нет уведомления и мы попросили обновить через UPDATE_FORCE (PanelMode==NORMAL_PANEL && UpdateMode==UIC_UPDATE_FORCE) || // Или плагинная панель и обновляем через UPDATE_FORCE (PanelMode!=NORMAL_PANEL && UpdateMode==UIC_UPDATE_FORCE) ) { Panel *AnotherPanel=CtrlObject->Cp()->GetAnotherPanel(this); if (AnotherPanel->GetType()==INFO_PANEL) { AnotherPanel->Update(UPDATE_KEEP_SELECTION); if (UpdateMode==UIC_UPDATE_NORMAL) AnotherPanel->Redraw(); } Update(UPDATE_KEEP_SELECTION); if (UpdateMode==UIC_UPDATE_NORMAL) Show(); return TRUE; } } } return FALSE; }
void FileList::ShowFileList(int Fast) { if (Locked()) { CorrectPosition(); return; } string strTitle; string strInfoCurDir; int Length; OpenPanelInfo Info; if (PanelMode==PLUGIN_PANEL) { if (ProcessPluginEvent(FE_REDRAW,nullptr)) return; CtrlObject->Plugins->GetOpenPanelInfo(hPlugin,&Info); strInfoCurDir=Info.CurDir; } bool CurFullScreen=IsFullScreen(); PrepareViewSettings(ViewMode,&Info); CorrectPosition(); if (CurFullScreen!=IsFullScreen()) { CtrlObject->Cp()->SetScreenPosition(); CtrlObject->Cp()->GetAnotherPanel(this)->Update(UPDATE_KEEP_SELECTION|UPDATE_SECONDARY); } SetScreen(X1+1,Y1+1,X2-1,Y2-1,L' ',ColorIndexToColor(COL_PANELTEXT)); Box(X1,Y1,X2,Y2,ColorIndexToColor(COL_PANELBOX),DOUBLE_BOX); if (Opt.ShowColumnTitles) { // SetScreen(X1+1,Y1+1,X2-1,Y1+1,' ',COL_PANELTEXT); SetColor(COL_PANELTEXT); //??? //GotoXY(X1+1,Y1+1); //FS<<fmt::Width(X2-X1-1)<<L""; } for (int I=0,ColumnPos=X1+1; I<ViewSettings.ColumnCount; I++) { if (ViewSettings.ColumnWidth[I]<0) continue; if (Opt.ShowColumnTitles) { LNGID IDMessage=MColumnUnknown; switch (ViewSettings.ColumnType[I] & 0xff) { case NAME_COLUMN: IDMessage=MColumnName; break; case EXTENSION_COLUMN: IDMessage=MColumnExtension; break; case SIZE_COLUMN: IDMessage=MColumnSize; break; case PACKED_COLUMN: IDMessage=MColumnAlocatedSize; break; case DATE_COLUMN: IDMessage=MColumnDate; break; case TIME_COLUMN: IDMessage=MColumnTime; break; case WDATE_COLUMN: IDMessage=MColumnWrited; break; case CDATE_COLUMN: IDMessage=MColumnCreated; break; case ADATE_COLUMN: IDMessage=MColumnAccessed; break; case CHDATE_COLUMN: IDMessage=MColumnChanged; break; case ATTR_COLUMN: IDMessage=MColumnAttr; break; case DIZ_COLUMN: IDMessage=MColumnDescription; break; case OWNER_COLUMN: IDMessage=MColumnOwner; break; case NUMLINK_COLUMN: IDMessage=MColumnMumLinks; break; case NUMSTREAMS_COLUMN: IDMessage=MColumnNumStreams; break; case STREAMSSIZE_COLUMN: IDMessage=MColumnStreamsSize; break; } strTitle=MSG(IDMessage); if (PanelMode==PLUGIN_PANEL && Info.PanelModesArray && ViewMode<static_cast<int>(Info.PanelModesNumber) && Info.PanelModesArray[ViewMode].ColumnTitles) { const wchar_t *NewTitle=Info.PanelModesArray[ViewMode].ColumnTitles[I]; if (NewTitle) strTitle=NewTitle; } string strTitleMsg; CenterStr(strTitle,strTitleMsg,ViewSettings.ColumnWidth[I]); SetColor(COL_PANELCOLUMNTITLE); GotoXY(ColumnPos,Y1+1); FS<<fmt::Precision(ViewSettings.ColumnWidth[I])<<strTitleMsg; } if (I>=ViewSettings.ColumnCount-1) break; if (ViewSettings.ColumnWidth[I+1]<0) continue; SetColor(COL_PANELBOX); ColumnPos+=ViewSettings.ColumnWidth[I]; GotoXY(ColumnPos,Y1); bool DoubleLine = Opt.DoubleGlobalColumnSeparator && (!((I+1)%ColumnsInGlobal)); BoxText(BoxSymbols[DoubleLine?BS_T_H2V2:BS_T_H2V1]); if (Opt.ShowColumnTitles) { GotoXY(ColumnPos,Y1+1); BoxText(BoxSymbols[DoubleLine?BS_V2:BS_V1]); } if (!Opt.ShowPanelStatus) { GotoXY(ColumnPos,Y2); BoxText(BoxSymbols[DoubleLine?BS_B_H2V2:BS_B_H2V1]); } ColumnPos++; } int NextX1=X1+1; if (Opt.ShowSortMode) { static int SortModes[]={UNSORTED,BY_NAME,BY_EXT,BY_MTIME,BY_CTIME, BY_ATIME,BY_CHTIME,BY_SIZE,BY_DIZ,BY_OWNER, BY_COMPRESSEDSIZE,BY_NUMLINKS, BY_NUMSTREAMS,BY_STREAMSSIZE, BY_FULLNAME,BY_CUSTOMDATA }; static LNGID SortStrings[]={MMenuUnsorted,MMenuSortByName, MMenuSortByExt,MMenuSortByWrite,MMenuSortByCreation, MMenuSortByAccess,MMenuSortByChange,MMenuSortBySize,MMenuSortByDiz,MMenuSortByOwner, MMenuSortByAllocatedSize,MMenuSortByNumLinks,MMenuSortByNumStreams,MMenuSortByStreamsSize, MMenuSortByFullName,MMenuSortByCustomData }; for (size_t I=0; I<ARRAYSIZE(SortModes); I++) { if (SortModes[I]==SortMode) { const wchar_t *SortStr=MSG(SortStrings[I]); const wchar_t *Ch=wcschr(SortStr,L'&'); if (Ch) { if (Opt.ShowColumnTitles) GotoXY(NextX1,Y1+1); else GotoXY(NextX1,Y1); SetColor(COL_PANELCOLUMNTITLE); OutCharacter[0]=SortOrder==1 ? Lower(Ch[1]):Upper(Ch[1]); Text(OutCharacter); NextX1++; if (Filter && Filter->IsEnabledOnPanel()) { OutCharacter[0]=L'*'; Text(OutCharacter); NextX1++; } } break; } } } /* <режимы сортировки> */ if (/*GetNumericSort() || GetCaseSensitiveSort() || GetSortGroups() || */GetSelectedFirstMode()) { if (Opt.ShowColumnTitles) GotoXY(NextX1,Y1+1); else GotoXY(NextX1,Y1); SetColor(COL_PANELCOLUMNTITLE); wchar_t *PtrOutCharacter=OutCharacter; *PtrOutCharacter=0; //if (GetSelectedFirstMode()) *PtrOutCharacter++=L'^'; /* if(GetNumericSort()) *PtrOutCharacter++=L'#'; if(GetSortGroups()) *PtrOutCharacter++=L'@'; */ /* if(GetCaseSensitiveSort()) { } */ *PtrOutCharacter=0; Text(OutCharacter); PtrOutCharacter[1]=0; } /* </режимы сортировки> */ if (!Fast && GetFocus()) { if (PanelMode==PLUGIN_PANEL) CtrlObject->CmdLine->SetCurDir(Info.CurDir); else CtrlObject->CmdLine->SetCurDir(strCurDir); CtrlObject->CmdLine->Show(); } int TitleX2=Opt.Clock && !Opt.ShowMenuBar ? Min(ScrX-4,X2):X2; int TruncSize=TitleX2-X1-3; if (!Opt.ShowColumnTitles && Opt.ShowSortMode && Filter && Filter->IsEnabledOnPanel()) TruncSize-=2; GetTitle(strTitle,TruncSize,2);//,(PanelMode==PLUGIN_PANEL?0:2)); Length=(int)strTitle.GetLength(); int ClockCorrection=FALSE; if ((Opt.Clock && !Opt.ShowMenuBar) && TitleX2==ScrX-4) { ClockCorrection=TRUE; TitleX2+=4; } int TitleX=X1+(TitleX2-X1+1-Length)/2; if (ClockCorrection) { int Overlap=TitleX+Length-TitleX2+5; if (Overlap > 0) TitleX-=Overlap; } if (TitleX <= X1) TitleX = X1+1; SetColor(Focus ? COL_PANELSELECTEDTITLE:COL_PANELTITLE); GotoXY(TitleX,Y1); Text(strTitle); if (!FileCount) { SetScreen(X1+1,Y2-1,X2-1,Y2-1,L' ',ColorIndexToColor(COL_PANELTEXT)); SetColor(COL_PANELTEXT); //??? //GotoXY(X1+1,Y2-1); //FS<<fmt::Width(X2-X1-1)<<L""; } if (PanelMode==PLUGIN_PANEL && FileCount>0 && (Info.Flags & OPIF_REALNAMES)) { if (!strInfoCurDir.IsEmpty()) { strCurDir = strInfoCurDir; } else { if (!TestParentFolderName(ListData[CurFile]->strName)) { strCurDir=ListData[CurFile]->strName; size_t pos; if (FindLastSlash(pos,strCurDir)) { if (pos) { if (strCurDir.At(pos-1)!=L':') strCurDir.SetLength(pos); else strCurDir.SetLength(pos+1); } } } else { strCurDir = strOriginalCurDir; } } if (GetFocus()) { CtrlObject->CmdLine->SetCurDir(strCurDir); CtrlObject->CmdLine->Show(); } } if ((Opt.ShowPanelTotals || Opt.ShowPanelFree) && (Opt.ShowPanelStatus || !SelFileCount)) { ShowTotalSize(Info); } ShowList(FALSE,0); ShowSelectedSize(); if (Opt.ShowPanelScrollbar) { SetColor(COL_PANELSCROLLBAR); ScrollBarEx(X2,Y1+1+Opt.ShowColumnTitles,Height,Round(CurTopFile,Columns),Round(FileCount,Columns)); } ShowScreensCount(); if (!ProcessingPluginCommand && LastCurFile!=CurFile) { LastCurFile=CurFile; UpdateViewPanel(); } if (PanelMode==PLUGIN_PANEL) CtrlObject->Cp()->RedrawKeyBar(); }
bool Panel::ExecShortcutFolder(string strShortcutFolder, const GUID& PluginGuid, const string& strPluginFile, const string& strPluginData, bool CheckType, bool TryClosest, bool Silent) { auto SrcPanel = shared_from_this(); const auto AnotherPanel = Parent()->GetAnotherPanel(this); if(CheckType) { switch (GetType()) { case panel_type::FILE_PANEL: break; case panel_type::TREE_PANEL: case panel_type::QVIEW_PANEL: case panel_type::INFO_PANEL: if (AnotherPanel->GetType() == panel_type::FILE_PANEL) SrcPanel=AnotherPanel; break; } } bool CheckFullScreen=SrcPanel->IsFullScreen(); if (PluginGuid != FarGuid) { bool Result = false; ShortcutInfo Info; GetShortcutInfo(Info); if (Info.PluginGuid == PluginGuid && Info.PluginFile == strPluginFile && Info.PluginData == strPluginData) { Result = SetPluginDirectory(strShortcutFolder, Silent); } else { if (ProcessPluginEvent(FE_CLOSE, nullptr)) { return false; } if (const auto pPlugin = Global->CtrlObject->Plugins->FindPlugin(PluginGuid)) { if (pPlugin->has(iOpen)) { if (!strPluginFile.empty()) { auto strRealDir = strPluginFile; if (CutToSlash(strRealDir)) { SrcPanel->SetCurDir(strRealDir,true); SrcPanel->GoToFile(PointToName(strPluginFile)); SrcPanel->ClearAllItem(); } } const auto IsActive = SrcPanel->IsFocused(); OpenShortcutInfo info= { sizeof(OpenShortcutInfo), strPluginFile.empty()? nullptr : strPluginFile.c_str(), strPluginData.empty()? nullptr : strPluginData.c_str(), IsActive? FOSF_ACTIVE : FOSF_NONE }; if (auto hNewPlugin = Global->CtrlObject->Plugins->Open(pPlugin, OPEN_SHORTCUT, FarGuid, reinterpret_cast<intptr_t>(&info))) { const auto NewPanel = Parent()->ChangePanel(SrcPanel, panel_type::FILE_PANEL, TRUE, TRUE); NewPanel->SetPluginMode(std::move(hNewPlugin), {}, IsActive || !Parent()->GetAnotherPanel(NewPanel)->IsVisible()); Result = NewPanel->SetPluginDirectory(strShortcutFolder, Silent); } } } } return Result; } strShortcutFolder = os::env::expand(strShortcutFolder); if (!CheckShortcutFolder(strShortcutFolder, TryClosest, Silent) || ProcessPluginEvent(FE_CLOSE, nullptr)) { return false; } SrcPanel->SetCurDir(strShortcutFolder,true); if (CheckFullScreen!=SrcPanel->IsFullScreen()) Parent()->GetAnotherPanel(SrcPanel)->Show(); SrcPanel->Refresh(); return true; }
void Panel::OnFocusChange(bool Get) { ProcessPluginEvent(Get? FE_GOTFOCUS : FE_KILLFOCUS, nullptr); if (Get) Redraw(); }
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; } }