HighlightFiles::HighlightFiles() { Changed = false; HierarchicalConfig *cfg = CreateHighlightConfig(); SetHighlighting(false, cfg); InitHighlightFiles(cfg); UpdateCurrentTime(); delete cfg; }
int FarAppMain(int argc, char **argv) { Opt.IsUserAdmin = (geteuid()==0); _OT(SysLog(L"[[[[[[[[New Session of FAR]]]]]]]]]")); FARString strEditName; FARString strViewName; FARString DestNames[2]; int StartLine=-1,StartChar=-1; int CntDestName=0; // количество параметров-имен каталогов /*$ 18.04.2002 SKV Попользуем floating point что бы проинициализировался vc-ный fprtl. */ #ifdef _MSC_VER float x=1.1f; wchar_t buf[15]; swprintf(buf,L"%f",x); #endif // если под дебагером, то отключаем исключения однозначно, // иначе - смотря что указал юзвер. #if defined(_DEBUGEXC) Opt.ExceptRules=-1; #else Opt.ExceptRules=-1;//IsDebuggerPresent()?0:-1; #endif // Opt.ExceptRules=-1; #ifdef __GNUC__ Opt.ExceptRules=0; #endif //_SVS(SysLog(L"Opt.ExceptRules=%d",Opt.ExceptRules)); SetRegRootKey(HKEY_CURRENT_USER); Opt.strRegRoot = L"Software/Far2"; // По умолчанию - брать плагины из основного каталога Opt.LoadPlug.MainPluginDir=TRUE; Opt.LoadPlug.PluginsPersonal=TRUE; Opt.LoadPlug.PluginsCacheOnly=FALSE; g_strFarPath = g_strFarModuleName; bool translated = TranslateFarString<TranslateInstallPath_Bin2Share>(g_strFarPath); CutToSlash(g_strFarPath, true); if (translated) { // /usr/bin/something -> /usr/share/far2l g_strFarPath+= L"/" FAR_BASENAME; } WINPORT(SetEnvironmentVariable)(L"FARHOME", g_strFarPath); AddEndSlash(g_strFarPath); // don't inherit from parent process in any case WINPORT(SetEnvironmentVariable)(L"FARUSER", nullptr); WINPORT(SetEnvironmentVariable)(L"FARADMINMODE", Opt.IsUserAdmin?L"1":nullptr); // макросы не дисаблим Opt.Macro.DisableMacro=0; for (int I=1; I<argc; I++) { std::wstring arg_w = MB2Wide(argv[I]); if ((arg_w[0]==L'/' || arg_w[0]==L'-') && arg_w[1]) { switch (Upper(arg_w[1])) { case L'A': switch (Upper(arg_w[2])) { case 0: Opt.CleanAscii=TRUE; break; case L'G': if (!arg_w[3]) Opt.NoGraphics=TRUE; break; } break; case L'E': if (iswdigit(arg_w[2])) { StartLine=_wtoi((const wchar_t *)&arg_w[2]); wchar_t *ChPtr=wcschr((wchar_t *)&arg_w[2],L':'); if (ChPtr) StartChar=_wtoi(ChPtr+1); } if (I+1<argc) { strEditName = argv[I+1]; I++; } break; case L'V': if (I+1<argc) { strViewName = argv[I+1]; I++; } break; case L'M': switch (Upper(arg_w[2])) { case 0: Opt.Macro.DisableMacro|=MDOL_ALL; break; case L'A': if (!arg_w[3]) Opt.Macro.DisableMacro|=MDOL_AUTOSTART; break; } break; case L'I': Opt.SmallIcon=TRUE; break; case L'X': Opt.ExceptRules=0; #if defined(_DEBUGEXC) if (Upper(arg_w[2])==L'D' && !arg_w[3]) Opt.ExceptRules=1; #endif break; case L'C': if (Upper(arg_w[2])==L'O' && !arg_w[3]) { Opt.LoadPlug.PluginsCacheOnly=TRUE; Opt.LoadPlug.PluginsPersonal=FALSE; } break; case L'?': case L'H': ControlObject::ShowCopyright(1); show_help(); return 0; #ifdef DIRECT_RT case L'D': if (Upper(arg_w[2])==L'O' && !arg_w[3]) DirectRT=1; break; #endif case L'W': { Opt.WindowMode=TRUE; } break; } } else // простые параметры. Их может быть max две штукА. { if (CntDestName < 2) { if (IsPluginPrefixPath((const wchar_t *)arg_w.c_str())) { DestNames[CntDestName++] = (const wchar_t *)arg_w.c_str(); } else { apiExpandEnvironmentStrings((const wchar_t *)arg_w.c_str(), DestNames[CntDestName]); Unquote(DestNames[CntDestName]); ConvertNameToFull(DestNames[CntDestName],DestNames[CntDestName]); if (apiGetFileAttributes(DestNames[CntDestName]) != INVALID_FILE_ATTRIBUTES) CntDestName++; //??? } } } } //Настройка OEM сортировки. Должна быть после CopyGlobalSettings и перед InitKeysArray! //LocalUpperInit(); //InitLCIDSort(); //Инициализация массива клавиш. Должна быть после CopyGlobalSettings! InitKeysArray(); //WaitForInputIdle(GetCurrentProcess(),0); std::set_new_handler(nullptr); if (!Opt.LoadPlug.MainPluginDir) //если есть ключ /p то он отменяет /co Opt.LoadPlug.PluginsCacheOnly=FALSE; if (Opt.LoadPlug.PluginsCacheOnly) { Opt.LoadPlug.strCustomPluginsPath.Clear(); Opt.LoadPlug.MainPluginDir=FALSE; Opt.LoadPlug.PluginsPersonal=FALSE; } InitConsole(); GetRegKey(L"Language",L"Main",Opt.strLanguage,L"English"); if (!Lang.Init(g_strFarPath,true,MNewFileName)) { ControlObject::ShowCopyright(1); LPCWSTR LngMsg; switch(Lang.GetLastError()) { case LERROR_BAD_FILE: LngMsg = L"\nError: language data is incorrect or damaged.\n\nPress any key to exit..."; break; case LERROR_FILE_NOT_FOUND: LngMsg = L"\nError: cannot find language data.\n\nPress any key to exit..."; break; default: LngMsg = L"\nError: cannot load language data.\n\nPress any key to exit..."; break; } Console.Write(LngMsg,StrLength(LngMsg)); Console.FlushInputBuffer(); WaitKey(); // А стоит ли ожидать клавишу??? Стоит return 1; } WINPORT(SetEnvironmentVariable)(L"FARLANG",Opt.strLanguage); SetHighlighting(); initMacroVarTable(1); if (Opt.ExceptRules == -1) { GetRegKey(L"System",L"ExceptRules",Opt.ExceptRules,1); } //ErrorMode=SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX|(Opt.ExceptRules?SEM_NOGPFAULTERRORBOX:0)|(GetRegKey(L"System/Exception", L"IgnoreDataAlignmentFaults", 0)?SEM_NOALIGNMENTFAULTEXCEPT:0); //SetErrorMode(ErrorMode); int Result=MainProcessSEH(strEditName,strViewName,DestNames[0],DestNames[1],StartLine,StartChar); EmptyInternalClipboard(); doneMacroVarTable(1); VTShell_Shutdown();//ensure VTShell deinitialized before statics destructors called _OT(SysLog(L"[[[[[Exit of FAR]]]]]]]]]")); return Result; }
void HighlightFiles::HiEdit(int MenuPos) { Changed = true; VMenu HiMenu(MSG(MHighlightTitle),nullptr,0,ScrY-4); HiMenu.SetHelp(HLS.HighlightList); HiMenu.SetFlags(VMENU_WRAPMODE|VMENU_SHOWAMPERSAND); HiMenu.SetPosition(-1,-1,0,0); HiMenu.SetBottomTitle(MSG(MHighlightBottom)); FillMenu(&HiMenu,MenuPos); int NeedUpdate; Panel *LeftPanel=CtrlObject->Cp()->LeftPanel; Panel *RightPanel=CtrlObject->Cp()->RightPanel; HiMenu.Show(); while (1) { while (!HiMenu.Done()) { int Key=HiMenu.ReadInput(); int SelectPos=HiMenu.GetSelectPos(); NeedUpdate=FALSE; switch (Key) { /* $ 07.07.2000 IS Если нажали ctrl+r, то восстановить значения по умолчанию. */ case KEY_CTRLR: case KEY_RCTRLR: { if (Message(MSG_WARNING,2,MSG(MHighlightTitle), MSG(MHighlightWarning),MSG(MHighlightAskRestore), MSG(MYes),MSG(MCancel))) break; HierarchicalConfig *cfg = CreateHighlightConfig(); SetHighlighting(true, cfg); //delete old settings HiMenu.Hide(); ClearData(); InitHighlightFiles(cfg); delete cfg; NeedUpdate=TRUE; break; } case KEY_NUMDEL: case KEY_DEL: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count); if (Count && RealSelectPos<(int)HiData.getCount()) { const wchar_t *Mask; HiData.getItem(RealSelectPos)->GetMask(&Mask); if (Message(MSG_WARNING,2,MSG(MHighlightTitle), MSG(MHighlightAskDel),Mask, MSG(MDelete),MSG(MCancel))) break; HiData.deleteItem(RealSelectPos); (*Count)--; NeedUpdate=TRUE; } break; } case KEY_NUMENTER: case KEY_ENTER: case KEY_F4: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count); if (Count && RealSelectPos<(int)HiData.getCount()) if (FileFilterConfig(HiData.getItem(RealSelectPos),true)) NeedUpdate=TRUE; break; } case KEY_INS: case KEY_NUMPAD0: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count,true); if (Count) { FileFilterParams *NewHData = HiData.insertItem(RealSelectPos); if (!NewHData) break; if (FileFilterConfig(NewHData,true)) { (*Count)++; NeedUpdate=TRUE; } else HiData.deleteItem(RealSelectPos); } break; } case KEY_F5: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count); if (Count && RealSelectPos<(int)HiData.getCount()) { FileFilterParams *HData = HiData.insertItem(RealSelectPos); if (HData) { *HData = *HiData.getItem(RealSelectPos+1); HData->SetTitle(L""); if (FileFilterConfig(HData,true)) { NeedUpdate=TRUE; (*Count)++; } else HiData.deleteItem(RealSelectPos); } } break; } case KEY_CTRLUP: case KEY_CTRLNUMPAD8: case KEY_RCTRLUP: case KEY_RCTRLNUMPAD8: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count); if (Count && SelectPos > 0) { if (UpperCount && RealSelectPos==FirstCount && RealSelectPos<FirstCount+UpperCount) { FirstCount++; UpperCount--; SelectPos--; } else if (LowerCount && RealSelectPos==FirstCount+UpperCount && RealSelectPos<FirstCount+UpperCount+LowerCount) { UpperCount++; LowerCount--; SelectPos--; } else if (LastCount && RealSelectPos==FirstCount+UpperCount+LowerCount) { LowerCount++; LastCount--; SelectPos--; } else HiData.swapItems(RealSelectPos,RealSelectPos-1); HiMenu.SetCheck(--SelectPos); NeedUpdate=TRUE; break; } HiMenu.ProcessInput(); break; } case KEY_CTRLDOWN: case KEY_CTRLNUMPAD2: case KEY_RCTRLDOWN: case KEY_RCTRLNUMPAD2: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count); if (Count && SelectPos < (int)HiMenu.GetItemCount()-2) { if (FirstCount && RealSelectPos==FirstCount-1) { FirstCount--; UpperCount++; SelectPos++; } else if (UpperCount && RealSelectPos==FirstCount+UpperCount-1) { UpperCount--; LowerCount++; SelectPos++; } else if (LowerCount && RealSelectPos==FirstCount+UpperCount+LowerCount-1) { LowerCount--; LastCount++; SelectPos++; } else HiData.swapItems(RealSelectPos,RealSelectPos+1); HiMenu.SetCheck(++SelectPos); NeedUpdate=TRUE; } HiMenu.ProcessInput(); break; } default: HiMenu.ProcessInput(); break; } // повторяющийся кусок! if (NeedUpdate) { ScrBuf.Lock(); // отменяем всякую прорисовку HiMenu.Hide(); ProcessGroups(); if (Opt.AutoSaveSetup) SaveHiData(); //FrameManager->RefreshFrame(); // рефрешим LeftPanel->Update(UPDATE_KEEP_SELECTION); LeftPanel->Redraw(); RightPanel->Update(UPDATE_KEEP_SELECTION); RightPanel->Redraw(); FillMenu(&HiMenu,MenuPos=SelectPos); HiMenu.SetPosition(-1,-1,0,0); HiMenu.Show(); ScrBuf.Unlock(); // разрешаем прорисовку } } if (HiMenu.Modal::GetExitCode()!=-1) { HiMenu.ClearDone(); HiMenu.WriteInput(KEY_F4); continue; } break; } }