Проблемы оконного менеджера

Здесь можно сообщить о найденных багах в Far.
User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: Проблемы оконного менеджера

Post by NightRoman » Thu 10 Jul, 2014 19:58

Latest post of the previous page:

Скрипт добавил в тесты. Подобный баг больше не просочится.

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: Проблемы оконного менеджера

Post by NightRoman » Fri 11 Jul, 2014 05:56

В 3993 перестал работать один тест в PowerShellFar, скрипт прилагается. Запуcкается немного необычно, командой
ps: Invoke-FarStepper путь\Test-Viewer-1Simple!.ps1

В пошаговом режиме можно запускать с ключем -Ask:
ps: Invoke-FarStepper путь\Test-Viewer-1Simple!.ps1 -Ask

Это так называемый супер-макрос, последовательность макросов и кусков ПШ, которые проверяют результаты. Такой тип скриптов позволяет проигрывать и тестировать интерактивные сценарии, которые иным способом трудно программируются.

Что делает скрипт (можно в пошаговом режиме это подробно видеть):
- идет в панелях на файл ...\FarNet\FarNet.Settings.dll
- открывает его во вьюере
- проверяет имя файла во вьюере
- вызывает num+, т.е. переход на следующий файл в панелях во вьюере, это файл FarNet.Settings.xml (полагаем, что он следующий в панелях, конечно)

В итоге файл FarNet.Settings.xml отрывается во вьюере, но имя файла по АПИ не меняется, получаем опять FarNet.Settings.dll. В 3992 и ранее все было нормально.

В архиве 2 теста. Один упрощенный, другой полный, во втором также проверяется, что ожидаемые события происходят.

Принцип работы супер-макросов. Между всеми шагами движок посылает Фару макрос перевызова Фарнет через F11. Когда Фарнет вызывается в этом режиме, он исполняет текущий шаг (макрос или кусок кода) и опять ставит в очередь себя и следующий шаг. Пока очередь шагов не закончится.
Attachments
test.7z
(771 Bytes) Downloaded 41 times

User avatar
zg
zero-gravity
Posts: 5540
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 85 times
Contact:

Re: Проблемы оконного менеджера

Post by zg » Fri 11 Jul, 2014 20:28

$Far.Viewer.FileName наверное только в VE_READ заполняется.

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: Проблемы оконного менеджера

Post by NightRoman » Fri 11 Jul, 2014 21:16

3995 все ОК, остальные тесты тоже. Спасибо.

User avatar
John Doe
Бюрократ
Posts: 12208
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

Re: LuaMacro — Lua как язык макросов

Post by John Doe » Mon 14 Jul, 2014 09:34

  1. far.Show() -- or far.Message""
  2. far.AdvControl "ACTL_GETWINDOWINFO"
При наличии такого скрипта LuaMacro падает, если фар запущен с опциями /v или /e


User avatar
John Doe
Бюрократ
Posts: 12208
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

Несинхронная обработка сообщений

Post by John Doe » Mon 14 Jul, 2014 12:43

  1. local F = far.Flags
  2. local n
  3. Event{
  4.   group="EditorEvent";
  5.   action=function(id,Event)
  6.     if Event==F.EE_READ then
  7.       n=nil
  8.       --far.Show("EE_READ",id)
  9.       n=1
  10.     elseif Event==F.EE_GOTFOCUS then
  11.       assert(n,"EE_GOTFOCUS")
  12.     end
  13.   end
  14. }
При открытии редактора первым должно обрабатываться сообщение EE_READ, затем EE_GOTFOCUS.
В примере выше так и происходит, поэтому на момент EE_GOTFOCUS значение n уже инициализировано.

Теперь раскомментирую строку 8 (far.Show), и пробую открыть редактор.
В этот раз выскакивает ошибка EE_GOTFOCUS и только затем меню, выводимое far.Show.

В связи с этим возникают такие вопросы:
- играет ли какую-то роль, что это lua-скрипт, или то же самое происходит и при прямом использовании C API?
- асинхронность может возникуть только при выводе меню/диалогов? Или есть и другие "опасные" функции апи?

P.S.
Если вместо меню выводить Message, то EE_GOTFOCUS вообще не возникает: http://bugs.farmanager.com/view.php?id=2733#c12740

Update
0002738.

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: Проблемы оконного менеджера

Post by NightRoman » Mon 14 Jul, 2014 13:42

Еще одна проблема, думаю, что появилась с изменениями в оконном механизме.

Скрипт PowerShellFar прилагается. Запускается командой:
ps: Invoke-FarStepper путь\Test-Editor.Open.Two!.ps1

Примечание: это тоже супер-макрос, как до этого. Если превратить его в обычный синхронный скрипт (открыть редактор 1, диалог, открыть редактор 2), то проблема не наблюдается.

Что делается и что происходит:
- открываем редактор 1, в EE_READ EditorID равен 0 - OK
- открываем диалог плагина, наверное, неважно какой (но Фар мессадж не годится), закрываем его
- открываем редактор 2, в EE_READ EditorID опять равен 0 - плохо, у нас уже есть открытый редактор с этим ИД
Attachments
Test-Editor.Open.Two!.ps1.7z
(369 Bytes) Downloaded 43 times

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: Проблемы оконного менеджера

Post by NightRoman » Mon 14 Jul, 2014 13:54

Примечание. Скрипт придуман искусственно, сама проблема была замечена в таком виде:
- есть отрытый редактор 1
- есть модуль Фарнет типа "продвинутая история", он показывает диалог со списком файлов
- из этого списка выбираем файл и он окрывается в редакторе 2 -- далее ошибка в Фарнет, код там не ожидает дублированных ИД (вернее, проблема даже в другом - Фарнет не регистрирует у себя открываемый редактор с правильным ИД, а потом идут события с правильным ИД, который не был зарегистрирован при открытии.)

