View Issue Details

IDProjectCategoryView StatusLast Update
0002307Far ManagerMacropublic2013-06-12 21:33
ReportershmuelAssigned Toshmuel 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Platformx86OSWindowsOS VersionXP SP3
Product Version3.0 
Target Version3.0Fixed in Version3.0 
Summary0002307: При вызове msgbox из condition(), ключ закрытия msgbox передаётся дальше (не съедается)
DescriptionПроявляется при вызове редакторного макроса, при наличии стандартного плагина "Auto wrap", у которого активизирован чекбокс "Enable auto wrap".

Следующий макрос должен быть заранее установлен:
Macro {
  area="Editor"; key="CtrlF1"; flags="DisableOutput";
  condition=function() msgbox() end;
  action=function() end;
}
Steps To Reproduce1. Нажимаем CtrlF1 в редакторе, появляется message-box.
2. Нажимаем Esc или Enter, message-box закрывается, но редактор ведёт себя так, как будто Esc (или Enter) были нажаты в нём.
TagsNo tags attached.
Build3446

Activities

shmuel

2013-03-14 18:14

developer   bugnote:0010520

То же самое с диалоговым макросом: при закрытии msgbox закрывающая клавиша передаётся в диалог.

2useven10

2013-03-15 20:44

developer   bugnote:0010521

если wrap включен, то в редактор данные попадают из плагина (ProcessEditorInput).

получается приблизительно так:

FileEditor::ReprocessKey(KEY_CTRLF1, CalledFromMacro)
{
...
//fileedit.cpp #940
   ProcessedNext=!ProcessEditorInput(FrameManager->GetLastInputRecord());
}

LastInputRecord к этому времени - то что было нажато в msgbox().

2useven10

2013-03-18 09:48

developer   bugnote:0010539

лечится, например так (macro.cpp #3649):

    auto last_input = *FrameManager->GetLastInputRecord();
    int Result=pluginapi::apiMessageFn(&FarGuid,&FarGuid,Flags,nullptr,(const wchar_t * const *)TempBuf.CPtr(),0,0)+1;
    *FrameManager->GetLastInputRecord() = last_input;

насколько корректно такое лечение - не знаю...

shmuel

2013-03-18 10:54

developer   bugnote:0010540

Last edited: 2013-03-18 10:58

View 2 revisions

Это лечит (не проверял) только msgbox. А проблема наблюдается также и с prompt, Menu.Show, far.Message, far.Dialog, far.Menu, far.InputBox.

2useven10

2013-03-18 11:45

developer   bugnote:0010541

причина везде скорее всего одна - изменение LastInputRecord, как побочный эффект
любой интерактивности в condition().
Простой способ (предположительно, т.к. деталей не знаю) - добавить код аналогичный приведенному ранее в начало/конец (до/после) condition().
Или менять работу разнообразных ProcessXXXX, чтобы они от этого не зависели,
imho это более трудоёмко.
Ну или не делать condition() интерактивным...

shmuel

2013-06-10 03:13

developer   bugnote:0011114

3446.

Issue History

Date Modified Username Field Change
2013-02-17 15:35 shmuel New Issue
2013-03-14 18:14 shmuel Note Added: 0010520
2013-03-14 18:16 shmuel Summary При вызове msgbox из condition(), ключ закрытия msgbox может передаваться дальше в редактор => При вызове msgbox из condition(), ключ закрытия msgbox передаётся дальше (не съедается)
2013-03-15 20:44 2useven10 Note Added: 0010521
2013-03-18 09:48 2useven10 Note Added: 0010539
2013-03-18 10:54 shmuel Note Added: 0010540
2013-03-18 10:58 shmuel Note Edited: 0010540 View Revisions
2013-03-18 11:45 2useven10 Note Added: 0010541
2013-06-10 03:08 shmuel Assigned To => shmuel
2013-06-10 03:08 shmuel Status new => assigned
2013-06-10 03:13 shmuel Note Added: 0011114
2013-06-10 03:13 shmuel Status assigned => feedback
2013-06-12 21:33 shmuel Build => 3446
2013-06-12 21:33 shmuel Status feedback => closed
2013-06-12 21:33 shmuel Resolution open => fixed
2013-06-12 21:33 shmuel Fixed in Version => 3.0