void FilterDlgRelativeDateItemsUpdate(HANDLE hDlg, bool bClear) { SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); if (SendDlgMessage(hDlg,DM_GETCHECK,ID_FF_DATERELATIVE,0)) { SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DATEBEFOREEDIT,0); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DATEAFTEREDIT,0); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_CURRENT,0); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DAYSBEFOREEDIT,ToPtr(1)); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DAYSAFTEREDIT,ToPtr(1)); } else { SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DAYSBEFOREEDIT,0); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DAYSAFTEREDIT,0); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DATEBEFOREEDIT,ToPtr(1)); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_DATEAFTEREDIT,ToPtr(1)); SendDlgMessage(hDlg,DM_SHOWITEM,ID_FF_CURRENT,ToPtr(1)); } if (bClear) { SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_DATEAFTEREDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_DAYSAFTEREDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_TIMEAFTEREDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_DATEBEFOREEDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_TIMEBEFOREEDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_DAYSBEFOREEDIT,nullptr); } SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); }
intptr_t WINAPI MkDirDlgProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void* Param2) { switch (Msg) { case DN_LISTCHANGE: { if (Param1 == MKDIR_COMBOBOX_LINKTYPE) { SendDlgMessage(hDlg, DM_ENABLE, MKDIR_EDIT_LINKPATH, ToPtr(Param2 != 0)); } } break; case DN_CLOSE: { if (Param1==MKDIR_OK) { string strDirName=reinterpret_cast<LPCWSTR>(SendDlgMessage(hDlg,DM_GETCONSTTEXTPTR,MKDIR_EDIT,0)); Opt.MultiMakeDir=(SendDlgMessage(hDlg,DM_GETCHECK,MKDIR_CHECKBOX,0)==BSTATE_CHECKED); // это по поводу создания одиночного каталога, который // начинается с пробела! Чтобы ручками не заключать // такой каталог в кавычки if (Opt.MultiMakeDir && !wcspbrk(strDirName,L";,\"")) { QuoteSpaceOnly(strDirName); } // нужно создать только ОДИН каталог if (!Opt.MultiMakeDir) { // уберем все лишние кавычки Unquote(strDirName); // возьмем в кавычки, т.к. могут быть разделители InsertQuote(strDirName); } UserDefinedList* pDirList=reinterpret_cast<UserDefinedList*>(SendDlgMessage(hDlg,DM_GETDLGDATA,0,0)); if (!pDirList->Set(strDirName)) { Message(MSG_WARNING,1,MSG(MWarning),MSG(MIncorrectDirList),MSG(MOk)); return FALSE; } } } break; default: break; } return DefDlgProc(hDlg,Msg,Param1,Param2); }
intptr_t MkDirDlgProc(Dialog* Dlg,intptr_t Msg,intptr_t Param1,void* Param2) { switch (Msg) { case DN_EDITCHANGE: { if (Param1 == MKDIR_COMBOBOX_LINKTYPE) { Dlg->SendMessage( DM_ENABLE, MKDIR_EDIT_LINKPATH, ToPtr(Param2 != 0)); } } break; case DN_CLOSE: { if (Param1==MKDIR_OK) { string strDirName=reinterpret_cast<LPCWSTR>(Dlg->SendMessage(DM_GETCONSTTEXTPTR,MKDIR_EDIT,0)); Global->Opt->MultiMakeDir=(Dlg->SendMessage(DM_GETCHECK,MKDIR_CHECKBOX,0)==BSTATE_CHECKED); // это по поводу создания одиночного каталога, который // начинается с пробела! Чтобы ручками не заключать // такой каталог в кавычки if (Global->Opt->MultiMakeDir && strDirName.find_first_of(L";,\"") == string::npos) { QuoteSpaceOnly(strDirName); } // нужно создать только ОДИН каталог if (!Global->Opt->MultiMakeDir) { // уберем все лишние кавычки // возьмем в кавычки, т.к. могут быть разделители InsertQuote(Unquote(strDirName)); } auto pDirList=reinterpret_cast<std::vector<string>*>(Dlg->SendMessage(DM_GETDLGDATA,0,0)); split(*pDirList, strDirName, STLF_UNIQUE); if (pDirList->empty()) { Message(MSG_WARNING,1,MSG(MWarning),MSG(MIncorrectDirList),MSG(MOk)); return FALSE; } } } break; default: break; } return Dlg->DefProc(Msg,Param1,Param2); }
//--------------------------------------------------------------------------- bool TFileZillaIntf::HandleMessage(WPARAM wParam, LPARAM lParam) { bool Result; unsigned int MessageID = FZ_MSG_ID(wParam); switch (MessageID) { case FZ_MSG_STATUS: { ASSERT(FZ_MSG_PARAM(wParam) == 0); t_ffam_statusmessage * Status = (t_ffam_statusmessage *)lParam; ASSERT(Status->post); Result = HandleStatus(Status->status, Status->type); delete Status; } break; case FZ_MSG_ASYNCREQUEST: if (FZ_MSG_PARAM(wParam) == FZ_ASYNCREQUEST_OVERWRITE) { int RequestResult = 0; wchar_t FileName1[MAX_PATH]; COverwriteRequestData * Data = (COverwriteRequestData *)lParam; try { ASSERT(Data != NULL); wcsncpy(FileName1, Data->FileName1, _countof(FileName1)); FileName1[_countof(FileName1) - 1] = L'\0'; TRemoteFileTime RemoteTime; CopyFileTime(RemoteTime, Data->remotetime); Result = HandleAsynchRequestOverwrite( FileName1, _countof(FileName1), Data->FileName2, Data->path1, Data->path2, Data->size1, Data->size2, (Data->localtime != NULL) ? Data->localtime->GetTime() : 0, (Data->localtime != NULL) && ((Data->localtime->GetHour() != 0) || (Data->localtime->GetMinute() != 0)), RemoteTime, ToPtr(Data->pTransferFile->nUserData), Data->localFileHandle, RequestResult); } catch (...) { FFileZillaApi->SetAsyncRequestResult(FILEEXISTS_SKIP, Data); throw; } if (Result) { Data->FileName1 = FileName1; Result = Check(FFileZillaApi->SetAsyncRequestResult(RequestResult, Data), L"setasyncrequestresult"); } } else if (FZ_MSG_PARAM(wParam) == FZ_ASYNCREQUEST_VERIFYCERT) { int RequestResult; CVerifyCertRequestData * AData = (CVerifyCertRequestData *)lParam; try { ASSERT(AData != NULL); TFtpsCertificateData Data; CopyContact(Data.Subject, AData->pCertData->subject); CopyContact(Data.Issuer, AData->pCertData->issuer); CopyValidityTime(Data.ValidFrom, AData->pCertData->validFrom); CopyValidityTime(Data.ValidUntil, AData->pCertData->validUntil); Data.SubjectAltName = AData->pCertData->subjectAltName; Data.Hash = AData->pCertData->hash; Data.Certificate = AData->pCertData->certificate; Data.CertificateLen = AData->pCertData->certificateLen; Data.VerificationResult = AData->pCertData->verificationResult; Data.VerificationDepth = AData->pCertData->verificationDepth; Result = HandleAsynchRequestVerifyCertificate(Data, RequestResult); } catch (...) { FFileZillaApi->SetAsyncRequestResult(0, AData); throw; } if (Result) { Result = Check(FFileZillaApi->SetAsyncRequestResult(RequestResult, AData), L"setasyncrequestresult"); } } else if (FZ_MSG_PARAM(wParam) == FZ_ASYNCREQUEST_NEEDPASS) { int RequestResult = 0; CNeedPassRequestData * AData = (CNeedPassRequestData *)lParam; try { TNeedPassRequestData Data; Data.Password = NULL; Data.Password = AData->Password.GetBuffer(AData->Password.GetLength()); Result = HandleAsynchRequestNeedPass(Data, RequestResult); AData->Password.ReleaseBuffer(AData->Password.GetLength()); if (Result && (RequestResult == TFileZillaIntf::REPLY_OK)) { AData->Password = Data.Password; free(Data.Password); Data.Password = NULL; } } catch (...) { FFileZillaApi->SetAsyncRequestResult(0, AData); throw; } if (Result) { Result = Check(FFileZillaApi->SetAsyncRequestResult(RequestResult, AData), L"setasyncrequestresult"); } } else { // FZ_ASYNCREQUEST_GSS_AUTHFAILED // FZ_ASYNCREQUEST_GSS_NEEDUSER // FZ_ASYNCREQUEST_GSS_NEEDPASS ASSERT(FALSE); Result = false; } break; case FZ_MSG_LISTDATA: { ASSERT(FZ_MSG_PARAM(wParam) == 0); t_directory * Directory = (t_directory *)lParam; CString Path = Directory->path.GetPath(); rde::vector<TListDataEntry> Entries(Directory->num); for (intptr_t Index = 0; Index < Directory->num; ++Index) { t_directory::t_direntry & Source = Directory->direntry[Index]; TListDataEntry & Dest = Entries[Index]; Dest.Name = Source.name; Dest.Permissions = Source.permissionstr; Dest.HumanPerm = Source.humanpermstr; Dest.OwnerGroup = Source.ownergroup; Dest.Size = Source.size; Dest.Dir = Source.dir; Dest.Link = Source.bLink; CopyFileTime(Dest.Time, Source.date); Dest.LinkTarget = Source.linkTarget; } int Num = Directory->num; TListDataEntry * pEntries = Num > 0 ? &Entries[0] : NULL; Result = HandleListData(Path, pEntries, Num); delete Directory; } break; case FZ_MSG_TRANSFERSTATUS: { ASSERT(FZ_MSG_PARAM(wParam) == 0); t_ffam_transferstatus * Status = reinterpret_cast<t_ffam_transferstatus *>(lParam); if (Status != NULL) { Result = HandleTransferStatus(true, Status->transfersize, Status->bytes, Status->percent, Status->timeelapsed, Status->timeleft, Status->transferrate, Status->bFileTransfer != 0); delete Status; } else { Result = HandleTransferStatus(false, -1, -1, -1, -1, -1, -1, false); } } break; case FZ_MSG_REPLY: Result = HandleReply(FZ_MSG_PARAM(wParam), lParam); break; case FZ_MSG_CAPABILITIES: Result = HandleCapabilities((TFTPServerCapabilities *)lParam); break; case FZ_MSG_SOCKETSTATUS: case FZ_MSG_SECURESERVER: case FZ_MSG_QUITCOMPLETE: default: ASSERT(false); Result = false; break; } return Result; }
BOOL WINAPI CtrlHandler(DWORD CtrlType) { switch(CtrlType) { case CTRL_C_EVENT: return TRUE; case CTRL_BREAK_EVENT: if(!CancelIoInProgress.Signaled()) { CancelIoInProgress.Set(); HANDLE Thread = CreateThread(nullptr, 0, CancelSynchronousIoWrapper, MainThreadHandle, 0, nullptr); if (Thread) { CloseHandle(Thread); } } WriteInput(KEY_BREAK); if (CtrlObject && CtrlObject->Cp()) { if (CtrlObject->Cp()->LeftPanel && CtrlObject->Cp()->LeftPanel->GetMode()==PLUGIN_PANEL) CtrlObject->Plugins->ProcessEvent(CtrlObject->Cp()->LeftPanel->GetPluginHandle(),FE_BREAK, ToPtr(CtrlType)); if (CtrlObject->Cp()->RightPanel && CtrlObject->Cp()->RightPanel->GetMode()==PLUGIN_PANEL) CtrlObject->Plugins->ProcessEvent(CtrlObject->Cp()->RightPanel->GetPluginHandle(),FE_BREAK, ToPtr(CtrlType)); } return TRUE; case CTRL_CLOSE_EVENT: CloseFAR=TRUE; AllowCancelExit=FALSE; // trick to let wmain() finish correctly ExitThread(1); //return TRUE; } return FALSE; }
intptr_t WINAPI FileFilterConfigDlgProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void* Param2) { switch (Msg) { case DN_INITDIALOG: { FilterDlgRelativeDateItemsUpdate(hDlg, false); return TRUE; } case DN_BTNCLICK: { if (Param1==ID_FF_CURRENT || Param1==ID_FF_BLANK) //Current и Blank { FILETIME ft; string strDate, strTime; if (Param1==ID_FF_CURRENT) { GetSystemTimeAsFileTime(&ft); ConvertDate(ft,strDate,strTime,12,FALSE,FALSE,2); } else { strDate.Clear(); strTime.Clear(); } SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); int relative = (int)SendDlgMessage(hDlg,DM_GETCHECK,ID_FF_DATERELATIVE,0); int db = relative ? ID_FF_DAYSBEFOREEDIT : ID_FF_DATEBEFOREEDIT; int da = relative ? ID_FF_DAYSAFTEREDIT : ID_FF_DATEAFTEREDIT; SendDlgMessage(hDlg,DM_SETTEXTPTR,da,const_cast<wchar_t*>(strDate.CPtr())); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_TIMEAFTEREDIT,const_cast<wchar_t*>(strTime.CPtr())); SendDlgMessage(hDlg,DM_SETTEXTPTR,db,const_cast<wchar_t*>(strDate.CPtr())); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_TIMEBEFOREEDIT,const_cast<wchar_t*>(strTime.CPtr())); SendDlgMessage(hDlg,DM_SETFOCUS,da,0); COORD r; r.X=r.Y=0; SendDlgMessage(hDlg,DM_SETCURSORPOS,da,&r); SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); break; } else if (Param1==ID_FF_RESET) // Reset { SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); intptr_t ColorConfig = SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_MASKEDIT,const_cast<wchar_t*>(L"*")); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_SIZEFROMEDIT,nullptr); SendDlgMessage(hDlg,DM_SETTEXTPTR,ID_FF_SIZETOEDIT,nullptr); for (int I=ID_FF_READONLY; I <= ID_FF_VIRTUAL; ++I) { SendDlgMessage(hDlg,DM_SETCHECK,I,ToPtr(BSTATE_3STATE)); } if (!ColorConfig) SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_DIRECTORY,ToPtr(BSTATE_UNCHECKED)); FarListPos LPos= {sizeof(FarListPos)}; SendDlgMessage(hDlg,DM_LISTSETCURPOS,ID_FF_DATETYPE,&LPos); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHMASK,ToPtr(BSTATE_CHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHSIZE,ToPtr(BSTATE_UNCHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_HARDLINKS,ToPtr(BSTATE_UNCHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHDATE,ToPtr(BSTATE_UNCHECKED)); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_DATERELATIVE,ToPtr(BSTATE_UNCHECKED)); FilterDlgRelativeDateItemsUpdate(hDlg, true); SendDlgMessage(hDlg,DM_SETCHECK,ID_FF_MATCHATTRIBUTES,ToPtr(ColorConfig?BSTATE_UNCHECKED:BSTATE_CHECKED)); SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); break; } else if (Param1==ID_FF_MAKETRANSPARENT) { HighlightDataColor *Colors = (HighlightDataColor *) SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); for (int i=0; i<2; i++) for (int j=0; j<4; j++) { MAKE_TRANSPARENT(Colors->Color[i][j].ForegroundColor); MAKE_TRANSPARENT(Colors->Color[i][j].BackgroundColor); } SendDlgMessage(hDlg,DM_SETCHECK,ID_HER_MARKTRANSPARENT,ToPtr(BSTATE_CHECKED)); break; } else if (Param1==ID_FF_DATERELATIVE) { FilterDlgRelativeDateItemsUpdate(hDlg, true); break; } } case DN_CONTROLINPUT: if ((Msg==DN_BTNCLICK && Param1 >= ID_HER_NORMALFILE && Param1 <= ID_HER_SELECTEDCURSORMARKING) || (Msg==DN_CONTROLINPUT && Param1==ID_HER_COLOREXAMPLE && ((INPUT_RECORD *)Param2)->EventType == MOUSE_EVENT && ((INPUT_RECORD *)Param2)->Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)) { HighlightDataColor *EditData = (HighlightDataColor *) SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); if (Msg==DN_CONTROLINPUT) { Param1 = ID_HER_NORMALFILE + ((INPUT_RECORD *)Param2)->Event.MouseEvent.dwMousePosition.Y*2; if (((INPUT_RECORD *)Param2)->Event.MouseEvent.dwMousePosition.X==1 && (EditData->MarkChar&0x0000FFFF)) Param1 = ID_HER_NORMALMARKING + ((INPUT_RECORD *)Param2)->Event.MouseEvent.dwMousePosition.Y*2; } //Color[0=file, 1=mark][0=normal,1=selected,2=undercursor,3=selectedundercursor] FarColor Color=EditData->Color[(Param1-ID_HER_NORMALFILE)&1][(Param1-ID_HER_NORMALFILE)/2]; Global->Console->GetColorDialog(Color,true,true); EditData->Color[(Param1-ID_HER_NORMALFILE)&1][(Param1-ID_HER_NORMALFILE)/2]=Color; size_t Size = SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,0); FarGetDialogItem gdi = {sizeof(FarGetDialogItem), Size, static_cast<FarDialogItem*>(xf_malloc(Size))}; SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,&gdi); //MarkChar это FIXEDIT размером в 1 символ wchar_t MarkChar[2]; FarDialogItemData item= {sizeof(FarDialogItemData),1,MarkChar}; SendDlgMessage(hDlg,DM_GETTEXT,ID_HER_MARKEDIT,&item); EditData->MarkChar=*MarkChar; HighlightDlgUpdateUserControl(gdi.Item->VBuf,*EditData); SendDlgMessage(hDlg,DM_SETDLGITEM,ID_HER_COLOREXAMPLE,gdi.Item); xf_free(gdi.Item); return TRUE; } break; case DN_EDITCHANGE: if (Param1 == ID_HER_MARKEDIT) { HighlightDataColor *EditData = (HighlightDataColor *) SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); size_t Size = SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,0); FarGetDialogItem gdi = {sizeof(FarGetDialogItem), Size, static_cast<FarDialogItem*>(xf_malloc(Size))}; SendDlgMessage(hDlg,DM_GETDLGITEM,ID_HER_COLOREXAMPLE,&gdi); //MarkChar это FIXEDIT размером в 1 символ wchar_t MarkChar[2]; FarDialogItemData item= {sizeof(FarDialogItemData),1,MarkChar}; SendDlgMessage(hDlg,DM_GETTEXT,ID_HER_MARKEDIT,&item); EditData->MarkChar=*MarkChar; HighlightDlgUpdateUserControl(gdi.Item->VBuf,*EditData); SendDlgMessage(hDlg,DM_SETDLGITEM,ID_HER_COLOREXAMPLE,gdi.Item); xf_free(gdi.Item); return TRUE; } break; case DN_CLOSE: if (Param1 == ID_FF_OK && SendDlgMessage(hDlg,DM_GETCHECK,ID_FF_MATCHSIZE,0)) { string strTemp; FarDialogItemData item = {sizeof(FarDialogItemData)}; item.PtrLength = SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZEFROMEDIT,0); item.PtrData = strTemp.GetBuffer(item.PtrLength+1); SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZEFROMEDIT,&item); bool bTemp = !*item.PtrData || CheckFileSizeStringFormat(item.PtrData); item.PtrLength = SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZETOEDIT,0); item.PtrData = strTemp.GetBuffer(item.PtrLength+1); SendDlgMessage(hDlg,DM_GETTEXT,ID_FF_SIZETOEDIT,&item); bTemp = bTemp && (!*item.PtrData || CheckFileSizeStringFormat(item.PtrData)); if (!bTemp) { intptr_t ColorConfig = SendDlgMessage(hDlg, DM_GETDLGDATA, 0, 0); Message(MSG_WARNING,1,ColorConfig?MSG(MFileHilightTitle):MSG(MFileFilterTitle),MSG(MBadFileSizeFormat),MSG(MOk)); return FALSE; } } break; default: break; } return DefDlgProc(hDlg,Msg,Param1,Param2); }
void ShowProcessList() { static bool Active = false; if (Active) return; Active = true; VMenu2 ProcList(MSG(MProcessListTitle),nullptr,0,ScrY-4); ProcList.SetFlags(VMENU_WRAPMODE); ProcList.SetPosition(-1,-1,0,0); static bool bShowImage = false; struct ProcInfo pi={&ProcList,bShowImage}; if (EnumWindows(EnumWindowsProc,(LPARAM)&pi)) { ProcList.AssignHighlights(FALSE); ProcList.SetBottomTitle(MSG(MProcessListBottom)); ProcList.SortItems(TaskSort); ProcList.Run([&](int Key)->int { int KeyProcessed = 1; switch (Key) { case KEY_F1: { Help Hlp(L"TaskList"); break; } case KEY_NUMDEL: case KEY_DEL: { HWND ProcWnd=*static_cast<HWND*>(ProcList.GetUserData(nullptr,0)); if (ProcWnd) { wchar_t_ptr Title; int LenTitle=GetWindowTextLength(ProcWnd); if (LenTitle) { Title.reset(LenTitle + 1); if (Title && (LenTitle=GetWindowText(ProcWnd, Title.get(), LenTitle+1))) Title[LenTitle]=0; } DWORD ProcID; GetWindowThreadProcessId(ProcWnd,&ProcID); if (!Message(MSG_WARNING,2,MSG(MKillProcessTitle),MSG(MAskKillProcess), NullToEmpty(Title.get()),MSG(MKillProcessWarning),MSG(MKillProcessKill),MSG(MCancel))) { if (KillProcess(ProcID)) Sleep(500); else { Global->CatchError(); Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MKillProcessTitle),MSG(MCannotKillProcess),MSG(MOk)); } } } } case KEY_CTRLR: case KEY_RCTRLR: { ProcList.DeleteItems(); if (!EnumWindows(EnumWindowsProc,(LPARAM)&pi)) ProcList.Close(-1); else ProcList.SortItems(TaskSort); break; } case KEY_F2: { pi.bShowImage=(bShowImage=!bShowImage); int SelectPos=ProcList.GetSelectPos(); ProcList.DeleteItems(); if (!EnumWindows(EnumWindowsProc,(LPARAM)&pi)) ProcList.Close(-1); else { ProcList.SortItems(TaskSort); ProcList.SetSelectPos(SelectPos); } break; } default: KeyProcessed = 0; } return KeyProcessed; }); if (ProcList.GetExitCode()>=0) { HWND ProcWnd=*static_cast<HWND*>(ProcList.GetUserData(nullptr,0)); if (ProcWnd) { //SetForegroundWindow(ProcWnd); // Allow SetForegroundWindow on Win98+. DWORD dwMs; // Remember the current value. BOOL bSPI = SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &dwMs, 0); if (bSPI) // Reset foreground lock timeout bSPI = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0); SetForegroundWindow(ProcWnd); if (bSPI) // Restore old value SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, ToPtr(dwMs), 0); WINDOWPLACEMENT wp; wp.length=sizeof(wp); if (!GetWindowPlacement(ProcWnd,&wp) || wp.showCmd!=SW_SHOWMAXIMIZED) ShowWindowAsync(ProcWnd,SW_RESTORE); } } } Active = false; }
inline uintptr_t GetListItemCodePage(int Position = -1) { intptr_t Data = SendDlgMessage(dialog, DM_LISTGETDATA, control, ToPtr(Position)); return Data? *reinterpret_cast<uintptr_t*>(Data) : 0; }
BOOL WINAPI CtrlHandler(DWORD CtrlType) { switch(CtrlType) { case CTRL_C_EVENT: return TRUE; case CTRL_BREAK_EVENT: if(!CancelIoInProgress().Signaled()) { CancelIoInProgress().Set(); Thread(&Thread::detach, &CancelSynchronousIoWrapper, Global->MainThreadHandle()); } WriteInput(KEY_BREAK); if (Global->CtrlObject && Global->CtrlObject->Cp()) { if (Global->CtrlObject->Cp()->LeftPanel && Global->CtrlObject->Cp()->LeftPanel->GetMode()==PLUGIN_PANEL) Global->CtrlObject->Plugins->ProcessEvent(Global->CtrlObject->Cp()->LeftPanel->GetPluginHandle(),FE_BREAK, ToPtr(CtrlType)); if (Global->CtrlObject->Cp()->RightPanel && Global->CtrlObject->Cp()->RightPanel->GetMode()==PLUGIN_PANEL) Global->CtrlObject->Plugins->ProcessEvent(Global->CtrlObject->Cp()->RightPanel->GetPluginHandle(),FE_BREAK, ToPtr(CtrlType)); } return TRUE; case CTRL_CLOSE_EVENT: Global->CloseFAR=TRUE; Global->AllowCancelExit=FALSE; // trick to let wmain() finish correctly ExitThread(1); //return TRUE; } return FALSE; }
void ShellDeleteMsg(const wchar_t *Name, DEL_MODE Mode, int Percent, int WipePercent) { FormatString strProgress, strWipeProgress; size_t Width=52; size_t Length=Width-5; // -5 под проценты if(Mode==DEL_WIPEPROCESS || Mode==DEL_WIPE) { wchar_t *WipeProgress=strWipeProgress.GetBuffer(Length); if (WipeProgress) { size_t CurPos=Min(WipePercent,100)*Length/100; wmemset(WipeProgress,BoxSymbols[BS_X_DB],CurPos); wmemset(WipeProgress+(CurPos),BoxSymbols[BS_X_B0],Length-CurPos); strWipeProgress.ReleaseBuffer(Length); strWipeProgress<<L" "<<fmt::MinWidth(3)<<WipePercent<<L"%"; } if(Percent==-1) { TBC.SetProgressValue(WipePercent, 100); } } if (Mode!=DEL_SCAN && Percent!=-1) { wchar_t *Progress=strProgress.GetBuffer(Length); if (Progress) { size_t CurPos=Min(Percent,100)*Length/100; wmemset(Progress,BoxSymbols[BS_X_DB],CurPos); wmemset(Progress+(CurPos),BoxSymbols[BS_X_B0],Length-CurPos); strProgress.ReleaseBuffer(Length); strProgress<<L" "<<fmt::MinWidth(3)<<Percent<<L"%"; *DeleteTitle << L"{" << Percent << L"%} " << MSG((Mode==DEL_WIPE || Mode==DEL_WIPEPROCESS)?MDeleteWipeTitle:MDeleteTitle) << fmt::Flush(); } TBC.SetProgressValue(Percent,100); } string strOutFileName(Name); TruncPathStr(strOutFileName,static_cast<int>(Width)); CenterStr(strOutFileName,strOutFileName,static_cast<int>(Width)); const wchar_t* Progress1 = nullptr; const wchar_t* Progress2 = nullptr; if(!strWipeProgress.IsEmpty()) { Progress1 = strWipeProgress.CPtr(); Progress2 = strProgress.IsEmpty()? nullptr : strProgress.CPtr(); } else { Progress1 = strProgress.IsEmpty()? nullptr : strProgress.CPtr(); } Message(0,0, MSG((Mode==DEL_WIPE || Mode==DEL_WIPEPROCESS)?MDeleteWipeTitle:MDeleteTitle), Mode==DEL_SCAN? MSG(MScanningFolder) : MSG((Mode==DEL_WIPE || Mode==DEL_WIPEPROCESS)?MDeletingWiping:MDeleting), strOutFileName, Progress1, Progress2); PreRedrawItem preRedrawItem=PreRedraw.Peek(); preRedrawItem.Param.Param1=static_cast<void*>(const_cast<wchar_t*>(Name)); preRedrawItem.Param.Param4=ToPtr(Mode); LARGE_INTEGER i = {(DWORD)Percent, (LONG)WipePercent}; preRedrawItem.Param.Param5=i.QuadPart; PreRedraw.SetParam(preRedrawItem.Param); }