WindowInfo

Programming Far Manager plugins

WindowInfo

Структура WindowInfo содержит информацию о конкретном окне Far Manager. Плагин может получить информацию, используя команду ACTL_GETWINDOWINFO.
struct WindowInfo
{
  size_t StructSize;
  intptr_t Id;
  wchar_t *TypeName;
  wchar_t *Name;
  intptr_t TypeNameSize;
  intptr_t NameSize;
  intptr_t Pos;
  enum WINDOWINFO_TYPE Type;
  WINDOWINFO_FLAGS Flags;
};

Элементы

StructSize
Это поле должно содержать размер структуры WindowInfo. Перед использованием структуры плагин должен заполнить поле.
Id
Это поле содержит для диалога описатель, для программы просмотра и редактора - ID.
TypeName
Имя типа окна (Panels,View,Edit,Help,VMenu), зависит от текущего языка.
Name
Имя окна. Для окон типа WTYPE_VIEWER, WTYPE_EDITOR содержит имя файла.
Для панелей - имя текущего файлового объекта.
Для окна помощи - полный путь к просматриваемому HLF-файлу.
Для диалогов и меню - заголовок.
TypeNameSize
Размер буфера TypeName в символах, с учётом завершающего '\0'.
NameSize
Размер буфера Name в символах, с учётом завершающего '\0'.
Pos
Номер окна, о котором нужно узнать информацию. Нумерация идёт с 0. Pos = -1 вернёт информацию о текущем окне.
Type
Тип окна. Может иметь одно из следующих значений (перечисление WINDOWINFO_TYPE):
ТипОписание
WTYPE_PANELS файловые панели
WTYPE_VIEWER окно встроенной программы просмотра
WTYPE_EDITOR окно встроенного редактора
WTYPE_DIALOG диалог
WTYPE_VMENU меню
WTYPE_HELP окно подсказки
Flags
Могут быть комбинацией следующих значений (тип WINDOWINFO_FLAGS):
ТипОписание
WIF_MODIFIED признак модификации содержимого файла в окне, может быть только у WTYPE_EDITOR
WIF_CURRENT признак, является ли окно текущим
WIF_MODAL признак, является ли окно модальным

Пример

void GetFarWindowInfo()
{
  WindowInfo WInfo={sizeof(WindowInfo)};
  int CountWindow;
  int I;
  FILE *Fp;

  if((Fp=_wfopen(L"window.log",L"a+t")) == NULL)
      return ;

  // запросили число окон
  CountWindow=(int)Info.AdvControl(Info.ModuleNumber,ACTL_GETWINDOWCOUNT,0,NULL);
  fwprintf(Fp,L"WindowCount=%i\n",CountWindow);

  for ( I=0; I < CountWindow; I++ )
  {
    // установили нужный номер
    WInfo.Pos=I;

    WInfo.TypeName=NULL;
    WInfo.Name=NULL;

    // запросили информацию об размере буферов
    Info.AdvControl(Info.ModuleNumber,ACTL_GETWINDOWINFO,0,(void*)&WInfo);

    WInfo.TypeName=(wchar_t *) malloc(WInfo.TypeNameSize);
    WInfo.Name=(wchar_t *) malloc(WInfo.NameSize);

    // запросили информацию
    Info.AdvControl(Info.ModuleNumber,ACTL_GETWINDOWINFO,0,(void*)&WInfo);
    
    // распечатали её
    fwprintf(Fp,L"Window[%i], Type=%i (%s), File=[%s] Current=%i, Modified=%i\n",
               I,WInfo.Type,WInfo.TypeName,WInfo.Name,
               WInfo.Current,WInfo.Modified);
    
    free(WInfo.TypeName);
    free(WInfo.Name);

 }
  fclose(Fp);

  // установили окно номер 1 (то есть второе)
  Info.AdvControl(Info.ModuleNumber,ACTL_SETCURRENTWINDOW,0,(void*)1);
}
Смотрите также: