/* $ 29.12.2000 IS Аналог CloseAll, но разрешает продолжение полноценной работы в фаре, если пользователь продолжил редактировать файл. Возвращает TRUE, если все закрыли и можно выходить из фара. */ BOOL Manager::ExitAll() { _MANAGER(CleverSysLog clv(L"Manager::ExitAll()")); // BUGBUG don't use iterators here, may be invalidated by DeleteCommit() for(size_t i = m_modalWindows.size(); i; --i) { if (i - 1 >= m_modalWindows.size()) continue; auto CurrentWindow = m_modalWindows[i - 1]; if (!CurrentWindow->GetCanLoseFocus(TRUE)) { auto PrevWindowCount = m_modalWindows.size(); CurrentWindow->ProcessKey(Manager::Key(KEY_ESC)); Commit(); if (PrevWindowCount == m_modalWindows.size()) { return FALSE; } } } // BUGBUG don't use iterators here, may be invalidated by DeleteCommit() for(size_t i = m_windows.size(); i; --i) { if (i - 1 >= m_windows.size()) continue; auto CurrentWindow = m_windows[i - 1]; if (!CurrentWindow->GetCanLoseFocus(TRUE)) { ActivateWindow(CurrentWindow); Commit(); auto PrevWindoowCount = m_windows.size(); CurrentWindow->ProcessKey(Manager::Key(KEY_ESC)); Commit(); if (PrevWindoowCount == m_windows.size()) { return FALSE; } } } return TRUE; }
void Manager::DeactivateCommit() { _MANAGER(CleverSysLog clv(L"Manager::DeactivateCommit()")); _MANAGER(SysLog(L"DeactivatedFrame=%p",DeactivatedFrame)); /*$ 18.04.2002 skv Если нечего активировать, то в общем-то не надо и деактивировать. */ if (!DeactivatedFrame || !ActivatedFrame) { return; } if (!ActivatedFrame) { _MANAGER("WARNING! !ActivatedFrame"); } if (DeactivatedFrame) { DeactivatedFrame->OnChangeFocus(0); } int modalIndex=IndexOfStack(DeactivatedFrame); if (-1 != modalIndex && modalIndex== ModalStackCount-1) { /*if (IsSemiModalBackFrame(ActivatedFrame)) { // Является ли "родителем" полумодального фрэйма? ModalStackCount--; } else {*/ if (IndexOfStack(ActivatedFrame)==-1) { ModalStack[ModalStackCount-1]=ActivatedFrame; } else { ModalStackCount--; } // } } }
void Manager::ExecuteCommit() { _MANAGER(CleverSysLog clv(L"Manager::ExecuteCommit()")); _MANAGER(SysLog(L"ExecutedFrame=%p",ExecutedFrame)); if (!ExecutedFrame) { return; } if (ModalStackCount == ModalStackSize) { ModalStack = (Frame **) xf_realloc(ModalStack, ++ModalStackSize * sizeof(Frame *)); } ModalStack [ModalStackCount++] = ExecutedFrame; ActivatedFrame=ExecutedFrame; }
/* $ 29.12.2000 IS Аналог CloseAll, но разрешает продолжение полноценной работы в фаре, если пользователь продолжил редактировать файл. Возвращает TRUE, если все закрыли и можно выходить из фара. */ BOOL Manager::ExitAll() { _MANAGER(CleverSysLog clv(L"Manager::ExitAll()")); for (int i=this->ModalStackCount-1; i>=0; i--) { Frame *iFrame=this->ModalStack[i]; if (!iFrame->GetCanLoseFocus(TRUE)) { int PrevFrameCount=ModalStackCount; iFrame->ProcessKey(KEY_ESC); Commit(); if (PrevFrameCount==ModalStackCount) { return FALSE; } } } for (int i=FrameCount-1; i>=0; i--) { Frame *iFrame=FrameList[i]; if (!iFrame->GetCanLoseFocus(TRUE)) { ActivateFrame(iFrame); Commit(); int PrevFrameCount=FrameCount; iFrame->ProcessKey(KEY_ESC); Commit(); if (PrevFrameCount==FrameCount) { return FALSE; } } } return TRUE; }
nsresult nsCommandLine::EnumerateValidators(EnumerateValidatorsCallback aCallback, void *aClosure) { nsresult rv; nsCOMPtr<nsICategoryManager> catman (do_GetService(NS_CATEGORYMANAGER_CONTRACTID)); NS_ENSURE_TRUE(catman, NS_ERROR_UNEXPECTED); nsCOMPtr<nsISimpleEnumerator> entenum; rv = catman->EnumerateCategory("command-line-validator", getter_AddRefs(entenum)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIUTF8StringEnumerator> strenum (do_QueryInterface(entenum)); NS_ENSURE_TRUE(strenum, NS_ERROR_UNEXPECTED); nsAutoCString entry; bool hasMore; while (NS_SUCCEEDED(strenum->HasMore(&hasMore)) && hasMore) { strenum->GetNext(entry); nsXPIDLCString contractID; rv = catman->GetCategoryEntry("command-line-validator", entry.get(), getter_Copies(contractID)); if (!contractID) continue; nsCOMPtr<nsICommandLineValidator> clv(do_GetService(contractID.get())); if (!clv) continue; rv = (aCallback)(clv, this, aClosure); if (rv == NS_ERROR_ABORT) break; rv = NS_OK; } return rv; }
void Manager::ExecuteModal(Frame *Executed) { _MANAGER(CleverSysLog clv(L"Manager::ExecuteModal (Frame *Executed)")); _MANAGER(SysLog(L"Executed=%p, ExecutedFrame=%p",Executed,ExecutedFrame)); if (!Executed && !ExecutedFrame) { return; } if (Executed) { if (ExecutedFrame) { _MANAGER(SysLog(L"WARNING! Попытка в одном цикле запустить в модальном режиме два фрейма. Executed=%p, ExecitedFrame=%p",Executed, ExecutedFrame)); return;// nullptr; //?? Определить, какое значение правильно возвращать в этом случае } else { ExecutedFrame=Executed; } } int ModalStartLevel=ModalStackCount; int OriginalStartManager=StartManager; StartManager=TRUE; for (;;) { Commit(); if (ModalStackCount<=ModalStartLevel) { break; } ProcessMainLoop(); } StartManager=OriginalStartManager; return;// GetModalExitCode(); }
void FileList::ProcessPluginCommand() { _ALGO(CleverSysLog clv(L"FileList::ProcessPluginCommand")); _ALGO(SysLog(L"PanelMode=%s",(PanelMode==PLUGIN_PANEL?"PLUGIN_PANEL":"NORMAL_PANEL"))); int Command=PluginCommand; PluginCommand=-1; if (PanelMode==PLUGIN_PANEL) switch (Command) { case FCTL_CLOSEPANEL: _ALGO(SysLog(L"Command=FCTL_CLOSEPANEL")); SetCurDir(strPluginParam,TRUE); if (strPluginParam.IsEmpty()) Update(UPDATE_KEEP_SELECTION); Redraw(); break; } }
void Manager::ActivateCommit() { _MANAGER(CleverSysLog clv(L"Manager::ActivateCommit()")); _MANAGER(SysLog(L"ActivatedFrame=%p",ActivatedFrame)); if (CurrentFrame==ActivatedFrame) { RefreshedFrame=ActivatedFrame; return; } int FrameIndex=IndexOf(ActivatedFrame); if (-1!=FrameIndex) { FramePos=FrameIndex; } /* 14.05.2002 SKV Если мы пытаемся активировать полумодальный фрэйм, то надо его вытащит на верх стэка модалов. */ for (int I=0; I<ModalStackCount; I++) { if (ModalStack[I]==ActivatedFrame) { Frame *tmp=ModalStack[I]; ModalStack[I]=ModalStack[ModalStackCount-1]; ModalStack[ModalStackCount-1]=tmp; break; } } RefreshedFrame=CurrentFrame=ActivatedFrame; InterlockedExchange(&CurrentWindowType,CurrentFrame->GetType()); }
void Manager::InsertCommit() { _MANAGER(CleverSysLog clv(L"Manager::InsertCommit()")); _MANAGER(SysLog(L"InsertedFrame=%p",InsertedFrame)); if (InsertedFrame) { if (FrameListSize <= FrameCount) { FrameList=(Frame **)xf_realloc(FrameList,sizeof(*FrameList)*(FrameCount+1)); FrameListSize++; } InsertedFrame->FrameToBack=CurrentFrame; FrameList[FrameCount]=InsertedFrame; if (!ActivatedFrame) { ActivatedFrame=InsertedFrame; } FrameCount++; } }
void FileList::PluginDelete() { _ALGO(CleverSysLog clv(L"FileList::PluginDelete()")); PluginPanelItem *ItemList; int ItemNumber; SaveSelection(); CreatePluginItemList(ItemList,ItemNumber); if (ItemList && ItemNumber>0) { if (CtrlObject->Plugins->DeleteFiles(hPlugin,ItemList,ItemNumber,0)) { SetPluginModified(); PutDizToPlugin(this,ItemList,ItemNumber,TRUE,FALSE,nullptr,&Diz); } DeletePluginItemList(ItemList,ItemNumber); Update(UPDATE_KEEP_SELECTION); Redraw(); Panel *AnotherPanel=CtrlObject->Cp()->GetAnotherPanel(this); AnotherPanel->Update(UPDATE_KEEP_SELECTION|UPDATE_SECONDARY); AnotherPanel->Redraw(); } }
void Manager::DeleteFrame(Frame *Deleted) { _MANAGER(CleverSysLog clv(L"Manager::DeleteFrame(Frame *Deleted)")); _MANAGER(SysLog(L"Deleted=%p",Deleted)); for (int i=0; i<FrameCount; i++) { Frame *iFrame=FrameList[i]; if (iFrame->RemoveModal(Deleted)) { return; } } if (!Deleted) { DeletedFrame=CurrentFrame; } else { DeletedFrame=Deleted; } }
void PrintFiles(Panel *SrcPanel) { _ALGO(CleverSysLog clv(L"Alt-F5 (PrintFiles)")); string strPrinterName; DWORD Needed,Returned; int PrinterNumber; DWORD FileAttr; string strSelName; long DirsCount=0; int SelCount=SrcPanel->GetSelCount(); if (!SelCount) { _ALGO(SysLog(L"Error: !SelCount")); return; } // проверка каталогов _ALGO(SysLog(L"Check for FILE_ATTRIBUTE_DIRECTORY")); SrcPanel->GetSelName(nullptr,FileAttr); while (SrcPanel->GetSelName(&strSelName,FileAttr)) { if (TestParentFolderName(strSelName) || (FileAttr & FILE_ATTRIBUTE_DIRECTORY)) DirsCount++; } if (DirsCount==SelCount) return; PRINTER_INFO *pi = nullptr; if (EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,nullptr,PRINTER_INFO_LEVEL,nullptr,0,&Needed,&Returned) || Needed<=0) return; pi = (PRINTER_INFO *)xf_malloc(Needed); if (!EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,nullptr,PRINTER_INFO_LEVEL,(LPBYTE)pi,Needed,&Needed,&Returned)) { Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MPrintTitle),MSG(MCannotEnumeratePrinters),MSG(MOk)); xf_free(pi); return; } { _ALGO(CleverSysLog clv2(L"Show Menu")); string strTitle; string strName; if (SelCount==1) { SrcPanel->GetSelName(nullptr,FileAttr); SrcPanel->GetSelName(&strName,FileAttr); TruncStr(strName,50); strSelName=strName; InsertQuote(strSelName); strTitle.Format(MSG(MPrintTo), strSelName.CPtr()); } else { _ALGO(SysLog(L"Correct: SelCount-=DirsCount")); SelCount-=DirsCount; strTitle.Format(MSG(MPrintFilesTo),SelCount); } VMenu PrinterList(strTitle,nullptr,0,ScrY-4); PrinterList.SetFlags(VMENU_WRAPMODE|VMENU_SHOWAMPERSAND); PrinterList.SetPosition(-1,-1,0,0); AddToPrintersMenu(&PrinterList,pi,Returned); PrinterList.Process(); PrinterNumber=PrinterList.Modal::GetExitCode(); if (PrinterNumber<0) { xf_free(pi); _ALGO(SysLog(L"ESC")); return; } int nSize = PrinterList.GetUserDataSize(); wchar_t *PrinterName = strPrinterName.GetBuffer(nSize); PrinterList.GetUserData(PrinterName, nSize); strPrinterName.ReleaseBuffer(); } HANDLE hPrinter; if (!OpenPrinter((wchar_t*)strPrinterName.CPtr(),&hPrinter,nullptr)) { Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MPrintTitle),MSG(MCannotOpenPrinter), strPrinterName,MSG(MOk)); xf_free(pi); _ALGO(SysLog(L"Error: Cannot Open Printer")); return; } { _ALGO(CleverSysLog clv3(L"Print selected Files")); //SaveScreen SaveScr; TPreRedrawFuncGuard preRedrawFuncGuard(PR_PrintMsg); SetCursorType(FALSE,0); PR_PrintMsg(); HANDLE hPlugin=SrcPanel->GetPluginHandle(); int PluginMode=SrcPanel->GetMode()==PLUGIN_PANEL && !CtrlObject->Plugins.UseFarCommand(hPlugin,PLUGIN_FARGETFILE); SrcPanel->GetSelName(nullptr,FileAttr); while (SrcPanel->GetSelName(&strSelName,FileAttr)) { if (TestParentFolderName(strSelName) || (FileAttr & FILE_ATTRIBUTE_DIRECTORY)) continue; int Success=FALSE; LPCWSTR FileName = nullptr; string strTempDir, strTempName; if (PluginMode) { if (FarMkTempEx(strTempDir)) { apiCreateDirectory(strTempDir,nullptr); FileListItem ListItem; if (SrcPanel->GetLastSelectedItem(&ListItem)) { PluginPanelItem PanelItem; FileList::FileListToPluginItem(&ListItem,&PanelItem); if (CtrlObject->Plugins.GetFile(hPlugin,&PanelItem,strTempDir,strTempName,OPM_SILENT)) FileName = strTempName; else apiRemoveDirectory(strTempDir); FileList::FreePluginPanelItem(&PanelItem); } } } else FileName = strSelName; File SrcFile; if(SrcFile.Open(FileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, nullptr, OPEN_EXISTING)) { DOC_INFO_1 di1 = {const_cast<LPWSTR>(FileName)}; if (StartDocPrinter(hPrinter,1,(LPBYTE)&di1)) { char Buffer[8192]; DWORD Read,Written; Success=TRUE; while (SrcFile.Read(Buffer, sizeof(Buffer), Read) && Read > 0) if (!WritePrinter(hPrinter,Buffer,Read,&Written)) { Success=FALSE; break; } EndDocPrinter(hPrinter); } SrcFile.Close(); } if (!strTempName.IsEmpty()) { DeleteFileWithFolder(strTempName); } if (Success) SrcPanel->ClearLastGetSelection(); else { if (Message(MSG_WARNING|MSG_ERRORTYPE,2,MSG(MPrintTitle),MSG(MCannotPrint), strSelName,MSG(MSkip),MSG(MCancel))) break; } } ClosePrinter(hPrinter); } SrcPanel->Redraw(); xf_free(pi); }
void PrintFiles(FileList* SrcPanel) { _ALGO(CleverSysLog clv(L"Alt-F5 (PrintFiles)")); string strPrinterName; DWORD Needed = 0, Returned; DWORD FileAttr; string strSelName; size_t DirsCount=0; size_t SelCount=SrcPanel->GetSelCount(); if (!SelCount) { _ALGO(SysLog(L"Error: !SelCount")); return; } // проверка каталогов _ALGO(SysLog(L"Check for FILE_ATTRIBUTE_DIRECTORY")); SrcPanel->GetSelName(nullptr,FileAttr); while (SrcPanel->GetSelName(&strSelName,FileAttr)) { if (TestParentFolderName(strSelName) || (FileAttr & FILE_ATTRIBUTE_DIRECTORY)) DirsCount++; } if (DirsCount==SelCount) return; EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, nullptr, PRINTER_INFO_LEVEL, nullptr, 0, &Needed, &Returned); if (!Needed) return; block_ptr<PRINTER_INFO> pi(Needed); if (!EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,nullptr,PRINTER_INFO_LEVEL,(LPBYTE)pi.get(),Needed,&Needed,&Returned)) { Global->CatchError(); Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MPrintTitle),MSG(MCannotEnumeratePrinters),MSG(MOk)); return; } { _ALGO(CleverSysLog clv2(L"Show Menu")); LangString strTitle; string strName; if (SelCount==1) { SrcPanel->GetSelName(nullptr,FileAttr); SrcPanel->GetSelName(&strName,FileAttr); strSelName = TruncStr(strName,50); strTitle = MPrintTo; strTitle << InsertQuote(strSelName); } else { _ALGO(SysLog(L"Correct: SelCount-=DirsCount")); SelCount-=DirsCount; strTitle = MPrintFilesTo; strTitle << SelCount; } VMenu2 PrinterList(strTitle,nullptr,0,ScrY-4); PrinterList.SetFlags(VMENU_WRAPMODE|VMENU_SHOWAMPERSAND); PrinterList.SetPosition(-1,-1,0,0); AddToPrintersMenu(&PrinterList,pi.get(),Returned); if (PrinterList.Run()<0) { _ALGO(SysLog(L"ESC")); return; } strPrinterName = NullToEmpty(static_cast<const wchar_t*>(PrinterList.GetUserData(nullptr, 0))); } HANDLE hPrinter; if (!OpenPrinter(UNSAFE_CSTR(strPrinterName), &hPrinter,nullptr)) { Global->CatchError(); Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MPrintTitle),MSG(MCannotOpenPrinter), strPrinterName.data(),MSG(MOk)); _ALGO(SysLog(L"Error: Cannot Open Printer")); return; } { _ALGO(CleverSysLog clv3(L"Print selected Files")); SCOPED_ACTION(SaveScreen); auto PR_PrintMsg = [](){ Message(0, 0, MSG(MPrintTitle), MSG(MPreparingForPrinting)); }; SCOPED_ACTION(TPreRedrawFuncGuard)(std::make_unique<PreRedrawItem>(PR_PrintMsg)); SetCursorType(false, 0); PR_PrintMsg(); auto hPlugin=SrcPanel->GetPluginHandle(); int PluginMode=SrcPanel->GetMode()==PLUGIN_PANEL && !Global->CtrlObject->Plugins->UseFarCommand(hPlugin,PLUGIN_FARGETFILE); SrcPanel->GetSelName(nullptr,FileAttr); while (SrcPanel->GetSelName(&strSelName,FileAttr)) { if (TestParentFolderName(strSelName) || (FileAttr & FILE_ATTRIBUTE_DIRECTORY)) continue; int Success=FALSE; string FileName; string strTempDir, strTempName; if (PluginMode) { if (FarMkTempEx(strTempDir)) { api::CreateDirectory(strTempDir,nullptr); auto ListItem = SrcPanel->GetLastSelectedItem(); if (ListItem) { PluginPanelItem PanelItem; FileList::FileListToPluginItem(*ListItem, &PanelItem); if (Global->CtrlObject->Plugins->GetFile(hPlugin,&PanelItem,strTempDir,strTempName,OPM_SILENT)) FileName = strTempName; else api::RemoveDirectory(strTempDir); FreePluginPanelItem(PanelItem); } } } else FileName = strSelName; api::File SrcFile; if(SrcFile.Open(FileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, nullptr, OPEN_EXISTING)) { DOC_INFO_1 di1 = {UNSAFE_CSTR(FileName)}; if (StartDocPrinter(hPrinter,1,(LPBYTE)&di1)) { char Buffer[8192]; DWORD Read,Written; Success=TRUE; while (SrcFile.Read(Buffer, sizeof(Buffer), Read) && Read > 0) if (!WritePrinter(hPrinter,Buffer,Read,&Written)) { Global->CatchError(); Success=FALSE; break; } EndDocPrinter(hPrinter); } SrcFile.Close(); } if (!strTempName.empty()) { DeleteFileWithFolder(strTempName); } if (Success) SrcPanel->ClearLastGetSelection(); else { if (Message(MSG_WARNING|MSG_ERRORTYPE,2,MSG(MPrintTitle),MSG(MCannotPrint), strSelName.data(),MSG(MSkip),MSG(MCancel))) break; } } ClosePrinter(hPrinter); } SrcPanel->Redraw(); }
// run appropriate function for opcode in memory void execute_cpu(machine* mch) { uint8_t *opcode = &mch->memory[mch->pc++]; uint8_t *memory = mch->memory; fprintf(stdout, "opcode: %x\n", opcode[0]); switch(*opcode) { case 0x02: exit(123); case 0x12: exit(123); case 0x22: exit(123); case 0x32: exit(123); case 0x42: exit(123); case 0x52: exit(123); case 0x62: exit(123); case 0x72: exit(123); case 0x92: exit(123); case 0xB2: exit(123); case 0xD2: exit(123); case 0xF2: exit(123); case 0xEA: return nop(mch, 1); case 0x1A: return nop(mch, 2); // illegal instruction (nop with 2 cycles) case 0x7A: return nop(mch, 2); // same as above case 0x69: return adc_imm(opcode[1], mch); case 0x65: return adc_zp(opcode[1], mch); case 0x75: return adc_zpx(opcode[1], mch); case 0x6D: return adc_abs(opcode[2], opcode[1], mch); case 0x7D: return adc_absx(opcode[2], opcode[1], mch); case 0x79: return adc_absy(opcode[2], opcode[1], mch); case 0x61: return adc_indx(opcode[2], opcode[1], mch); case 0x71: return adc_indy(opcode[2], opcode[1], mch); case 0x29: return and_imm(opcode[1], mch); case 0x25: return and_zp(opcode[1], mch); case 0x35: return and_zpx(opcode[1], mch); case 0x2D: return and_abs(opcode[2], opcode[1], mch); case 0x3D: return and_absx(opcode[2], opcode[1], mch); case 0x39: return and_absy(opcode[2], opcode[1], mch); case 0x21: return and_indx(opcode[2], opcode[1], mch); case 0x31: return and_indy(opcode[2], opcode[1], mch); case 0x0A: return asl_acc(mch); case 0x06: return asl_zp(opcode[1], mch); case 0x16: return asl_zpx(opcode[1], mch); case 0x0E: return asl_abs(opcode[2], opcode[1], mch); case 0x1E: return asl_absx(opcode[2], opcode[1], mch); case 0x90: return branch_clear(opcode[2], opcode[1], mch, 0b00000001); case 0xB0: return branch_set(opcode[2], opcode[1], mch, 0b00000001); case 0xF0: return branch_set(opcode[2], opcode[1], mch, 0b00000010); case 0x24: return bit_zp(opcode[1], mch); case 0x2C: return bit_abs(opcode[2], opcode[1], mch); case 0x30: return branch_set(opcode[2], opcode[1], mch, 0b10000000); case 0xD0: return branch_clear(opcode[2], opcode[1], mch, 0b00000010); case 0x10: return branch_clear(opcode[2], opcode[1], mch, 0b10000000); case 0x00: return brk(mch); case 0x50: return branch_clear(opcode[2], opcode[1], mch, 0b01000000); case 0x70: return branch_set(opcode[2], opcode[1], mch, 0b01000000); case 0x18: return clc(mch); case 0x58: return cli(mch); case 0xB8: return clv(mch); case 0xC9: return cmp_imm(opcode[1], mch); case 0xC5: return cmp_zp(opcode[1], mch); case 0xD5: return cmp_zpx(opcode[1], mch); case 0xCD: return cmp_abs(opcode[2], opcode[1], mch, 0, 0); case 0xDD: return cmp_abs(opcode[2], opcode[1], mch, 1, mch->X); case 0xD9: return cmp_abs(opcode[2], opcode[1], mch, 1, mch->Y); case 0xC1: return cmp_indy(opcode[2], opcode[1], mch); case 0xD1: return cmp_indx(opcode[2], opcode[1], mch); case 0xE0: return cpx_imm(opcode[1], mch); case 0xE4: return cpx_zp(opcode[1], mch); case 0xEC: return cpx_abs(opcode[2], opcode[1], mch); case 0xC0: return cpy_imm(opcode[1], mch); case 0xC4: return cpy_zp(opcode[1], mch); case 0xCC: return cpy_abs(opcode[2], opcode[1], mch); case 0xC6: return dec_zp(opcode[1], mch); case 0xD6: return dec_zpx(opcode[1], mch); case 0xCE: return dec_abs(opcode[2], opcode[1], mch); case 0xDE: return dec_absx(opcode[2], opcode[1], mch); case 0xCA: return dex(mch); case 0x88: return dey(mch); case 0x49: return eor_imm(opcode[1], mch); case 0x45: return eor_zp(opcode[1], mch); case 0x55: return eor_zpx(opcode[1], mch); case 0x4D: return eor_abs(opcode[2], opcode[1], mch); case 0x5D: return eor_absx(opcode[2], opcode[1], mch); case 0x59: return eor_absy(opcode[2], opcode[1], mch); case 0x41: return eor_indx(opcode[2], opcode[1], mch); case 0x51: return eor_indy(opcode[2], opcode[1], mch); case 0xE6: return inc_zp(opcode[1], mch, 0, 0); case 0xF6: return inc_zp(opcode[1], mch, 1, mch->X); case 0xEE: return inc_abs(opcode[2], opcode[1], mch, 0, 0); case 0xFE: return inc_abs(opcode[2], opcode[1], mch, 1, mch->X); case 0xE8: return inx(mch); case 0xC8: return iny(mch); case 0x4C: return jmp_abs(opcode[2], opcode[1], mch); case 0x6C: return jmp_ind(opcode[2], opcode[1], mch); case 0x20: return jsr(opcode[2], opcode[1], mch); case 0xA9: return lda_imm(opcode[1], mch); case 0xA5: return lda_zp(opcode[1], mch, 0, 0); case 0xB5: return lda_zp(opcode[1], mch, 1, mch->X); case 0xAD: return lda_abs(opcode[2], opcode[1], mch, 0, 0); case 0xBD: return lda_abs(opcode[2], opcode[1], mch, 1, mch->X); case 0xB9: return lda_abs(opcode[2], opcode[1], mch, 1, mch->Y); case 0xA1: return lda_indx(opcode[2], opcode[1], mch); case 0xB1: return lda_indy(opcode[2], opcode[1], mch); case 0xA2: return ldx_imm(opcode[1], mch); case 0xA6: return ldx_zp(opcode[1], mch, 0, 0); case 0xB6: return ldx_zp(opcode[1], mch, 1, mch->X); case 0xAE: return ldx_abs(opcode[2], opcode[1], mch, 0, 0); case 0xBE: return ldx_abs(opcode[2], opcode[1], mch, 1, mch->X); case 0xA0: return ldy_imm(opcode[1], mch); case 0xA4: return ldy_zp(opcode[1], mch, 0, 0); case 0xB4: return ldy_zp(opcode[1], mch, 1, mch->X); case 0xAC: return ldy_abs(opcode[2], opcode[1], mch, 0, 0); case 0xBC: return ldy_abs(opcode[2], opcode[1], mch, 1, mch->X); case 0x4A: return lsr_acc(mch); case 0x46: return lsr_zp(opcode[1], mch); case 0x56: return lsr_zpx(opcode[1], mch); case 0x4E: return lsr_abs(opcode[2], opcode[1], mch); case 0x5E: return lsr_absx(opcode[2], opcode[1], mch); case 0x09: return or_imm(opcode[1], mch); case 0x05: return or_zp(opcode[1], mch); case 0x15: return or_zpx(opcode[1], mch); case 0x0D: return or_abs(opcode[2], opcode[1], mch); case 0x1D: return or_absx(opcode[2], opcode[1], mch); case 0x19: return or_absy(opcode[2], opcode[1], mch); case 0x01: return or_indx(opcode[2], opcode[1], mch); case 0x11: return or_indy(opcode[2], opcode[1], mch); case 0x48: return pha(mch); case 0x08: return php(mch); case 0x68: return pla(mch); case 0x28: return plp(mch); case 0x40: return rti(mch); case 0x60: return rts(mch); case 0x78: return sei(mch); case 0x38: return sec(mch); case 0xAA: return tax(mch); case 0xA8: return tay(mch); case 0x8A: return txa(mch); case 0x98: return tya(mch); default: fprintf(stdout, "unimplemented opcode!\n"); fprintf(stdout, "opcode in question: %x\n", opcode[0]); exit(1); break; } }
void FileList::PluginToPluginFiles(int Move) { _ALGO(CleverSysLog clv(L"FileList::PluginToPluginFiles()")); PluginPanelItem *ItemList; int ItemNumber; Panel *AnotherPanel=CtrlObject->Cp()->GetAnotherPanel(this); string strTempDir; if (AnotherPanel->GetMode()!=PLUGIN_PANEL) return; FileList *AnotherFilePanel=(FileList *)AnotherPanel; if (!FarMkTempEx(strTempDir)) return; SaveSelection(); apiCreateDirectory(strTempDir,nullptr); CreatePluginItemList(ItemList,ItemNumber); if (ItemList && ItemNumber>0) { const wchar_t *lpwszTempDir=strTempDir; int PutCode=CtrlObject->Plugins->GetFiles(hPlugin,ItemList,ItemNumber,FALSE,&lpwszTempDir,OPM_SILENT); strTempDir=lpwszTempDir; if (PutCode==1 || PutCode==2) { string strSaveDir; apiGetCurrentDirectory(strSaveDir); FarChDir(strTempDir); PutCode=CtrlObject->Plugins->PutFiles(AnotherFilePanel->hPlugin,ItemList,ItemNumber,FALSE,0); if (PutCode==1 || PutCode==2) { if (!ReturnCurrentFile) ClearSelection(); AnotherPanel->SetPluginModified(); PutDizToPlugin(AnotherFilePanel,ItemList,ItemNumber,FALSE,FALSE,&Diz,&AnotherFilePanel->Diz); if (Move) if (CtrlObject->Plugins->DeleteFiles(hPlugin,ItemList,ItemNumber,OPM_SILENT)) { SetPluginModified(); PutDizToPlugin(this,ItemList,ItemNumber,TRUE,FALSE,nullptr,&Diz); } } else if (!ReturnCurrentFile) PluginClearSelection(ItemList,ItemNumber); FarChDir(strSaveDir); } DeleteDirTree(strTempDir); DeletePluginItemList(ItemList,ItemNumber); Update(UPDATE_KEEP_SELECTION); Redraw(); if (PanelMode==PLUGIN_PANEL) AnotherPanel->Update(UPDATE_KEEP_SELECTION|UPDATE_SECONDARY); else AnotherPanel->Update(UPDATE_KEEP_SELECTION); AnotherPanel->Redraw(); } }
void Manager::ExecuteFrame(Frame *Executed) { _MANAGER(CleverSysLog clv(L"Manager::ExecuteFrame(Frame *Executed)")); _MANAGER(SysLog(L"Executed=%p",Executed)); ExecutedFrame=Executed; }
void Manager::RefreshFrame(int Index) { _MANAGER(CleverSysLog clv(L"Manager::RefreshFrame(int Index)")); _MANAGER(SysLog(L"Index=%d",Index)); RefreshFrame((*this)[Index]); }
void Manager::ActivateFrame(int Index) { _MANAGER(CleverSysLog clv(L"Manager::ActivateFrame(int Index)")); _MANAGER(SysLog(L"Index=%i",Index)); ActivateFrame((*this)[Index]); }
void Manager::SetFramePos(int NewPos) { _MANAGER(CleverSysLog clv(L"Manager::SetFramePos(int NewPos)")); _MANAGER(SysLog(L"NewPos=%i",NewPos)); FramePos=NewPos; }
void FileList::UpdatePlugin(int KeepSelection, int IgnoreVisible) { _ALGO(CleverSysLog clv(L"FileList::UpdatePlugin")); _ALGO(SysLog(L"(KeepSelection=%d, IgnoreVisible=%d)",KeepSelection,IgnoreVisible)); if (!IsVisible() && !IgnoreVisible) { UpdateRequired=TRUE; UpdateRequiredMode=KeepSelection; return; } DizRead=FALSE; FileListItem *CurPtr, **OldData=0; string strCurName, strNextCurName; int OldFileCount=0; StopFSWatcher(); LastCurFile=-1; OpenPanelInfo Info; CtrlObject->Plugins->GetOpenPanelInfo(hPlugin,&Info); FreeDiskSize=0; if (Opt.ShowPanelFree) { if (Info.Flags & OPIF_REALNAMES) { unsigned __int64 TotalSize,TotalFree; if (!apiGetDiskSize(strCurDir,&TotalSize,&TotalFree,&FreeDiskSize)) FreeDiskSize=0; } else if (Info.Flags & OPIF_USEFREESIZE) FreeDiskSize=Info.FreeSize; } PluginPanelItem *PanelData=nullptr; size_t PluginFileCount; if (!CtrlObject->Plugins->GetFindData(hPlugin,&PanelData,&PluginFileCount,0)) { DeleteListData(ListData,FileCount); PopPlugin(TRUE); Update(KeepSelection); // WARP> явный хак, но очень способствует - восстанавливает позицию на панели при ошибке чтения архива. if (!PrevDataList.Empty()) GoToFile((*PrevDataList.Last())->strPrevName); return; } size_t PrevSelFileCount=SelFileCount; SelFileCount=0; SelFileSize=0; TotalFileCount=0; TotalFileSize=0; CacheSelIndex=-1; CacheSelClearIndex=-1; strPluginDizName.Clear(); if (FileCount>0) { CurPtr=ListData[CurFile]; strCurName = CurPtr->strName; if (CurPtr->Selected) { for (int i=CurFile+1; i < FileCount; i++) { CurPtr = ListData[i]; if (!CurPtr->Selected) { strNextCurName = CurPtr->strName; break; } } } } else if (Info.Flags & OPIF_ADDDOTS) { strCurName = L".."; } if (KeepSelection || PrevSelFileCount>0) { OldData=ListData; OldFileCount=FileCount; } else { DeleteListData(ListData,FileCount); } FileCount=static_cast<int>(PluginFileCount); ListData=(FileListItem**)xf_malloc(sizeof(FileListItem*)*(FileCount+1)); if (!ListData) { FileCount=0; return; } if (!Filter) Filter=new FileFilter(this,FFT_PANEL); //Рефреш текущему времени для фильтра перед началом операции Filter->UpdateCurrentTime(); CtrlObject->HiFiles->UpdateCurrentTime(); int DotsPresent=FALSE; int FileListCount=0; bool UseFilter=Filter->IsEnabledOnPanel(); for (int i=0; i < FileCount; i++) { ListData[FileListCount] = new FileListItem; FileListItem *CurListData=ListData[FileListCount]; CurListData->Clear(); if (UseFilter && !(Info.Flags & OPIF_DISABLEFILTER)) { //if (!(CurPanelData->FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) if (!Filter->FileInFilter(PanelData[i])) continue; } if (!Opt.ShowHidden && (PanelData[i].FileAttributes & (FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))) continue; //ClearStruct(*CurListData); PluginToFileListItem(&PanelData[i],CurListData); CurListData->Position=i; if (!(Info.Flags & OPIF_DISABLESORTGROUPS)/* && !(CurListData->FileAttr & FILE_ATTRIBUTE_DIRECTORY)*/) CurListData->SortGroup=CtrlObject->HiFiles->GetGroup(CurListData); else CurListData->SortGroup=DEFAULT_SORT_GROUP; if (!CurListData->DizText) { CurListData->DeleteDiz=FALSE; //CurListData->DizText=nullptr; } if (TestParentFolderName(CurListData->strName)) { DotsPresent=TRUE; CurListData->FileAttr|=FILE_ATTRIBUTE_DIRECTORY; } else if (!(CurListData->FileAttr & FILE_ATTRIBUTE_DIRECTORY)) { TotalFileCount++; } TotalFileSize += CurListData->FileSize; FileListCount++; } if (!(Info.Flags & OPIF_DISABLEHIGHLIGHTING) || (Info.Flags & OPIF_USEATTRHIGHLIGHTING)) CtrlObject->HiFiles->GetHiColor(ListData,FileListCount,(Info.Flags&OPIF_USEATTRHIGHLIGHTING)!=0); FileCount=FileListCount; if ((Info.Flags & OPIF_ADDDOTS) && !DotsPresent) { ListData[FileCount] = new FileListItem; CurPtr = ListData[FileCount]; CurPtr->Clear(); AddParentPoint(CurPtr,FileCount); if (!(Info.Flags & OPIF_DISABLEHIGHLIGHTING) || (Info.Flags & OPIF_USEATTRHIGHLIGHTING)) CtrlObject->HiFiles->GetHiColor(&CurPtr,1,(Info.Flags&OPIF_USEATTRHIGHLIGHTING)!=0); if (Info.HostFile && *Info.HostFile) { FAR_FIND_DATA_EX FindData; if (apiGetFindDataEx(Info.HostFile, FindData)) { CurPtr->WriteTime=FindData.ftLastWriteTime; CurPtr->CreationTime=FindData.ftCreationTime; CurPtr->AccessTime=FindData.ftLastAccessTime; CurPtr->ChangeTime=FindData.ftChangeTime; } } FileCount++; } if (CurFile >= FileCount) CurFile = FileCount ? FileCount-1 : 0; /* $ 25.02.2001 VVM ! Не считывать повторно список файлов с панели плагина */ if (IsColumnDisplayed(DIZ_COLUMN)) ReadDiz(PanelData,static_cast<int>(PluginFileCount),RDF_NO_UPDATE); CorrectPosition(); CtrlObject->Plugins->FreeFindData(hPlugin,PanelData,PluginFileCount); if (KeepSelection || PrevSelFileCount>0) { MoveSelection(ListData,FileCount,OldData,OldFileCount); DeleteListData(OldData,OldFileCount); } if (!KeepSelection && PrevSelFileCount>0) { SaveSelection(); ClearSelection(); } SortFileList(FALSE); if (CurFile>=FileCount || StrCmpI(ListData[CurFile]->strName,strCurName)) if (!GoToFile(strCurName) && !strNextCurName.IsEmpty()) GoToFile(strNextCurName); SetTitle(); }
void Manager::SwitchToPanels() { _MANAGER(CleverSysLog clv(L"Manager::SwitchToPanels()")); ActivateFrame(0); }
BOOL Manager::Commit() { _MANAGER(CleverSysLog clv(L"Manager::Commit()")); _MANAGER(ManagerClass_Dump(L"ManagerClass")); int Result = false; if (DeletedFrame && (InsertedFrame||ExecutedFrame)) { UpdateCommit(); DeletedFrame = nullptr; InsertedFrame = nullptr; ExecutedFrame=nullptr; Result=true; } else if (ExecutedFrame) { ExecuteCommit(); ExecutedFrame=nullptr; Result=true; } else if (DeletedFrame) { DeleteCommit(); DeletedFrame = nullptr; Result=true; } else if (InsertedFrame) { InsertCommit(); InsertedFrame = nullptr; Result=true; } else if (DeactivatedFrame) { DeactivateCommit(); DeactivatedFrame=nullptr; Result=true; } else if (ActivatedFrame) { ActivateCommit(); ActivatedFrame=nullptr; Result=true; } else if (RefreshedFrame) { RefreshCommit(); RefreshedFrame=nullptr; Result=true; } else if (ModalizedFrame) { ModalizeCommit(); // ModalizedFrame=nullptr; Result=true; } else if (UnmodalizedFrame) { UnmodalizeCommit(); // UnmodalizedFrame=nullptr; Result=true; } if (Result) { Result=Commit(); } return Result; }
void FileList::PutDizToPlugin(FileList *DestPanel,PluginPanelItem *ItemList, int ItemNumber,int Delete,int Move,DizList *SrcDiz, DizList *DestDiz) { _ALGO(CleverSysLog clv(L"FileList::PutDizToPlugin()")); OpenPanelInfo Info; CtrlObject->Plugins->GetOpenPanelInfo(DestPanel->hPlugin,&Info); if (DestPanel->strPluginDizName.IsEmpty() && Info.DescrFilesNumber>0) DestPanel->strPluginDizName = Info.DescrFiles[0]; if (((Opt.Diz.UpdateMode==DIZ_UPDATE_IF_DISPLAYED && IsDizDisplayed()) || Opt.Diz.UpdateMode==DIZ_UPDATE_ALWAYS) && !DestPanel->strPluginDizName.IsEmpty() && (!Info.HostFile || !*Info.HostFile || DestPanel->GetModalMode() || apiGetFileAttributes(Info.HostFile)!=INVALID_FILE_ATTRIBUTES)) { CtrlObject->Cp()->LeftPanel->ReadDiz(); CtrlObject->Cp()->RightPanel->ReadDiz(); if (DestPanel->GetModalMode()) DestPanel->ReadDiz(); int DizPresent=FALSE; for (int I=0; I<ItemNumber; I++) if (ItemList[I].Flags & PPIF_PROCESSDESCR) { string strName = ItemList[I].FileName; string strShortName = ItemList[I].AlternateFileName; int Code; if (Delete) Code=DestDiz->DeleteDiz(strName,strShortName); else { Code=SrcDiz->CopyDiz(strName,strShortName,strName,strShortName,DestDiz); if (Code && Move) SrcDiz->DeleteDiz(strName,strShortName); } if (Code) DizPresent=TRUE; } if (DizPresent) { string strTempDir; if (FarMkTempEx(strTempDir) && apiCreateDirectory(strTempDir,nullptr)) { string strSaveDir; apiGetCurrentDirectory(strSaveDir); string strDizName=strTempDir+L"\\"+DestPanel->strPluginDizName; DestDiz->Flush(L"", &strDizName); if (Move) SrcDiz->Flush(L""); PluginPanelItem PanelItem; if (FileNameToPluginItem(strDizName,&PanelItem)) CtrlObject->Plugins->PutFiles(DestPanel->hPlugin,&PanelItem,1,FALSE,OPM_SILENT|OPM_DESCR); else if (Delete) { PluginPanelItem pi={}; pi.FileName = xf_wcsdup(DestPanel->strPluginDizName); CtrlObject->Plugins->DeleteFiles(DestPanel->hPlugin,&pi,1,OPM_SILENT); xf_free(pi.FileName); } FarChDir(strSaveDir); DeleteFileWithFolder(strDizName); } } } }
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; }
/* Функция для вызова команды "Архивные команды" (Shift-F3) */ void FileList::ProcessHostFile() { _ALGO(CleverSysLog clv(L"FileList::ProcessHostFile()")); //_ALGO(SysLog(L"FileName='%s'",(FileName?FileName:"(nullptr)"))); if (FileCount>0 && SetCurPath()) { int Done=FALSE; SaveSelection(); if (PanelMode==PLUGIN_PANEL && !(*PluginsList.Last())->strHostFile.IsEmpty()) { PluginPanelItem *ItemList; int ItemNumber; _ALGO(SysLog(L"call CreatePluginItemList")); CreatePluginItemList(ItemList,ItemNumber); _ALGO(SysLog(L"call Plugins.ProcessHostFile")); Done=CtrlObject->Plugins->ProcessHostFile(hPlugin,ItemList,ItemNumber,0); if (Done) SetPluginModified(); else { if (!ReturnCurrentFile) PluginClearSelection(ItemList,ItemNumber); Redraw(); } _ALGO(SysLog(L"call DeletePluginItemList")); DeletePluginItemList(ItemList,ItemNumber); if (Done) ClearSelection(); } else { size_t SCount=GetRealSelCount(); if (SCount > 0) { for (int I=0; I < FileCount; ++I) { if (ListData[I]->Selected) { Done=ProcessOneHostFile(I); if (Done == 1) Select(ListData[I],0); else if (Done == -1) continue; else // Если ЭТО убрать, то... будем жать ESC до потере пулься break; // } } if (SelectedFirst) SortFileList(TRUE); } else { if ((Done=ProcessOneHostFile(CurFile)) == 1) ClearSelection(); } } if (Done) { Update(UPDATE_KEEP_SELECTION); Redraw(); Panel *AnotherPanel=CtrlObject->Cp()->GetAnotherPanel(this); AnotherPanel->Update(UPDATE_KEEP_SELECTION|UPDATE_SECONDARY); AnotherPanel->Redraw(); } } }
/** * @brief emulate instruction * @return returns false if something goes wrong (e.g. illegal instruction) * * Current limitations: * * - Illegal instructions are not implemented * - Excess cycles due to page boundary crossing are not calculated * - Some known architectural bugs are not emulated */ bool Cpu::emulate() { /* fetch instruction */ uint8_t insn = fetch_op(); bool retval = true; /* emulate instruction */ switch(insn) { /* BRK */ case 0x0: brk(); break; /* ORA (nn,X) */ case 0x1: ora(load_byte(addr_indx()),6); break; /* ORA nn */ case 0x5: ora(load_byte(addr_zero()),3); break; /* ASL nn */ case 0x6: asl_mem(addr_zero(),5); break; /* PHP */ case 0x8: php(); break; /* ORA #nn */ case 0x9: ora(fetch_op(),2); break; /* ASL A */ case 0xA: asl_a(); break; /* ORA nnnn */ case 0xD: ora(load_byte(addr_abs()),4); break; /* ASL nnnn */ case 0xE: asl_mem(addr_abs(),6); break; /* BPL nn */ case 0x10: bpl(); break; /* ORA (nn,Y) */ case 0x11: ora(load_byte(addr_indy()),5); break; /* ORA nn,X */ case 0x15: ora(load_byte(addr_zerox()),4); break; /* ASL nn,X */ case 0x16: asl_mem(addr_zerox(),6); break; /* CLC */ case 0x18: clc(); break; /* ORA nnnn,Y */ case 0x19: ora(load_byte(addr_absy()),4); break; /* ORA nnnn,X */ case 0x1D: ora(load_byte(addr_absx()),4); break; /* ASL nnnn,X */ case 0x1E: asl_mem(addr_absx(),7); break; /* JSR */ case 0x20: jsr(); break; /* AND (nn,X) */ case 0x21: _and(load_byte(addr_indx()),6); break; /* BIT nn */ case 0x24: bit(addr_zero(),3); break; /* AND nn */ case 0x25: _and(load_byte(addr_zero()),3); break; /* ROL nn */ case 0x26: rol_mem(addr_zero(),5); break; /* PLP */ case 0x28: plp(); break; /* AND #nn */ case 0x29: _and(fetch_op(),2); break; /* ROL A */ case 0x2A: rol_a(); break; /* BIT nnnn */ case 0x2C: bit(addr_abs(),4); break; /* AND nnnn */ case 0x2D: _and(load_byte(addr_abs()),4); break; /* ROL nnnn */ case 0x2E: rol_mem(addr_abs(),6); break; /* BMI nn */ case 0x30: bmi(); break; /* AND (nn,Y) */ case 0x31: _and(load_byte(addr_indy()),5); break; /* AND nn,X */ case 0x35: _and(load_byte(addr_zerox()),4); break; /* ROL nn,X */ case 0x36: rol_mem(addr_zerox(),6); break; /* SEC */ case 0x38: sec(); break; /* AND nnnn,Y */ case 0x39: _and(load_byte(addr_absy()),4); break; /* AND nnnn,X */ case 0x3D: _and(load_byte(addr_absx()),4); break; /* ROL nnnn,X */ case 0x3E: rol_mem(addr_absx(),7); break; /* RTI */ case 0x40: rti(); break; /* EOR (nn,X) */ case 0x41: eor(load_byte(addr_indx()),6); break; /* EOR nn */ case 0x45: eor(load_byte(addr_zero()),3); break; /* LSR nn */ case 0x46: lsr_mem(addr_zero(),5); break; /* PHA */ case 0x48: pha(); break; /* EOR #nn */ case 0x49: eor(fetch_op(),2); break; /* BVC */ case 0x50: bvc(); break; /* JMP nnnn */ case 0x4C: jmp(); break; /* EOR nnnn */ case 0x4D: eor(load_byte(addr_abs()),4); break; /* LSR A */ case 0x4A: lsr_a(); break; /* LSR nnnn */ case 0x4E: lsr_mem(addr_abs(),6); break; /* EOR (nn,Y) */ case 0x51: eor(load_byte(addr_indy()),5); break; /* EOR nn,X */ case 0x55: eor(load_byte(addr_zerox()),4); break; /* LSR nn,X */ case 0x56: lsr_mem(addr_zerox(),6); break; /* CLI */ case 0x58: cli(); break; /* EOR nnnn,Y */ case 0x59: eor(load_byte(addr_absy()),4); break; /* EOR nnnn,X */ case 0x5D: eor(load_byte(addr_absx()),4); break; /* LSR nnnn,X */ case 0x5E: lsr_mem(addr_absx(),7); break; /* RTS */ case 0x60: rts(); break; /* ADC (nn,X) */ case 0x61: adc(load_byte(addr_indx()),6); break; /* ADC nn */ case 0x65: adc(load_byte(addr_zero()),3); break; /* ROR nn */ case 0x66: ror_mem(addr_zero(),5); break; /* PLA */ case 0x68: pla(); break; /* ADC #nn */ case 0x69: adc(fetch_op(),2); break; /* ROR A */ case 0x6A: ror_a(); break; /* JMP (nnnn) */ case 0x6C: jmp_ind(); break; /* ADC nnnn */ case 0x6D: adc(load_byte(addr_abs()),4); break; /* ROR nnnn */ case 0x6E: ror_mem(addr_abs(),6); break; /* BVS */ case 0x70: bvs(); break; /* ADC (nn,Y) */ case 0x71: adc(load_byte(addr_indy()),5); break; /* ADC nn,X */ case 0x75: adc(load_byte(addr_zerox()),4); break; /* ROR nn,X */ case 0x76: ror_mem(addr_zerox(),6); break; /* SEI */ case 0x78: sei(); break; /* ADC nnnn,Y */ case 0x79: adc(load_byte(addr_absy()),4); break; /* ADC nnnn,X */ case 0x7D: adc(load_byte(addr_absx()),4); break; /* ROR nnnn,X */ case 0x7E: ror_mem(addr_absx(),7); break; /* STA (nn,X) */ case 0x81: sta(addr_indx(),6); break; /* STY nn */ case 0x84: sty(addr_zero(),3); break; /* STA nn */ case 0x85: sta(addr_zero(),3); break; /* STX nn */ case 0x86: stx(addr_zero(),3); break; /* DEY */ case 0x88: dey(); break; /* TXA */ case 0x8A: txa(); break; /* STY nnnn */ case 0x8C: sty(addr_abs(),4); break; /* STA nnnn */ case 0x8D: sta(addr_abs(),4); break; /* STX nnnn */ case 0x8E: stx(addr_abs(),4); break; /* BCC nn */ case 0x90: bcc(); break; /* STA (nn,Y) */ case 0x91: sta(addr_indy(),6); break; /* STY nn,X */ case 0x94: sty(addr_zerox(),4); break; /* STA nn,X */ case 0x95: sta(addr_zerox(),4); break; /* STX nn,Y */ case 0x96: stx(addr_zeroy(),4); break; /* TYA */ case 0x98: tya(); break; /* STA nnnn,Y */ case 0x99: sta(addr_absy(),5); break; /* TXS */ case 0x9A: txs(); break; /* STA nnnn,X */ case 0x9D: sta(addr_absx(),5); break; /* LDY #nn */ case 0xA0: ldy(fetch_op(),2); break; /* LDA (nn,X) */ case 0xA1: lda(load_byte(addr_indx()),6); break; /* LDX #nn */ case 0xA2: ldx(fetch_op(),2); break; /* LDY nn */ case 0xA4: ldy(load_byte(addr_zero()),3); break; /* LDA nn */ case 0xA5: lda(load_byte(addr_zero()),3); break; /* LDX nn */ case 0xA6: ldx(load_byte(addr_zero()),3); break; /* TAY */ case 0xA8: tay(); break; /* LDA #nn */ case 0xA9: lda(fetch_op(),2); break; /* TAX */ case 0xAA: tax(); break; /* LDY nnnn */ case 0xAC: ldy(load_byte(addr_abs()),4); break; /* LDA nnnn */ case 0xAD: lda(load_byte(addr_abs()),4); break; /* LDX nnnn */ case 0xAE: ldx(load_byte(addr_abs()),4); break; /* BCS nn */ case 0xB0: bcs(); break; /* LDA (nn,Y) */ case 0xB1: lda(load_byte(addr_indy()),5); break; /* LDY nn,X */ case 0xB4: ldy(load_byte(addr_zerox()),3); break; /* LDA nn,X */ case 0xB5: lda(load_byte(addr_zerox()),3); break; /* LDX nn,Y */ case 0xB6: ldx(load_byte(addr_zeroy()),3); break; /* CLV */ case 0xB8: clv(); break; /* LDA nnnn,Y */ case 0xB9: lda(load_byte(addr_absy()),4); break; /* TSX */ case 0xBA: tsx(); break; /* LDY nnnn,X */ case 0xBC: ldy(load_byte(addr_absx()),4); break; /* LDA nnnn,X */ case 0xBD: lda(load_byte(addr_absx()),4); break; /* LDX nnnn,Y */ case 0xBE: ldx(load_byte(addr_absy()),4); break; /* CPY #nn */ case 0xC0: cpy(fetch_op(),2); break; /* CMP (nn,X) */ case 0xC1: cmp(load_byte(addr_indx()),6); break; /* CPY nn */ case 0xC4: cpy(load_byte(addr_zero()),3); break; /* CMP nn */ case 0xC5: cmp(load_byte(addr_zero()),3); break; /* DEC nn */ case 0xC6: dec(addr_zero(),5); break; /* INY */ case 0xC8: iny(); break; /* CMP #nn */ case 0xC9: cmp(fetch_op(),2); break; /* DEX */ case 0xCA: dex(); break; /* CPY nnnn */ case 0xCC: cpy(load_byte(addr_abs()),4); break; /* CMP nnnn */ case 0xCD: cmp(load_byte(addr_abs()),4); break; /* DEC nnnn */ case 0xCE: dec(addr_abs(),6); break; /* BNE nn */ case 0xD0: bne(); break; /* CMP (nn,Y) */ case 0xD1: cmp(load_byte(addr_indy()),5); break; /* CMP nn,X */ case 0xD5: cmp(load_byte(addr_zerox()),4); break; /* DEC nn,X */ case 0xD6: dec(addr_zerox(),6); break; /* CLD */ case 0xD8: cld(); break; /* CMP nnnn,Y */ case 0xD9: cmp(load_byte(addr_absy()),4); break; /* CMP nnnn,X */ case 0xDD: cmp(load_byte(addr_absx()),4); break; /* DEC nnnn,X */ case 0xDE: dec(addr_absx(),7); break; /* CPX #nn */ case 0xE0: cpx(fetch_op(),2); break; /* SBC (nn,X) */ case 0xE1: sbc(load_byte(addr_indx()),6); break; /* CPX nn */ case 0xE4: cpx(load_byte(addr_zero()),3); break; /* SBC nn */ case 0xE5: sbc(load_byte(addr_zero()),3); break; /* INC nn */ case 0xE6: inc(addr_zero(),5); break; /* INX */ case 0xE8: inx(); break; /* SBC #nn */ case 0xE9: sbc(fetch_op(),2); break; /* NOP */ case 0xEA: nop(); break; /* CPX nnnn */ case 0xEC: cpx(load_byte(addr_abs()),4); break; /* SBC nnnn */ case 0xED: sbc(load_byte(addr_abs()),4); break; /* INC nnnn */ case 0xEE: inc(addr_abs(),6); break; /* BEQ nn */ case 0xF0: beq(); break; /* SBC (nn,Y) */ case 0xF1: sbc(load_byte(addr_indy()),5); break; /* SBC nn,X */ case 0xF5: sbc(load_byte(addr_zerox()),4); break; /* INC nn,X */ case 0xF6: inc(addr_zerox(),6); break; /* SED */ case 0xF8: sed(); break; /* SBC nnnn,Y */ case 0xF9: sbc(load_byte(addr_absy()),4); break; /* SBC nnnn,X */ case 0xFD: sbc(load_byte(addr_absx()),4); break; /* INC nnnn,X */ case 0xFE: inc(addr_absx(),7); break; /* Unknown or illegal instruction */ default: D("Unknown instruction: %X at %04x\n", insn,pc()); retval = false; } return retval; }
int Manager::ProcessKey(DWORD Key) { int ret=FALSE; if (CurrentFrame) { DWORD KeyM=(Key&(~KEY_CTRLMASK)); if (!((KeyM >= KEY_MACRO_BASE && KeyM <= KEY_MACRO_ENDBASE) || (KeyM >= KEY_OP_BASE && KeyM <= KEY_OP_ENDBASE))) // пропустим макро-коды { switch (CurrentFrame->GetType()) { case MODALTYPE_PANELS: { _ALGO(CleverSysLog clv(L"Manager::ProcessKey()")); _ALGO(SysLog(L"Key=%s",_FARKEY_ToName(Key))); #ifndef NO_WRAPPER if (CtrlObject->Cp()->ActivePanel->GetMode() == PLUGIN_PANEL) { PluginHandle *ph=(PluginHandle*)CtrlObject->Cp()->ActivePanel->GetPluginHandle(); if (ph && ph->pPlugin->IsOemPlugin()) if (CtrlObject->Cp()->ActivePanel->SendKeyToPlugin(Key,TRUE)) return TRUE; } #endif // NO_WRAPPER break; } #if 0 case MODALTYPE_VIEWER: //if(((FileViewer*)CurrentFrame)->ProcessViewerInput(FrameManager->GetLastInputRecord())) // return TRUE; break; case MODALTYPE_EDITOR: //if(((FileEditor*)CurrentFrame)->ProcessEditorInput(FrameManager->GetLastInputRecord())) // return TRUE; break; case MODALTYPE_DIALOG: //((Dialog*)CurrentFrame)->CallDlgProc(DN_KEY,((Dialog*)CurrentFrame)->GetDlgFocusPos(),Key); break; case MODALTYPE_VMENU: case MODALTYPE_HELP: case MODALTYPE_COMBOBOX: case MODALTYPE_USER: case MODALTYPE_FINDFOLDER: default: break; #endif } } #if defined(FAR_ALPHA_VERSION) // сей код для проверки исключатор, просьба не трогать :-) if (Key == KEY_CTRLALTAPPS || Key == KEY_RCTRLRALTAPPS || Key == KEY_CTRLRALTAPPS || Key == KEY_RCTRLALTAPPS) { struct __ECODE { NTSTATUS Code; const wchar_t *Name; } ECode[]= { {EXCEPTION_ACCESS_VIOLATION,L"Access Violation (Read)"}, {EXCEPTION_ACCESS_VIOLATION,L"Access Violation (Write)"}, {EXCEPTION_INT_DIVIDE_BY_ZERO,L"Divide by zero"}, {EXCEPTION_ILLEGAL_INSTRUCTION,L"Illegal instruction"}, {EXCEPTION_STACK_OVERFLOW,L"Stack Overflow"}, {EXCEPTION_FLT_DIVIDE_BY_ZERO,L"Floating-point divide by zero"}, {EXCEPTION_BREAKPOINT,L"Breakpoint"}, #ifdef _M_IA64 {EXCEPTION_DATATYPE_MISALIGNMENT,L"Alignment fault (IA64 specific)",}, #endif /* {EXCEPTION_FLT_OVERFLOW,"EXCEPTION_FLT_OVERFLOW"}, {EXCEPTION_SINGLE_STEP,"EXCEPTION_SINGLE_STEP",}, {EXCEPTION_ARRAY_BOUNDS_EXCEEDED,"EXCEPTION_ARRAY_BOUNDS_EXCEEDED",}, {EXCEPTION_FLT_DENORMAL_OPERAND,"EXCEPTION_FLT_DENORMAL_OPERAND",}, {EXCEPTION_FLT_INEXACT_RESULT,"EXCEPTION_FLT_INEXACT_RESULT",}, {EXCEPTION_FLT_INVALID_OPERATION,"EXCEPTION_FLT_INVALID_OPERATION",}, {EXCEPTION_FLT_STACK_CHECK,"EXCEPTION_FLT_STACK_CHECK",}, {EXCEPTION_FLT_UNDERFLOW,"EXCEPTION_FLT_UNDERFLOW",}, {EXCEPTION_INT_OVERFLOW,"EXCEPTION_INT_OVERFLOW",0}, {EXCEPTION_PRIV_INSTRUCTION,"EXCEPTION_PRIV_INSTRUCTION",0}, {EXCEPTION_IN_PAGE_ERROR,"EXCEPTION_IN_PAGE_ERROR",0}, {EXCEPTION_NONCONTINUABLE_EXCEPTION,"EXCEPTION_NONCONTINUABLE_EXCEPTION",0}, {EXCEPTION_INVALID_DISPOSITION,"EXCEPTION_INVALID_DISPOSITION",0}, {EXCEPTION_GUARD_PAGE,"EXCEPTION_GUARD_PAGE",0}, {EXCEPTION_INVALID_HANDLE,"EXCEPTION_INVALID_HANDLE",0}, */ }; static union { int i; int *iptr; double d; } zero_const; //, refers; zero_const.i=0L; MenuItemEx ModalMenuItem; ModalMenuItem.Clear(); VMenu2 ModalMenu(L"Test Exceptions",nullptr,0,ScrY-4); ModalMenu.SetFlags(VMENU_WRAPMODE); ModalMenu.SetPosition(-1,-1,0,0); for (size_t I=0; I<ARRAYSIZE(ECode); I++) { ModalMenuItem.strName = ECode[I].Name; ModalMenu.AddItem(&ModalMenuItem); } int ExitCode=ModalMenu.Run(); switch (ExitCode) { case -1: return TRUE; case 0: zero_const.i=*zero_const.iptr; break; case 1: *zero_const.iptr = 0; break; case 2: zero_const.i=1/zero_const.i; break; case 3: #if defined(_MSC_VER) #ifdef _M_IA64 #define __REG_IA64_IntR0 1024 __setReg(__REG_IA64_IntR0, 666); #else __ud2(); #endif #elif defined(__GNUC__) asm("ud2"); #else #error "Unsupported compiler" #endif break; case 4: Test_EXCEPTION_STACK_OVERFLOW(nullptr); break; case 5: //refers.d = 1.0/zero_const.d; break; case 6: DebugBreak(); break; #ifdef _M_IA64 case 7: { BYTE temp[10]={}; double* val; val = (double*)(&temp[3]); printf("%lf\n", *val); } #endif } Message(MSG_WARNING, 1, L"Test Exceptions failed", L"", ECode[ExitCode].Name, L"", MSG(MOk)); return TRUE; } #endif /*** БЛОК ПРИВЕЛЕГИРОВАННЫХ КЛАВИШ ! ***/ /*** КОТОРЫЕ НЕЛЬЗЯ НАМАКРОСИТЬ ***/ switch (Key) { case KEY_ALT|KEY_NUMPAD0: case KEY_RALT|KEY_NUMPAD0: case KEY_ALTINS: case KEY_RALTINS: { RunGraber(); return TRUE; } case KEY_CONSOLE_BUFFER_RESIZE: Sleep(1); ResizeAllFrame(); return TRUE; } /*** А вот здесь - все остальное! ***/ if (!Global->IsProcessAssignMacroKey) // в любом случае если кому-то не нужны все клавиши или { bool scrollable = false; if ( Global->Opt->WindowMode ) { int frame_type = CurrentFrame->GetType(); scrollable = frame_type != MODALTYPE_EDITOR && frame_type != MODALTYPE_VIEWER; }; switch (Key) { // <Удалить после появления макрофункции Scroll> case KEY_CTRLALTUP: case KEY_RCTRLRALTUP: case KEY_CTRLRALTUP: case KEY_RCTRLALTUP: if(scrollable) { Global->Console->ScrollWindow(-1); return TRUE; } break; case KEY_CTRLALTDOWN: case KEY_RCTRLRALTDOWN: case KEY_CTRLRALTDOWN: case KEY_RCTRLALTDOWN: if(scrollable) { Global->Console->ScrollWindow(1); return TRUE; } break; case KEY_CTRLALTPGUP: case KEY_RCTRLRALTPGUP: case KEY_CTRLRALTPGUP: case KEY_RCTRLALTPGUP: if(scrollable) { Global->Console->ScrollWindow(-ScrY); return TRUE; } break; case KEY_CTRLALTHOME: case KEY_RCTRLRALTHOME: case KEY_CTRLRALTHOME: case KEY_RCTRLALTHOME: if(scrollable) { while(Global->Console->ScrollWindow(-ScrY)); return TRUE; } break; case KEY_CTRLALTPGDN: case KEY_RCTRLRALTPGDN: case KEY_CTRLRALTPGDN: case KEY_RCTRLALTPGDN: if(scrollable) { Global->Console->ScrollWindow(ScrY); return TRUE; } break; case KEY_CTRLALTEND: case KEY_RCTRLRALTEND: case KEY_CTRLRALTEND: case KEY_RCTRLALTEND: if(scrollable) { while(Global->Console->ScrollWindow(ScrY)); return TRUE; } break; // </Удалить после появления макрофункции Scroll> case KEY_CTRLW: case KEY_RCTRLW: ShowProcessList(); return TRUE; case KEY_F11: PluginsMenu(); FrameManager->RefreshFrame(); //_MANAGER(SysLog(-1)); return TRUE; case KEY_ALTF9: case KEY_RALTF9: { //_MANAGER(SysLog(1,"Manager::ProcessKey, KEY_ALTF9 pressed...")); Sleep(1); SetVideoMode(); Sleep(1); /* В процессе исполнения Alt-F9 (в нормальном режиме) в очередь консоли попадает WINDOW_BUFFER_SIZE_EVENT, формируется в ChangeVideoMode(). В режиме исполнения макросов ЭТО не происходит по вполне понятным причинам. */ if (CtrlObject->Macro.IsExecuting()) { int PScrX=ScrX; int PScrY=ScrY; Sleep(1); GetVideoMode(CurSize); if (PScrX+1 == CurSize.X && PScrY+1 == CurSize.Y) { //_MANAGER(SysLog(-1,"GetInputRecord(WINDOW_BUFFER_SIZE_EVENT); return KEY_NONE")); return TRUE; } else { PrevScrX=PScrX; PrevScrY=PScrY; //_MANAGER(SysLog(-1,"GetInputRecord(WINDOW_BUFFER_SIZE_EVENT); return KEY_CONSOLE_BUFFER_RESIZE")); Sleep(1); return ProcessKey(KEY_CONSOLE_BUFFER_RESIZE); } } //_MANAGER(SysLog(-1)); return TRUE; } case KEY_F12: { int TypeFrame=FrameManager->GetCurrentFrame()->GetType(); if (TypeFrame != MODALTYPE_HELP && TypeFrame != MODALTYPE_DIALOG) { DeactivateFrame(FrameMenu(),0); //_MANAGER(SysLog(-1)); return TRUE; } break; // отдадим F12 дальше по цепочке } case KEY_CTRLALTSHIFTPRESS: case KEY_RCTRLALTSHIFTPRESS: { if (!(Global->Opt->CASRule&1) && Key == KEY_CTRLALTSHIFTPRESS) break; if (!(Global->Opt->CASRule&2) && Key == KEY_RCTRLALTSHIFTPRESS) break; if (!Global->Opt->OnlyEditorViewerUsed) { if (CurrentFrame->FastHide()) { int isPanelFocus=CurrentFrame->GetType() == MODALTYPE_PANELS; if (isPanelFocus) { int LeftVisible=CtrlObject->Cp()->LeftPanel->IsVisible(); int RightVisible=CtrlObject->Cp()->RightPanel->IsVisible(); int CmdLineVisible=CtrlObject->CmdLine->IsVisible(); int KeyBarVisible=CtrlObject->Cp()->MainKeyBar.IsVisible(); CtrlObject->CmdLine->ShowBackground(); CtrlObject->Cp()->LeftPanel->Hide0(); CtrlObject->Cp()->RightPanel->Hide0(); switch (Global->Opt->PanelCtrlAltShiftRule) { case 0: CtrlObject->CmdLine->Show(); CtrlObject->Cp()->MainKeyBar.Show(); break; case 1: CtrlObject->Cp()->MainKeyBar.Show(); break; } WaitKey(Key==KEY_CTRLALTSHIFTPRESS?KEY_CTRLALTSHIFTRELEASE:KEY_RCTRLALTSHIFTRELEASE); if (LeftVisible) CtrlObject->Cp()->LeftPanel->Show(); if (RightVisible) CtrlObject->Cp()->RightPanel->Show(); if (CmdLineVisible) CtrlObject->CmdLine->Show(); if (KeyBarVisible) CtrlObject->Cp()->MainKeyBar.Show(); } else { ImmediateHide(); WaitKey(Key==KEY_CTRLALTSHIFTPRESS?KEY_CTRLALTSHIFTRELEASE:KEY_RCTRLALTSHIFTRELEASE); } FrameManager->RefreshFrame(); } return TRUE; } break; } case KEY_CTRLTAB: case KEY_RCTRLTAB: case KEY_CTRLSHIFTTAB: case KEY_RCTRLSHIFTTAB: if (CurrentFrame->GetCanLoseFocus()) { DeactivateFrame(CurrentFrame,(Key==KEY_CTRLTAB||Key==KEY_RCTRLTAB)?1:-1); } _MANAGER(SysLog(-1)); return TRUE; } } CurrentFrame->UpdateKeyBar(); CurrentFrame->ProcessKey(Key); } _MANAGER(SysLog(-1)); return ret; }
//! Удаляет DeletedFrame изо всех очередей! //! Назначает следующий активный, (исходя из своих представлений) //! Но только в том случае, если активный фрейм еще не назначен заранее. void Manager::DeleteCommit() { _MANAGER(CleverSysLog clv(L"Manager::DeleteCommit()")); _MANAGER(SysLog(L"DeletedFrame=%p",DeletedFrame)); if (!DeletedFrame) { return; } // <ifDoubleInstance> //BOOL ifDoubI=ifDoubleInstance(DeletedFrame); // </ifDoubleInstance> int ModalIndex=IndexOfStack(DeletedFrame); if (ModalIndex!=-1) { /* $ 14.05.2002 SKV Надёжнее найти и удалить именно то, что нужно, а не просто верхний. */ for (int i=0; i<ModalStackCount; i++) { if (ModalStack[i]==DeletedFrame) { for (int j=i+1; j<ModalStackCount; j++) { ModalStack[j-1]=ModalStack[j]; } ModalStackCount--; break; } } if (ModalStackCount) { ActivateFrame(ModalStack[ModalStackCount-1]); } } for (int i=0; i<FrameCount; i++) { if (FrameList[i]->FrameToBack==DeletedFrame) { FrameList[i]->FrameToBack=CtrlObject->Cp(); } } int FrameIndex=IndexOf(DeletedFrame); if (-1!=FrameIndex) { DeletedFrame->DestroyAllModal(); for (int j=FrameIndex; j<FrameCount-1; j++) { FrameList[j]=FrameList[j+1]; } FrameCount--; if (FramePos >= FrameCount) { FramePos=0; } if (DeletedFrame->FrameToBack==CtrlObject->Cp()) { ActivateFrame(FrameList[FramePos]); } else { ActivateFrame(DeletedFrame->FrameToBack); } } /* $ 14.05.2002 SKV Долго не мог понять, нужен всё же этот код или нет. Но вроде как нужен. SVS> Когда понадобится - в некоторых местах расскомментить куски кода помеченные скобками <ifDoubleInstance> if (ifDoubI && IsSemiModalBackFrame(ActivatedFrame)){ for(int i=0;i<ModalStackCount;i++) { if(ModalStack[i]==ActivatedFrame) { break; } } if(i==ModalStackCount) { if (ModalStackCount == ModalStackSize){ ModalStack = (Frame **) xf_realloc (ModalStack, ++ModalStackSize * sizeof (Frame *)); } ModalStack[ModalStackCount++]=ActivatedFrame; } } */ DeletedFrame->OnDestroy(); if (CurrentFrame==DeletedFrame) { CurrentFrame=0; InterlockedExchange(&CurrentWindowType,-1); } if (DeletedFrame->GetDynamicallyBorn()) { _MANAGER(SysLog(L"delete DeletedFrame %p", DeletedFrame)); /* $ 14.05.2002 SKV Так как в деструкторе фрэйма неявно может быть вызван commit, то надо подстраховаться. */ Frame *tmp=DeletedFrame; DeletedFrame=nullptr; delete tmp; } // Полагаемся на то, что в ActevateFrame не будет переписан уже // присвоенный ActivatedFrame if (ModalStackCount) { ActivateFrame(ModalStack[ModalStackCount-1]); } else { ActivateFrame(FramePos); } }