Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
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);
    }
  }
}
Esempio n. 5
0
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);
}
Esempio n. 6
0
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);
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
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();
	}
}
Esempio n. 9
0
static void RunKey(const wchar_t* Key)
{
  MacroSendMacroText macro;
  memset(&macro,0,sizeof(macro));
  macro.StructSize=sizeof(MacroSendMacroText);
  macro.SequenceText=Key;
  Info.MacroControl(&MainGuid,MCTL_SENDSTRING,MSSC_POST,&macro);
}
Esempio n. 10
0
DWORD WINAPI PollingThread(LPVOID lpThreadParameter)
{
	while (WaitForSingleObject(hExit, 100))
	{
		psi.AdvControl(&guid_PluginGuid, ACTL_SYNCHRO, 0, NULL);
	}
	return 0;
}
Esempio n. 11
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);
}
Esempio n. 12
0
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;
}
Esempio n. 13
0
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;
}
Esempio n. 14
0
/**
  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;
};
Esempio n. 15
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;
}
Esempio n. 16
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);
    }
  }
}
Esempio n. 17
0
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;
}
Esempio n. 18
0
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
}
Esempio n. 19
0
/**
  Returns message from FAR current language.
*/
const wchar_t *GetMsg(int msg)
{
  return(Info.GetMsg(&MainGuid, msg));
};
Esempio n. 20
0
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);
    }
  }
}
Esempio n. 21
0
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;
}
Esempio n. 22
0
static const wchar_t* GetMsg(intptr_t MsgId)
{
	return(Info.GetMsg(&PluginId, MsgId));
}
Esempio n. 23
0
static intptr_t GetCheck(HANDLE hDlg, intptr_t i)
{
	return (intptr_t)Info.SendDlgMessage(hDlg, DM_GETCHECK, i, 0);
}
Esempio n. 24
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);
}
Esempio n. 25
0
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);
		}
	}
}
Esempio n. 26
0
static void RemoveHighlight()
{
	EditorSelect sel = {sizeof(EditorSelect)};
	sel.BlockType=BTYPE_NONE;
	Info.EditorControl(-1, ECTL_SELECT, 0, &sel);
}
Esempio n. 27
0
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);
}
Esempio n. 28
0
const wchar_t* GetMsg(int MsgId)
{
  return(Info.GetMsg(&MainGuid,MsgId));
}
Esempio n. 29
0
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;
}
Esempio n. 30
0
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;
}