Это напоминает Симптом 2 из самого первого сообщения:
http://forum.farmanager.com/viewtopic.p ... 26#p120526

Там было невнятно изложено и пока забыто, так как другие проблемы были важней.

User avatar
zg
zero-gravity
Posts: 5540
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 85 times
Contact:

Re: Проблемы оконного менеджера

Post by zg » Mon 14 Jul, 2014 21:28

NightRoman wrote:Что делается и что происходит:
- открываем редактор 1, в EE_READ EditorID равен 0 - OK
- открываем диалог плагина, наверное, неважно какой (но Фар мессадж не годится), закрываем его
- открываем редактор 2, в EE_READ EditorID опять равен 0 - плохо, у нас уже есть открытый редактор с этим ИД
такой вот макрос:результат:

Code: Select all

LUA: 0
LUA: 1

User avatar
zg
zero-gravity
Posts: 5540
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 85 times
Contact:

Re: LuaMacro — Lua как язык макросов

Post by zg » Tue 15 Jul, 2014 10:58

John Doe wrote:При наличии такого скрипта LuaMacro падает, если фар запущен с опциями /v или /e
luamacro тут не причём, это оконный менеджер.

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: Проблемы оконного менеджера

Post by NightRoman » Wed 16 Jul, 2014 10:51

zg wrote:результат:

Code: Select all

LUA: 0
LUA: 1
Не совсем понял. Можно пояснить, что это означает?

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: Проблемы оконного менеджера

Post by NightRoman » Wed 16 Jul, 2014 11:30

А, понял, что это означает. Да, неверно изложил ситуацию. Верно будет так:

Что делается и что происходит:
- открываем редактор 1, в EE_READ вызываем ECTL_GETINFO, где в результате EditorID равен 0 - OK
- открываем диалог плагина, наверное, неважно какой (но Фар мессадж не годится), закрываем его
- открываем редактор 2, в EE_READ вызываем ECTL_GETINFO, где EditorID опять равен 0 - плохо, у нас уже есть открытый редактор с этим ИД

Может, это не баг. Может, некорректно считается вызывать ECTL_GETINFO в EE_READ. Раньше работало. И теперь работает в некоторых случаях. В описанном не работает.

User avatar
John Doe
Бюрократ
Posts: 12208
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

Re: Проблемы оконного менеджера

Post by John Doe » Wed 16 Jul, 2014 11:42

А в EditorControl вы передаёте -1 или реальный EditorId?

Хотя на первый взгляд в обоих случаях результат одинаков:

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: Проблемы оконного менеджера

Post by NightRoman » Wed 16 Jul, 2014 11:51

John Doe wrote:А в EditorControl вы передаёте -1 или реальный EditorId?

Хотя на первый взгляд в обоих случаях результат одинаков:
Передаю -1, то есть "текущий" редактор.

Кстати, раньше вроде только для -1 это и работало. А сейчас можно ли в EditorControl передавать реальный ИД редактора и работать даже с неактивным редактором? Было бы неплохо, конечно.

User avatar
John Doe
Бюрократ
Posts: 12208
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 32 times
Been thanked: 162 times

Re: Проблемы оконного менеджера

Post by John Doe » Wed 16 Jul, 2014 11:55

Попробуйте передавать реальный EditorId.

Или хотя бы установить приложенный макрос и повторить проблемный сценарий.
Если вылезет ошибка, значит проблема в этом.

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: Проблемы оконного менеджера

Post by NightRoman » Wed 16 Jul, 2014 12:05

John Doe wrote:Попробуйте передавать реальный EditorId.
Побробую. Но надо все равно выяснить почему для -1 не работает. Если просто новые правила - это одно, если баг - другое.
John Doe wrote:Или хотя бы установить приложенный макрос и повторить проблемный сценарий.
Если вылезет ошибка, значит проблема в этом.
Да, первый ассерт дает ошибку.

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

Re: Проблемы оконного менеджера

Post by NightRoman » Thu 17 Jul, 2014 10:41

Если открыть два редактора из уже открытого редактора и закрыть их в порядке открытия (это важно), то окажемся не в начальном редакторе, как ожидается, а в панелях. Если закрывать сначала второй, потом первый, то окажемся в начальном редакторе (это ожиданно и работает).

Обнаружил PowerShellFar скриптом (прикреплен). Запускать так:
- открыть какой-нибудь файл в редакторе
- будучи в редакторе выполнить F11 \ PowerShellFar \ Invoke commands
- в появившемся диалоге набрать путь скрипта C:\tmp\Test-Editor-Open-2-From-Editor-.ps1
- энтер, в итоге оказываемся в панелях

Попробовал что-то похожее изобразить на Lua (ниже). Но что-то не так, наверное, делаю. Во-первых, не знаю, как сначала закрыть первый редактор ("a"), а потом второй ("b"). Ладно, пробую закрыть хотя бы двумя Quit() подряд, но они не делают то, что мне хочется, редактор "a" остается открытым.

Code: Select all

Macro {
area="Editor"; key="CtrlAltP"; description="Test: open 2 editors, close them"; action=function()
local F=far.Flags
editor.Editor("a",nil,0,0,-1,-1,bit64.bor(F.EF_NONMODAL,F.EF_CREATENEW,F.EF_IMMEDIATERETURN))
editor.Editor("b",nil,0,0,-1,-1,bit64.bor(F.EF_NONMODAL,F.EF_CREATENEW,F.EF_IMMEDIATERETURN))
editor.Quit()
editor.Quit()
end;
}
Attachments
Test-Editor-Open-2-From-Editor-.ps1.7z
(253 Bytes) Downloaded 51 times

Post Reply

Return to “Глюки и баги”