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 17: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-09 23:08 | shmuel | Assigned To | => shmuel |
| 2013-06-09 23:08 | shmuel | Status | new => assigned |
| 2013-06-09 23:13 | shmuel | Note Added: 0011114 | |
| 2013-06-09 23:13 | shmuel | Status | assigned => feedback |
| 2013-06-12 17:33 | shmuel | Build | => 3446 |
| 2013-06-12 17:33 | shmuel | Status | feedback => closed |
| 2013-06-12 17:33 | shmuel | Resolution | open => fixed |
| 2013-06-12 17:33 | shmuel | Fixed in Version | => 3.0 |