static void Undo() { char *Lines = (char*)StackPop(); free(Lines); EditorUndoRedo eur = {sizeof(EditorUndoRedo), EUR_UNDO}; Info.EditorControl(-1, ECTL_UNDOREDO, 0, &eur); struct EditorSetPosition es = {sizeof(EditorSetPosition)}; if (--nChanges == 0) { if (bLineChanged) { es.CurLine = OriginalLine; es.TopScreenLine = OriginalLine; } else { es.CurLine = InitialLine; es.TopScreenLine = InitialTop; } es.CurPos = InitialCol; es.CurTabPos = es.LeftPos = es.Overtype = -1; } else { es.CurLine = 0; es.CurPos = 0; es.TopScreenLine = 0; es.CurTabPos = es.LeftPos = es.Overtype = -1; } Info.EditorControl(-1, ECTL_SETPOSITION, 0, &es); }
int Panel::ProcessEvent(int Event, void *Param) { if (Event == FE_COMMAND) { PCWSTR cmd((PCWSTR)Param); if (cmd) { int argc = 0; PWSTR *argv = ::CommandLineToArgvW(cmd, &argc); if (argc > 1 && Eqi(argv[0], L"cd")) { try { psi.Control(this, FCTL_REDRAWPANEL, 0, nullptr); ConnectingToServer(argv[1]); winstd::shared_ptr<RemoteConnection> tmp(new RemoteConnection(argv[1])); WinTS tts(tmp->host()); m_ts = tts; m_conn.swap(tmp); psi.Control(this, FCTL_SETCMDLINE, 0, (LONG_PTR)EMPTY_STR); psi.Control(this, FCTL_UPDATEPANEL, 0, nullptr); psi.Control(this, FCTL_REDRAWPANEL, 0, nullptr); } catch (WinError &e) { if (e.code() == ERROR_ACCESS_DENIED) { AccesDeniedErrorMessage(); } else { farebox_code(e.code(), e.where().c_str()); } } } ::LocalFree(argv); return true; } } return false; }
intptr_t WINAPI ProcessSynchroEventW(const struct ProcessSynchroEventInfo *Info) { if (Info->Event != SE_COMMONSYNCHRO) return 0; if (gnInCall > 0) return 0; #if 1 OutputDebugString(L"Posting macro\n"); MacroSendMacroText mcr = {sizeof(MacroSendMacroText)}; //mcr.SequenceText = L"i = 0; if APanel.Plugin then i=i+1; end; if PPanel.Plugin then i=i+2; end; Plugin.Call(\"6197AF6C-4755-49A5-84A1-8F227BF4790E\",i)"; mcr.SequenceText = L"Plugin.Call(\"6197AF6C-4755-49A5-84A1-8F227BF4790E\",APanel.Plugin and \"\" or APanel.Path0,PPanel.Plugin and \"\" or PPanel.Path0)"; INT_PTR i = psi.MacroControl(&guid_PluginGuid, MCTL_SENDSTRING, MSSC_POST, &mcr); MacroParseResult* mpr; if (!i) { mpr = (MacroParseResult*)calloc(4096,1); mpr->StructSize = sizeof(*mpr); psi.MacroControl(&guid_PluginGuid, MCTL_GETLASTERROR, 4096, mpr); free(mpr); } else InterlockedIncrement(&gnInCall); #endif #if 0 wchar_t szDbg[100]; static LONG nCount; nCount++; wsprintf(szDbg, L"%i: PanelControl(FCTL_GETPANELINFO, PANEL_ACTIVE)...", nCount); PanelInfo piA = {sizeof(piA)}, piP = {sizeof(piP)}; INT_PTR nARc = psi.PanelControl(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, &piA); OutputDebugString(L" and PANEL_PASSIVE..."); INT_PTR nPRc = psi.PanelControl(PANEL_PASSIVE, FCTL_GETPANELINFO, 0, &piP); OutputDebugString(L" Done\n"); #endif return 0; }
static void OpenPlace(HANDLE hDlg,BoardParams *DlgParams,int row,int col,CHECK_OPEN_PLACE check) { FarDialogItem DialogItem; int color; if(row<0) return; if(col<0) return; if(row>=DlgParams->width) return; if(col>=DlgParams->height) return; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,DlgParams->width*col+row,&DialogItem); if(GET_DATA_1(DialogItem)==STATE_CLOSE) { SET_DATA_1(DialogItem,STATE_OPEN); DialogItem.VBuf[1].Char=GetChar(GET_DATA_0(DialogItem),GET_DATA_1(DialogItem),&color); int bgcolor=GetBG(row,col,GET_DATA_1(DialogItem)); DialogItem.VBuf[0].Attributes.ForegroundColor=DialogItem.VBuf[1].Attributes.ForegroundColor=DialogItem.VBuf[2].Attributes.ForegroundColor=color; DialogItem.VBuf[0].Attributes.BackgroundColor=DialogItem.VBuf[1].Attributes.BackgroundColor=DialogItem.VBuf[2].Attributes.BackgroundColor=bgcolor; Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,DlgParams->width*col+row,&DialogItem); if(!GET_DATA_0(DialogItem)) { OpenPlace(hDlg,DlgParams,row-1,col-1,COP_NONE); OpenPlace(hDlg,DlgParams,row-1,col,COP_NONE); OpenPlace(hDlg,DlgParams,row-1,col+1,COP_NONE); OpenPlace(hDlg,DlgParams,row,col-1,COP_NONE); OpenPlace(hDlg,DlgParams,row,col+1,COP_NONE); OpenPlace(hDlg,DlgParams,row+1,col-1,COP_NONE); OpenPlace(hDlg,DlgParams,row+1,col,COP_NONE); OpenPlace(hDlg,DlgParams,row+1,col+1,COP_NONE); } if(check!=COP_NONE) CheckStop(hDlg,DlgParams,row,col); } else if(check==COP_CHECK_ALL&&GET_DATA_1(DialogItem)==STATE_OPEN&&GET_DATA_0(DialogItem)>0&&GET_DATA_0(DialogItem)<9) { int mines=0; mines+=GetMine(row-1,col-1,hDlg,DlgParams,true); mines+=GetMine(row-1,col,hDlg,DlgParams,true); mines+=GetMine(row-1,col+1,hDlg,DlgParams,true); mines+=GetMine(row,col-1,hDlg,DlgParams,true); mines+=GetMine(row,col+1,hDlg,DlgParams,true); mines+=GetMine(row+1,col-1,hDlg,DlgParams,true); mines+=GetMine(row+1,col,hDlg,DlgParams,true); mines+=GetMine(row+1,col+1,hDlg,DlgParams,true); if(mines==GET_DATA_0(DialogItem)) //FIXME { OpenPlace(hDlg,DlgParams,row-1,col-1,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row-1,col,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row-1,col+1,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row,col-1,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row,col+1,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row+1,col-1,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row+1,col,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row+1,col+1,COP_CHECK_STOP); CheckStop(hDlg,DlgParams,row,col); } } }
static void SetFocusUser(HANDLE hDlg,BoardParams *DlgParams,bool real) { if(real) Info.SendDlgMessage(hDlg,DM_SETFOCUS,DlgParams->width*DlgParams->curr_col+DlgParams->curr_row,0); else { int curr_elem=(int)Info.SendDlgMessage(hDlg,DM_GETFOCUS,0,0); DlgParams->curr_row=curr_elem%DlgParams->width; DlgParams->curr_col=curr_elem/DlgParams->width; } RedrawPlace(hDlg,DlgParams,true); }
static void HighlightLine(intptr_t nLine) { EditorInfo einfo = {sizeof(EditorInfo)}; Info.EditorControl(-1, ECTL_GETINFO, 0, &einfo); EditorSelect sel = {sizeof(EditorSelect)}; sel.BlockHeight=1; sel.BlockStartLine=nLine; sel.BlockStartPos=0; sel.BlockType=BTYPE_STREAM; sel.BlockWidth=einfo.WindowSizeX; Info.EditorControl(-1, ECTL_SELECT, 0, &sel); }
HANDLE WINAPI OpenW(const OpenInfo *OInfo) { static FarDialogItem DlgItems[]={ /* 0*/ {DI_DOUBLEBOX,2, 1,37, 5, {0},NULL ,NULL ,0 ,GetMsg(MTitle)}, /* 1*/ {DI_EDIT ,4, 2,34, 2, {1},PluginName,NULL ,DIF_HISTORY ,L""}, /* 2*/ {DI_CHECKBOX ,4, 3, 0, 0, {0},0 ,NULL ,0 ,GetMsg(MCase)}, /* 3*/ {DI_BUTTON ,0, 4, 0, 0, {0},0 ,NULL ,DIF_CENTERGROUP|DIF_DEFAULTBUTTON,GetMsg(MOk)}, /* 4*/ {DI_BUTTON ,0, 4, 0, 0, {0},0 ,NULL ,DIF_CENTERGROUP ,GetMsg(MCancel)} }; CFarSettings settings(PluginId); bPrevCaseSensitive = settings.Get(L"CaseSensitive", false); DlgItems[ixCaseSensitive].Selected = bPrevCaseSensitive ? 1 : 0; HANDLE hEdit = Info.DialogInit(&PluginId, &DialogId, -1, -1, 40, 7, PluginName, DlgItems, ArraySize(DlgItems), 0, 0, MyDlgProc, 0); if (hEdit == INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE; EditorInfo einfo = {sizeof(EditorInfo)}; Info.EditorControl(-1, ECTL_GETINFO, 0, &einfo); InitialLine = einfo.CurLine; InitialCol = einfo.CurPos; InitialTop = einfo.TopScreenLine; TotalLines = einfo.TotalLines; nChanges = 0; bSequentialInput = true; bLineChanged = false; ctx = SearchAlloc(); if (Info.DialogRun(hEdit)!=ixOk) UndoAll(); RemoveHighlight(); settings.Set(L"CaseSensitive", bPrevCaseSensitive); Info.DialogFree(hEdit); if (Length(PrevPattern)<MAX_PATTERN_LEN) SearchFree(ctx); else SearchHFree(ctx); SetLength(&PrevPattern,0); return INVALID_HANDLE_VALUE; }
static void FarErrorHandler(const wchar_t* s) { const wchar_t* items[]={ L"Framework Error", s, L"OK", L"Debug" }; if (Info.Message(&MainGuid, &MainGuid, FMSG_WARNING, NULL, items, 4, 2) == 1) { DebugBreak(); } }
static void RunKey(const wchar_t* Key) { MacroSendMacroText macro; memset(¯o,0,sizeof(macro)); macro.StructSize=sizeof(MacroSendMacroText); macro.SequenceText=Key; Info.MacroControl(&MainGuid,MCTL_SENDSTRING,MSSC_POST,¯o); }
DWORD WINAPI PollingThread(LPVOID lpThreadParameter) { while (WaitForSingleObject(hExit, 100)) { psi.AdvControl(&guid_PluginGuid, ACTL_SYNCHRO, 0, NULL); } return 0; }
static void ScrollText(ScrollType st) { EditorInfo einfo = {sizeof(EditorInfo)}; EditorSetPosition es = {sizeof(EditorSetPosition)}; Info.EditorControl(-1, ECTL_GETINFO, 0, &einfo); switch (st) { case stDn: es.CurLine = einfo.CurLine+1; break; case stUp: es.CurLine = einfo.CurLine-1; break; case stPgDn: es.CurLine = einfo.CurLine+einfo.WindowSizeY-1; es.TopScreenLine = einfo.TopScreenLine+einfo.WindowSizeY-1; break; case stPgUp: es.CurLine = einfo.CurLine-einfo.WindowSizeY+1; es.TopScreenLine = einfo.TopScreenLine-einfo.WindowSizeY+1; break; case stEnd: es.CurLine = /*es.TopScreenLine = */einfo.TotalLines-1; break; default: es.CurLine = /*es.TopScreenLine = */0; break; } bLineChanged = true; es.CurPos = -1; es.CurTabPos = es.LeftPos = es.Overtype = -1; Info.EditorControl(-1, ECTL_SETPOSITION, 0, &es); //обновим № исходной строки Info.EditorControl(-1, ECTL_GETINFO, 0, &einfo); char *Lines = (char*)StackPeek(); OriginalLine = CalcOriginalLine(einfo.CurLine); HighlightLine(einfo.CurLine); Info.AdvControl(&PluginId, ACTL_REDRAWALL, 0, NULL); }
static void RedrawPlace(HANDLE hDlg,BoardParams *DlgParams,bool focused) { int color; FarDialogItem DialogItem; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,DlgParams->width*DlgParams->curr_col+DlgParams->curr_row,&DialogItem); DialogItem.VBuf[1].Char=GetChar(GET_DATA_0(DialogItem),GET_DATA_1(DialogItem),&color); if(focused&&color==(FOREGROUND_RED|FOREGROUND_INTENSITY)) color=0; int bgcolor=focused?(FOREGROUND_RED|FOREGROUND_INTENSITY):(GetBG(DlgParams->curr_row,DlgParams->curr_col,GET_DATA_1(DialogItem))); DialogItem.VBuf[0].Attributes.ForegroundColor=DialogItem.VBuf[1].Attributes.ForegroundColor=DialogItem.VBuf[2].Attributes.ForegroundColor=color; DialogItem.VBuf[0].Attributes.BackgroundColor=DialogItem.VBuf[1].Attributes.BackgroundColor=DialogItem.VBuf[2].Attributes.BackgroundColor=bgcolor; }
HANDLE WINAPI OpenW(const struct OpenInfo*) { InitDialogItem InitItems[]= { //type,x1,y1,x2,y2,focus,selected,flags,default,data {DI_DOUBLEBOX,3,1,67,18,0,0,0,0,_T("Very Cool Dialog")}, {DI_USERCONTROL,4,2,66,17,0,0,0,0,_T("")}, {DI_BUTTON,3,19,0,0,0,0,0,1,_T("Ok")}, {DI_BUTTON,12,19,0,0,0,0,0,0,_T("Cancel")}, }; FarDialogItem DialogItems[sizeof(InitItems)/sizeof(InitItems[0])]; InitDialogItems(InitItems,DialogItems,sizeof(InitItems)/sizeof(InitItems[0])); FAR_CHAR_INFO *VirtualBuffer=(FAR_CHAR_INFO *)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(DialogItems[1].X2-DialogItems[1].X1+1)*(DialogItems[1].Y2-DialogItems[1].Y1+1)*sizeof(FAR_CHAR_INFO)); DialogItems[1].VBuf=VirtualBuffer; HANDLE hDlg=Info.DialogInit(&MainGuid,&DialogGuid,-1,-1,71,21,NULL,DialogItems,sizeof(DialogItems)/sizeof(DialogItems[0]),0,0,MainDialogProc,0); if(hDlg!=INVALID_HANDLE_VALUE) { Info.DialogRun(hDlg); Info.DialogFree(hDlg); } if(VirtualBuffer) HeapFree(GetProcessHeap(),0,VirtualBuffer); return NULL; }
/** Open plugin configuration of actions dialog. */ HANDLE WINAPI OpenW(const struct OpenInfo *oInfo) { switch (oInfo->OpenFrom) { case OPEN_EDITOR: editorSet->openMenu(); break; case OPEN_COMMANDLINE: { OpenCommandLineInfo *ocli =(OpenCommandLineInfo*)oInfo->Data; //file name, which we received const wchar_t *file = ocli->CommandLine; wchar_t *nfile = PathToFull(file,true); if (nfile){ if (!editorSet){ editorSet = new FarEditorSet(); } editorSet->viewFile(DString(nfile)); } delete[] nfile; } break; case OPEN_FROMMACRO: { Info.MacroControl(&MainGuid, MCTL_GETAREA, 0, NULL); OpenMacroInfo* mi=(OpenMacroInfo*)oInfo->Data; int MenuCode=-1; if (mi->Count) { switch (mi->Values[0].Type) { case FMVT_INTEGER: MenuCode=(int)mi->Values[0].Integer; break; case FMVT_DOUBLE: MenuCode=(int)mi->Values[0].Double; break; default: MenuCode = -1; } } if (MenuCode < 0) return 0; editorSet->openMenu(MenuCode-1); } break; } return 0; };
static int GetMine(int row,int col,HANDLE hDlg,BoardParams *DlgParams,bool flagged) { if(row<0) return 0; if(col<0) return 0; if(row>=DlgParams->width) return 0; if(col>=DlgParams->height) return 0; FarDialogItem DialogItem; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,col*DlgParams->width+row,&DialogItem); if(flagged) { if(GET_DATA_1(DialogItem)==STATE_MARKED) return 1; } else { if(GET_DATA_0(DialogItem)==9) return 1; } return 0; }
static void SubmitScore(BoardParams* DlgParams) { __int64 new_time=(DlgParams->end_time-DlgParams->start_time)/1000,old_time=LLONG_MAX; wchar_t ScoreKeyName[1024],PlayerKeyName[1024]; FSF.sprintf(ScoreKeyName,L"Score_%d_%d_%d",DlgParams->width,DlgParams->height,DlgParams->mines); FSF.sprintf(PlayerKeyName,L"Player_%d_%d_%d",DlgParams->width,DlgParams->height,DlgParams->mines); CFarSettings settings(MainGuid); old_time=settings.Get(ScoreKeyName,old_time); if(new_time<old_time) { wchar_t PlayerName[512]; if(Info.InputBox(&MainGuid,&PlayerGuid,GetMsg(mHighscore),NULL,NULL,NULL,PlayerName,sizeof(PlayerName),NULL,FIB_ENABLEEMPTY|FIB_BUTTONS)) { settings.Set(ScoreKeyName,new_time); settings.Set(PlayerKeyName,PlayerName); } } }
int ShowMenu(int Offset) { int Msgs[]={MComplete,MComplete,MMenuCfg,MAutoCfg}; TCHAR Bottom[30]; FSF.sprintf(Bottom,_T("[%d]"),windows->count()); FarMenuItem Items[sizeof(Msgs)/sizeof(Msgs[0])]; TCHAR ItemText[sizeof(Msgs)/sizeof(Msgs[0])][128]; for(unsigned int i=0;i<(sizeof(Msgs)/sizeof(Msgs[0]));i++) { Items[i].Flags=0; _tcscpy(ItemText[i],GetMsg(Msgs[i])); Items[i].Text=ItemText[i]; } ItemText[1][0]=0; Items[1].Flags|=MIF_SEPARATOR; int MenuCode=0,SelectedItem=0; do { Items[SelectedItem].Flags|=MIF_SELECTED; MenuCode=Info.Menu(&MainGuid,&MainMenuGuid,-1,-1,0,FMENU_AUTOHIGHLIGHT|FMENU_WRAPMODE,GetMsg(MEditCmpl),Bottom,_T("Contents"),NULL,NULL,&Items[Offset],sizeof(Msgs)/sizeof(Msgs[0])-Offset); Items[SelectedItem].Flags&=~MIF_SELECTED; SelectedItem=MenuCode; if(MenuCode>=0) MenuCode+=Offset; switch(MenuCode) { case 0: // "OK" Complete(); break; case 2: // Menu MCmpl->ShowDialog(); break; case 3: // Auto ACmpl->ShowDialog(); break; } } while(MenuCode>0); return TRUE; }
void WINAPI GetPluginInfoW(PluginInfo* info) { assert(info); info->StructSize = sizeof(PluginInfo); static const wchar_t* menu_strings[1]; menu_strings[0] = _PSI.GetMsg(&_FPG, ps_title); info->PluginConfig.Guids = &_FPG; info->PluginConfig.Strings = menu_strings; info->PluginConfig.Count = sizeof(menu_strings) / sizeof(menu_strings[0]); info->PluginMenu.Guids = &_FPG; info->PluginMenu.Strings = menu_strings; info->PluginMenu.Count = sizeof(menu_strings) / sizeof(menu_strings[0]); #ifdef _DEBUG info->Flags |= PF_PRELOAD; #endif // _DEBUG }
/** Returns message from FAR current language. */ const wchar_t *GetMsg(int msg) { return(Info.GetMsg(&MainGuid, msg)); };
static void CheckStop(HANDLE hDlg,BoardParams *DlgParams,int row,int col) { if(DlgParams->finished!=FINISH_NO) return; FarDialogItem DialogItem; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,DlgParams->width*col+row,&DialogItem); if(GET_DATA_1(DialogItem)==STATE_OPEN&&GET_DATA_0(DialogItem)==9) { Info.SendDlgMessage(hDlg,DM_SETTEXTPTR,DlgParams->width*DlgParams->height,const_cast<wchar_t*>(GetMsg(mLose))); DlgParams->finished=FINISH_LOSE; DlgParams->end_time=GetTickCount(); Beep((long)Opt.LoseFreq,100); Info.SendDlgMessage(hDlg,DM_SHOWTIME,0,NULL); } else { FarDialogItem DialogItem; bool won=true; for(int i=0;i<DlgParams->height;i++) { for(int j=0;j<DlgParams->width;j++) { int k=i*DlgParams->width+j; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,k,&DialogItem); if(GET_DATA_1(DialogItem)==STATE_CLOSE&&GET_DATA_0(DialogItem)<9) //FIXME { won=false; break; } else if(GET_DATA_1(DialogItem)==STATE_MARKED&&GET_DATA_0(DialogItem)<9) { won=false; break; } else if(GET_DATA_1(DialogItem)==STATE_OPEN&&GET_DATA_0(DialogItem)==9) { won=false; break; } } if(!won) break; } if(won) { Info.SendDlgMessage(hDlg,DM_SETTEXTPTR,DlgParams->width*DlgParams->height,const_cast<wchar_t*>(GetMsg(mWon))); DlgParams->finished=FINISH_WON; DlgParams->end_time=GetTickCount(); DlgParams->curr_mines=DlgParams->mines; Beep((long)Opt.WonFreq,100); int color; for(int i=0;i<DlgParams->height;i++) for(int j=0;j<DlgParams->width;j++) { int k=i*DlgParams->width+j; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,k,&DialogItem); if(GET_DATA_1(DialogItem)==STATE_CLOSE) { SET_DATA_1(DialogItem,STATE_MARKED); DialogItem.VBuf[1].Char=GetChar(GET_DATA_0(DialogItem),GET_DATA_1(DialogItem),&color); int bgcolor=GetBG(i,j,GET_DATA_1(DialogItem)); DialogItem.VBuf[0].Attributes.ForegroundColor=DialogItem.VBuf[1].Attributes.ForegroundColor=DialogItem.VBuf[2].Attributes.ForegroundColor=color; DialogItem.VBuf[0].Attributes.BackgroundColor=DialogItem.VBuf[1].Attributes.BackgroundColor=DialogItem.VBuf[2].Attributes.BackgroundColor=bgcolor; Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,k,&DialogItem); } } Info.SendDlgMessage(hDlg,DM_SHOWTIME,0,0); SubmitScore(DlgParams); } } }
int WINAPI _export Message(unsigned long Msg,void *InData,void *OutData) { (void)OutData; switch(Msg) { case FMMSG_GETINFO: { GetInfoOutData *data=(GetInfoOutData *)OutData; GetMsg(mName,data->MenuString); strcpy(data->HotkeyID,"ay_appendall"); data->Flags=FMMSG_MENU|FMMSG_FILTER; } return TRUE; case FMMSG_MENU: { MenuInData *dlg=(MenuInData *)InData; FarDialogItem Item; if (FarInfo.SendDlgMessage(dlg->hDlg,DM_GETDLGITEM,0,(long)&Item)) { if (!strcmp(Item.Data,GetMsg(mWarningTitle,tmp))) { if (FarInfo.SendDlgMessage(dlg->hDlg,DM_GETDLGITEM,11,(long)&Item)) { if (strstr(Item.Data,GetMsg(mAppendButton,tmp))) { AppendAll=true; FarInfo.SendDlgMessage(dlg->hDlg,DM_CLOSE,11,0); } } } } } return TRUE; case FMMSG_FILTER: { FilterInData *dlg=(FilterInData *)InData; if(dlg->Msg==DN_INITDIALOG && AppendAll) { FarDialogItem Item; if (FarInfo.SendDlgMessage(dlg->hDlg,DM_GETDLGITEM,0,(long)&Item)) { if (!strcmp(Item.Data,GetMsg(mCopyTitle,tmp)) || !strcmp(Item.Data,GetMsg(mMoveTitle,tmp))) { if (FarInfo.SendDlgMessage(dlg->hDlg,DM_GETDLGITEM,12,(long)&Item)) { if (strstr(Item.Data,GetMsg(mTreeButton,tmp))) AppendAll=false; //reset when new copy/move starts } } else if (!strcmp(Item.Data,GetMsg(mWarningTitle,tmp))) { if (FarInfo.SendDlgMessage(dlg->hDlg,DM_GETDLGITEM,11,(long)&Item)) { if (strstr(Item.Data,GetMsg(mAppendButton,tmp))) { FarInfo.SendDlgMessage(dlg->hDlg,DM_CLOSE,11,0); } } } } } } return TRUE; } return FALSE; }
static const wchar_t* GetMsg(intptr_t MsgId) { return(Info.GetMsg(&PluginId, MsgId)); }
static intptr_t GetCheck(HANDLE hDlg, intptr_t i) { return (intptr_t)Info.SendDlgMessage(hDlg, DM_GETCHECK, i, 0); }
static intptr_t WINAPI MyDlgProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void *Param2) { FarGetDialogItem DialogItem={sizeof(FarGetDialogItem)}; const INPUT_RECORD* record; switch (Msg) { case DN_CONTROLINPUT: record=(const INPUT_RECORD *)Param2; if (record->EventType==KEY_EVENT && record->Event.KeyEvent.bKeyDown && record->Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED && (record->Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED || record->Event.KeyEvent.dwControlKeyState & RIGHT_CTRL_PRESSED)) { switch (record->Event.KeyEvent.wVirtualKeyCode) { case VK_DOWN: ScrollText(stDn); return TRUE; case VK_UP: ScrollText(stUp); return TRUE; case VK_NEXT: ScrollText(stPgDn); return TRUE; case VK_PRIOR: ScrollText(stPgUp); return TRUE; case VK_END: ScrollText(stEnd); return TRUE; case VK_HOME: ScrollText(stHome); return TRUE; } } break; case DN_BTNCLICK: if (Param1==ixCaseSensitive) { bool bCaseSensitive = Param2!=0; if (bCaseSensitive!=bPrevCaseSensitive) UndoAll(); bPrevCaseSensitive = bCaseSensitive; } Filter(PrevPattern, bPrevCaseSensitive); Info.AdvControl(&PluginId, ACTL_REDRAWALL, 0, NULL); break; case DN_EDITCHANGE: DialogItem.Size = (size_t)Info.SendDlgMessage(hDlg, DM_GETDLGITEM, ixSearchString, NULL); DialogItem.Item = (FarDialogItem*)malloc(DialogItem.Size); if (DialogItem.Item) { Info.SendDlgMessage(hDlg, DM_GETDLGITEM, ixSearchString, &DialogItem); size_t nChars = wcslen(DialogItem.Item->Data); size_t nPrevChars = Length(PrevPattern); bool bFilter = true; if (PrevPattern!=NULL) { //получается ли новая строка укорачиванием старой на символ if (bSequentialInput && nChars+1 == nPrevChars && wcsncmp(DialogItem.Item->Data, PrevPattern, nChars) == 0) { //да - откатываем одну правку Undo(); bFilter = false; } else { //получается ли новая строка добавлением символа к старой if (!(nChars == nPrevChars+1 && wcsncmp(DialogItem.Item->Data, PrevPattern, nPrevChars) == 0)) { //если нет - считаем, что откатывать по одной правке нельзя bSequentialInput = false; } //можно ли искать новую строку среди уже отфильтрованных if (wcsstr(DialogItem.Item->Data, PrevPattern) == NULL) { //нет - откатываем все правки UndoAll(); } } } //выделить контекст заново при необходимости if (Length(PrevPattern)<MAX_PATTERN_LEN && nChars>=MAX_PATTERN_LEN) { SearchFree(ctx); ctx = SearchHAlloc(); } else if (Length(PrevPattern)>=MAX_PATTERN_LEN && nChars<MAX_PATTERN_LEN) { SearchHFree(ctx); ctx = SearchAlloc(); } //запомнить значение фильтра if (nChars!=0) { SetLength(&PrevPattern, (int)nChars); wcscpy(PrevPattern, DialogItem.Item->Data); } else { SetLength(&PrevPattern, 0); bSequentialInput = true; } free(DialogItem.Item); if (bFilter) Filter(PrevPattern, bPrevCaseSensitive); Info.AdvControl(&PluginId, ACTL_REDRAWALL, 0, NULL); } break; } return Info.DefDlgProc(hDlg, Msg, Param1, Param2); }
static void Filter(const wchar_t *sFilter, bool bCaseSensitive) { if (sFilter!=NULL) { size_t nFilter = wcslen(sFilter); if (nFilter>0xFFFF) nFilter = 0xFFFF; wchar_t *sFilterLower=NULL; EditorUndoRedo eur = {sizeof(EditorUndoRedo)}; EditorSetPosition es = {sizeof(EditorSetPosition)}; char *Lines; //маска удалённых строк Lines = MakeLineMask(); StackPush(Lines); if (nFilter<=MAX_PATTERN_LEN) { SearchPrepare(ctx, sFilter, bCaseSensitive); } else { SearchHPrepare(ctx, sFilter, (WORD)nFilter, bCaseSensitive); if (!bCaseSensitive) { SetLength(&sFilterLower, (int)nFilter); wcscpy(sFilterLower, sFilter); CharLower(sFilterLower); } } //непустой фильтр - создаём блок Undo и меняем текст внутри него eur.Command=EUR_BEGIN; Info.EditorControl(-1, ECTL_UNDOREDO, 0, &eur); //ищем текст из диалога в каждой строке EditorInfo einfo = {sizeof(EditorInfo)}; Info.EditorControl(-1, ECTL_GETINFO, 0, &einfo); intptr_t nLines = einfo.TotalLines; intptr_t line = nLines; es.CurPos = 0; es.CurTabPos = es.LeftPos = es.Overtype = es.TopScreenLine = -1; while (--line>=0) { es.CurLine = line; Info.EditorControl(-1, ECTL_SETPOSITION, 0, &es); EditorGetString egs = {sizeof(EditorGetString), -1}; Info.EditorControl(-1, ECTL_GETSTRING, 0, &egs); const wchar_t *found; if (nFilter <= MAX_PATTERN_LEN) found = Search(ctx, egs.StringText); else found = SearchH(ctx, bCaseSensitive ? sFilter : sFilterLower, (WORD)nFilter, egs.StringText, egs.StringLength, bCaseSensitive); if (found==NULL) { Info.EditorControl(-1, ECTL_DELETESTRING, 0, NULL); MarkDeletedLine(Lines, line); } } es.CurLine = 0; es.CurPos = 0; es.TopScreenLine = 0; es.CurTabPos = es.LeftPos = es.Overtype = -1; Info.EditorControl(-1, ECTL_SETPOSITION, 0, &es); RemoveHighlight(); eur.Command=EUR_END; Info.EditorControl(-1, ECTL_UNDOREDO, 0, &eur); nChanges++; if (nFilter<=MAX_PATTERN_LEN) { SearchUnprepare(ctx,sFilter,bCaseSensitive); } else { if (!bCaseSensitive) SetLength(&sFilterLower, 0); } } }
static void RemoveHighlight() { EditorSelect sel = {sizeof(EditorSelect)}; sel.BlockType=BTYPE_NONE; Info.EditorControl(-1, ECTL_SELECT, 0, &sel); }
static intptr_t WINAPI MainDialogProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void* Param2) { BoardParams* DlgParams=(BoardParams*)Info.SendDlgMessage(hDlg,DM_GETDLGDATA,0,0); //if(Msg==DN_KEY&&Param2==KEY_ENTER) return TRUE; switch(Msg) { case DN_INITDIALOG: Info.SendDlgMessage(hDlg,DM_RESETBOARD,0,0); SetFocus(true); break; case DN_CONTROLINPUT: { const INPUT_RECORD* record=(const INPUT_RECORD*)Param2; if(record->EventType==KEY_EVENT&&record->Event.KeyEvent.bKeyDown) { KillFocus(); if(IsNone(record)) { switch(record->Event.KeyEvent.wVirtualKeyCode) { case VK_UP: DlgParams->curr_col--; break; case VK_DOWN: DlgParams->curr_col++; break; case VK_LEFT: DlgParams->curr_row--; break; case VK_RIGHT: DlgParams->curr_row++; break; case VK_HOME: DlgParams->curr_row=0; break; case VK_END: DlgParams->curr_row=DlgParams->width-1; break; case VK_PRIOR: DlgParams->curr_col=0; break; case VK_NEXT: DlgParams->curr_col=DlgParams->height-1; break; case L' ': { Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); if(!DlgParams->finished) { if(!DlgParams->started) Info.SendDlgMessage(hDlg,DM_START_GAME,0,0); OpenPlace(hDlg,DlgParams,DlgParams->curr_row,DlgParams->curr_col,COP_CHECK_ALL); } Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); } break; case VK_DELETE: { Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); if(!DlgParams->finished) { FarDialogItem DialogItem; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,DlgParams->width*DlgParams->curr_col+DlgParams->curr_row,&DialogItem); switch(GET_DATA_1(DialogItem)) { case STATE_CLOSE: SET_DATA_1(DialogItem,STATE_MARKED); DlgParams->curr_mines++; break; case STATE_OPEN: break; case STATE_MARKED: SET_DATA_1(DialogItem,STATE_CLOSE); DlgParams->curr_mines--; break; } Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,DlgParams->width*DlgParams->curr_col+DlgParams->curr_row,&DialogItem); Info.SendDlgMessage(hDlg,DM_SHOWTIME,0,0); } Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); } break; case VK_F2: DlgParams->started=false; DlgParams->finished=FINISH_NO; Info.SendDlgMessage(hDlg,DM_SETTEXTPTR,DlgParams->width*DlgParams->height,const_cast<wchar_t*>(GetMsg(mStart))); Info.SendDlgMessage(hDlg,DM_RESETBOARD,0,0); break; case VK_F3: { wchar_t ScoreKeyName[1024],PlayerKeyName[1024]; FSF.sprintf(ScoreKeyName,L"Score_%d_%d_%d",DlgParams->width,DlgParams->height,DlgParams->mines); FSF.sprintf(PlayerKeyName,L"Player_%d_%d_%d",DlgParams->width,DlgParams->height,DlgParams->mines); CFarSettings settings(MainGuid); __int64 Score; wchar_t Name[512]; Score=settings.Get(ScoreKeyName,-1); if(!settings.Get(PlayerKeyName,Name,sizeofa(Name))) Name[0]=0; if(Score>=0&&Name[0]) { wchar_t buffer[1024]; FSF.sprintf(buffer,GetMsg(mHighscoreFormat),Name,(long)Score); const wchar_t* MsgItems[]={GetMsg(mHighscoreTitle),buffer,GetMsg(mOk)}; Info.Message(&MainGuid,&HiscoreGuid,0,NULL,MsgItems,sizeofa(MsgItems),1); } } break; } } if(DlgParams->curr_row>=DlgParams->width) DlgParams->curr_row=0; if(DlgParams->curr_row<0) DlgParams->curr_row=DlgParams->width-1; if(DlgParams->curr_col>=DlgParams->height) DlgParams->curr_col=0; if(DlgParams->curr_col<0) DlgParams->curr_col=DlgParams->height-1; SetFocus(true); Info.SendDlgMessage(hDlg,DM_REDRAW,0,0); } else if(record->EventType==MOUSE_EVENT) { DWORD Buttons=record->Event.MouseEvent.dwButtonState; if(Buttons&FROM_LEFT_1ST_BUTTON_PRESSED) RunKey(L"Keys([[Space]])"); else if(Buttons&RIGHTMOST_BUTTON_PRESSED) RunKey(L"Keys([[Del]])"); } } break; case DN_GOTFOCUS: SetFocus(false); break; case DN_KILLFOCUS: KillFocus(); break; case DM_RESETBOARD: { int curr_mines=DlgParams->mines,color; FarDialogItem DialogItem; Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); for(int i=0;i<DlgParams->height;i++) for(int j=0;j<DlgParams->width;j++) { int k=i*DlgParams->width+j; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,k,&DialogItem); SET_DATA_0(DialogItem,0); SET_DATA_1(DialogItem,0); color=0; DialogItem.VBuf[1].Char=GetChar(GET_DATA_0(DialogItem),GET_DATA_1(DialogItem),&color); int bgcolor=GetBG(i,j,STATE_CLOSE); DialogItem.VBuf[0].Attributes.ForegroundColor=DialogItem.VBuf[1].Attributes.ForegroundColor=DialogItem.VBuf[2].Attributes.ForegroundColor=color; DialogItem.VBuf[0].Attributes.BackgroundColor=DialogItem.VBuf[1].Attributes.BackgroundColor=DialogItem.VBuf[2].Attributes.BackgroundColor=bgcolor; Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,k,&DialogItem); } //set mines while(curr_mines) for(int i=0;i<DlgParams->height;i++) for(int j=0;j<DlgParams->width;j++) { int k=i*DlgParams->width+j; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,k,&DialogItem); if(curr_mines&&(!GET_DATA_0(DialogItem))) { if(rand()<=(RAND_MAX*DlgParams->mines/(DlgParams->width*DlgParams->height))) { curr_mines--; SET_DATA_0(DialogItem,9); Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,k,&DialogItem); } } } //set places for(int i=0;i<DlgParams->height;i++) for(int j=0;j<DlgParams->width;j++) { int k=i*DlgParams->width+j; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,k,&DialogItem); if(GET_DATA_0(DialogItem)==0) { SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j-1,i-1,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j-1,i,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j-1,i+1,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j,i-1,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j,i+1,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j+1,i-1,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j+1,i,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j+1,i+1,hDlg,DlgParams,false)); Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,k,&DialogItem); } } DlgParams->curr_mines=0; Info.SendDlgMessage(hDlg,DM_SHOWTIME,0,0); Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); } break; case DN_ENTERIDLE: Info.SendDlgMessage(hDlg,DM_SHOWTIME,0,0); break; case DM_SHOWTIME: { wchar_t buffer[1024]; DWORD diff_time=DlgParams->started?((DlgParams->finished?DlgParams->end_time:GetTickCount())-DlgParams->start_time)/1000:0; FSF.sprintf(buffer,GetMsg(mTime),diff_time,DlgParams->curr_mines); Info.SendDlgMessage(hDlg,DM_SETTEXTPTR,DlgParams->width*DlgParams->height+1,buffer); } break; case DM_START_GAME: Info.SendDlgMessage(hDlg,DM_SETTEXTPTR,DlgParams->width*DlgParams->height,const_cast<wchar_t*>(GetMsg(mGame))); DlgParams->started=true; DlgParams->start_time=GetTickCount(); break; } return Info.DefDlgProc(hDlg,Msg,Param1,Param2); }
const wchar_t* GetMsg(int MsgId) { return(Info.GetMsg(&MainGuid,MsgId)); }
HANDLE WINAPI OpenW(const OpenInfo* info) { if (!info || info->StructSize < sizeof(OpenInfo)) return nullptr; //Determine file name to analyze wstring file_name; if (info->OpenFrom == OPEN_COMMANDLINE && info->Data) { const OpenCommandLineInfo* ocli = reinterpret_cast<const OpenCommandLineInfo*>(info->Data); if (!ocli || ocli->StructSize < sizeof(OpenCommandLineInfo) || !ocli->CommandLine || !ocli->CommandLine[0]) return nullptr; //Get command line wstring cmd_line = ocli->CommandLine; size_t pos = 0; while ((pos = cmd_line.find(L'\"', pos)) != string::npos) cmd_line.erase(pos, 1); while (!cmd_line.empty() && iswspace(cmd_line[0])) cmd_line.erase(0, 1); while (!cmd_line.empty() && iswspace(cmd_line[cmd_line.length() - 1])) cmd_line.erase(cmd_line.length() - 1, 1); if (cmd_line.empty()) return nullptr; //Expand environment variables in path string wstring exp_path(2048, 0); if (ExpandEnvironmentStrings(cmd_line.c_str(), &exp_path.front(), static_cast<DWORD>(exp_path.size() - 1))) exp_path.resize(lstrlen(exp_path.c_str())); else exp_path = cmd_line; const size_t path_len = _FSF.ConvertPath(CPM_FULL, exp_path.c_str(), nullptr, 0); if (path_len) { file_name.resize(path_len); _FSF.ConvertPath(CPM_FULL, exp_path.c_str(), &file_name[0], path_len); } } else if (info->OpenFrom == OPEN_PLUGINSMENU) { PanelInfo pi; ZeroMemory(&pi, sizeof(pi)); pi.StructSize = sizeof(pi); if (!_PSI.PanelControl(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, &pi)) return nullptr; const intptr_t ppi_len = _PSI.PanelControl(PANEL_ACTIVE, FCTL_GETPANELITEM, static_cast<int>(pi.CurrentItem), nullptr); if (ppi_len == 0) return nullptr; vector<unsigned char> buffer(ppi_len); PluginPanelItem* ppi = reinterpret_cast<PluginPanelItem*>(&buffer.front()); FarGetPluginPanelItem fgppi; ZeroMemory(&fgppi, sizeof(fgppi)); fgppi.StructSize = sizeof(fgppi); fgppi.Size = buffer.size(); fgppi.Item = ppi; if (!_PSI.PanelControl(PANEL_ACTIVE, FCTL_GETPANELITEM, static_cast<int>(pi.CurrentItem), &fgppi)) return nullptr; const size_t file_name_len = _FSF.ConvertPath(CPM_FULL, ppi->FileName, nullptr, 0); if (file_name_len) { file_name.resize(file_name_len); _FSF.ConvertPath(CPM_FULL, ppi->FileName, &file_name[0], file_name_len); } } if (!file_name.empty()) { unlocker u; u.process(file_name.c_str()); } return nullptr; }
HANDLE WINAPI OpenW(const struct OpenInfo *Info) { const int CUR_DIR_SIZE = 100000; char* filename = 0; switch( Info->OpenFrom ) { case OPEN_COMMANDLINE: { OpenCommandLineInfo* cinfo = (OpenCommandLineInfo*)Info->Data; const wchar_t* cmdline = cinfo->CommandLine; if( !cmdline ) return INVALID_HANDLE_VALUE; while( *cmdline && *cmdline <= ' ' ) cmdline++; if( *cmdline ) filename = w2a( cmdline ); else return 0; break; } case OPEN_PLUGINSMENU: { FarGetPluginPanelItem pinfo; PluginPanelItem* pitem = (PluginPanelItem*)malloc(CUR_DIR_SIZE); ZeroMemory(&pinfo, sizeof(pinfo)); ZeroMemory(pitem, CUR_DIR_SIZE); pinfo.StructSize = sizeof(pinfo); pinfo.Size = CUR_DIR_SIZE; pinfo.Item = pitem; if(InfoW.PanelControl( PANEL_ACTIVE, FCTL_GETCURRENTPANELITEM, 0, &pinfo )) { filename = w2a( pinfo.Item->FileName ); free(pitem); } else { free(pitem); return 0; } break; } default: return 0; } if( !filename ) return 0; wchar_t comspec[MAX_PATH * 2]; if( !GetEnvironmentVariableW( L"COMSPEC", comspec, sizeofa( comspec ) ) ) lstrcpyW( comspec, L"cmd.exe" ); char pipename[100]; wsprintf( pipename, "\\\\.\\pipe\\FarCall%ul", GetCurrentProcessId() ); char* batchstr = (char*)malloc( 10000 ); wsprintf( batchstr, batch, filename, ModuleName, pipename ); // obtaining temp file name wchar_t tmp[MAX_PATH * 10]; GetTempPathW( sizeofa( tmp ), tmp ); GetTempFileNameW( tmp, L"", 0, tmp ); DeleteFileW( tmp ); lstrcatW( tmp, L".bat" ); HANDLE file = CreateFileW( tmp, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0 ); if( !file || file == INVALID_HANDLE_VALUE ) { DeleteFileW( tmp ); free( filename ); free( batchstr ); return INVALID_HANDLE_VALUE; } DWORD written; WriteFile( file, batchstr, lstrlen( batchstr ), &written, 0 ); CloseHandle( file ); wchar_t cmd[MAX_PATH * 10] = L"\""; lstrcatW( lstrcatW( lstrcatW( lstrcatW( cmd, comspec ), L"\" /c \"" ), tmp ), L"\""); STARTUPINFOW sinfo; ZeroMemory( &sinfo, sizeof( sinfo ) ); sinfo.cb = sizeof( sinfo ); PROCESS_INFORMATION pinfo; Handle np( CreateNamedPipe( pipename, PIPE_ACCESS_DUPLEX, PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 100, 100, 0, 0 ) ); connected = false; DWORD id; Handle thread( CreateThread( 0, 0, ListenEnv, np, 0, &id ) ); while( !connected ) Sleep( 100 ); CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo( GetStdHandle( STD_OUTPUT_HANDLE ), &csbi ); #ifndef LIGHTGRAY #define LIGHTGRAY 7 #endif wchar_t Blank[1024]; FSFW.sprintf(Blank,L"%*s",csbi.dwSize.X,L""); FarColor fc = {FCF_NONE, LIGHTGRAY, 0, 0}; for (int Y=0;Y<csbi.dwSize.Y;Y++) InfoW.Text(0,Y,&fc,Blank); InfoW.Text(0,0,0,NULL); COORD C; C.X=0; C.Y=csbi.dwCursorPosition.Y; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), C ); wchar_t* curr_dir = (wchar_t*)malloc(CUR_DIR_SIZE); FSFW.GetCurrentDirectory(CUR_DIR_SIZE, curr_dir); if( np && CreateProcessW( NULL, cmd, 0, 0, TRUE, 0, 0, curr_dir[0] ? curr_dir : 0, &sinfo, &pinfo ) ) { HANDLE ar[] = {pinfo.hProcess, np}; WaitForMultipleObjects( 2, ar, TRUE, INFINITE ); CloseHandle(pinfo.hProcess); CloseHandle(pinfo.hThread); SMALL_RECT src; COORD dest; CHAR_INFO fill; src.Left=0; src.Top=2; src.Right=csbi.dwSize.X; src.Bottom=csbi.dwSize.Y; dest.X=dest.Y=0; fill.Char.AsciiChar=' '; fill.Attributes=7; ScrollConsoleScreenBuffer( GetStdHandle( STD_OUTPUT_HANDLE ), &src, NULL, dest, &fill); InfoW.AdvControl(0, ACTL_REDRAWALL, 0, 0); } else Handle onp( CreateFile( pipename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 ) ); free( filename ); free( batchstr ); free( curr_dir ); DeleteFileW( tmp ); return 0; }