View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002307 | Far Manager | Macro | public | 2013-02-17 11:35 | 2013-06-12 18:33 |
Reporter | shmuel | Assigned To | shmuel | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Platform | x86 | OS | Windows | OS Version | XP SP3 |
Product Version | 3.0 | ||||
Target Version | 3.0 | Fixed in Version | 3.0 | ||
Summary | 0002307: При вызове 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 Reproduce | 1. Нажимаем CtrlF1 в редакторе, появляется message-box. 2. Нажимаем Esc или Enter, message-box закрывается, но редактор ведёт себя так, как будто Esc (или Enter) были нажаты в нём. | ||||
Tags | No tags attached. | ||||
Build | 3446 | ||||
|
То же самое с диалоговым макросом: при закрытии msgbox закрывающая клавиша передаётся в диалог. |
|
если wrap включен, то в редактор данные попадают из плагина (ProcessEditorInput). получается приблизительно так: FileEditor::ReprocessKey(KEY_CTRLF1, CalledFromMacro) { ... //fileedit.cpp #940 ProcessedNext=!ProcessEditorInput(FrameManager->GetLastInputRecord()); } LastInputRecord к этому времени - то что было нажато в msgbox(). |
|
лечится, например так (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; насколько корректно такое лечение - не знаю... |
|
Это лечит (не проверял) только msgbox. А проблема наблюдается также и с prompt, Menu.Show, far.Message, far.Dialog, far.Menu, far.InputBox. |
|
причина везде скорее всего одна - изменение LastInputRecord, как побочный эффект любой интерактивности в condition(). Простой способ (предположительно, т.к. деталей не знаю) - добавить код аналогичный приведенному ранее в начало/конец (до/после) condition(). Или менять работу разнообразных ProcessXXXX, чтобы они от этого не зависели, imho это более трудоёмко. Ну или не делать condition() интерактивным... |
|
3446. |
Date Modified | Username | Field | Change |
---|---|---|---|
2013-02-17 11:35 | shmuel | New Issue | |
2013-03-14 14:14 | shmuel | Note Added: 0010520 | |
2013-03-14 14:16 | shmuel | Summary | При вызове msgbox из condition(), ключ закрытия msgbox может передаваться дальше в редактор => При вызове msgbox из condition(), ключ закрытия msgbox передаётся дальше (не съедается) |
2013-03-15 16:44 | 2useven10 | Note Added: 0010521 | |
2013-03-18 05:48 | 2useven10 | Note Added: 0010539 | |
2013-03-18 06:54 | shmuel | Note Added: 0010540 | |
2013-03-18 06:58 | shmuel | Note Edited: 0010540 | |
2013-03-18 07:45 | 2useven10 | Note Added: 0010541 | |
2013-06-10 00:08 | shmuel | Assigned To | => shmuel |
2013-06-10 00:08 | shmuel | Status | new => assigned |
2013-06-10 00:13 | shmuel | Note Added: 0011114 | |
2013-06-10 00:13 | shmuel | Status | assigned => feedback |
2013-06-12 18:33 | shmuel | Build | => 3446 |
2013-06-12 18:33 | shmuel | Status | feedback => closed |
2013-06-12 18:33 | shmuel | Resolution | open => fixed |
2013-06-12 18:33 | shmuel | Fixed in Version | => 3.0 |