View Issue Details

IDProjectCategoryView StatusLast Update
0002222Far ManagerMacropublic2013-05-07 15:38
ReporterNightRoman Assigned Toshmuel  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version3.0 
Fixed in Version3.0 
Summary0002222: MacroControl MCTL_SENDSTRING возвращает 0 при "Keys('F11') Menu.Select('FarNet', 2) Keys('Enter')"
DescriptionFar 3.0.3003, но это не последние изменения виноваты. Трудно сказать, когда
появилась проблема, но до перехода на Lua это работало, например, есть еще у
меня Far 3.0.2850, и он работает.

К сожалению, воспроизвести не так просто без установки плагина. Нужен плагин
FarNet и один из его модулей с ком.строкой, простейший вариант - RightControl.
И то, и то можно найти тут http://code.google.com/p/farnet/downloads/list, и
надо читать файл About-FarNet о том, как устанавливать.

Проще может быть, если посмотрит кто-то, у кого уже стоит FarNet и модуль
PowerShellFar, например, с ним тоже можно воспроизвести.

Когда все поставлено, то воспроизводится простым запуском из ком.строки:

Для модуля RightControl подойдет такая команда:
macro:post Plugin.Call("10435532-9BB3-487B-A045-B0E6ECAAB6BC", "::RightControl:step-left")
(эта команда ничего не делает по сути при запуске из пустой ком.строки)

А для PowerShellFar, например, такая:
macro:post Plugin.Call("10435532-9BB3-487B-A045-B0E6ECAAB6BC", "::>: 1")
(эта команда должна просто вывести 1 на консоль Фара)

Сейчас обе команды приводят к исключению в FarNet, которое выбрасывается
(осознанно, это задуманное исключение) при проверке кода возврата из
MacroControl. Сейчас перестал работать целый пласт специальных команд "::",
которые вызываются хитрым способом из макросов через меню плагинов F11, что
позволяет, например, панели открывать из обработчиков таких команд в модулях
(актуально для PowerShellFar).

Попутная деталь. Если после сбоя повторить команду, то ничего не происходит,
как будто вызов игнорируется и вызов плагина не происходит. Странно немного.
Но это следует учесть. Для повторного воспроизведения надо перезапустить Фар.

Пытался отлаживать. В KeyMacro::PostNewMacro (macro.cpp) у меня m_InternalInput
равен 1 и поэтому происходит выход с false при проверке. Но что это такое, что
m_InternalInput не 0, я не могу сказать. Не исключено, что это я вообще не то
что-то смотрел, конечно.
TagsNo tags attached.
Build3394

Activities

shmuel

2012-12-12 22:04

developer   bugnote:0009840

Я бы посмотрел, но боюсь застрять с установкой фарнета с компанией, да и разбираться в том, что он делает при тех или иных вызовах надо. Может быть лучше опиши пошагово, что делает RightControl при его вызове макросом, и я это смоделирую своим плагином.

NightRoman

2012-12-13 04:30

reporter   bugnote:0009841

DrKnS, если не ошибаюсь, имеет и Фарнет, и PowerShellFar. Может, его попросить глянуть в отладчике?

Иначе, думаю, сделать, как я описал - самый простой способ. Это не так и сложно, просто надо сделать правильно, поэтому и читать надо, как это делается.

А RightContol ничего не делает, до его вызова не доходит. Это Фарнет моделирует вызов по Ф11 через Plugin.Call.

NightRoman

2012-12-13 04:43

reporter   bugnote:0009842

Кроме того, есть еще одна проблема, которую лучше на готовых плагине Фарнет и его модуле PowerShellFar смотреть, но ее я опишу, когда с этим тикетом ясно станет. Может, проблема разрешится, но может и нет.

NightRoman

2012-12-13 04:47

reporter   bugnote:0009843

Однако, пошагово тоже опишу, что делает Фарнет для эмуляции вызова по Ф11 из макроса из Plugin.Call. Это большая регрессия, имхо, и я очень заинтересован в том, чтобы это было исправлено. Используется эта техника редко, поэтому и поздно было замечено, но метко.

NightRoman

2012-12-13 05:09

reporter   bugnote:0009844

По шагам.

При вызове описанного макроса Plugin.Call приводит к вызову Фарнет OpenW c OPEN_FROMMACRO и текстовым аргументом "::RightControl:step-left". По соглашению в Фарнет, префикс :: используется для вызова команды модуля "RightControl:step-left", эмулированный через Ф11.

Как это делается. В OpenW Фарнет пока ничего не делает, а просто 1) запоминает команду модуля "RightControl:step-left" на потом; 2) вызывает MacroControl с MCTL_SENDSTRING, KMFLAGS_DISABLEOUTPUT, и макросом "Keys('F11') Menu.Select('FarNet', 2) Keys('Enter')".

Тут MacroControl и возвращает 0, и Фарнет бросает исключение. Раньше же MacroControl отрабатывал, и Фарнет после постановки макроса просто выходил из OpenW и отдавал управление Фару. Фар получал управление, видел, что у него есть посланный макрос, и проигрывал его. При этом вызывалось меню Ф11 и оттуда пункт Фарнета уже через меню плагинов. Фарнет выдел, что у него запомнена команда "RightControl:step-left" и вызывал модуль RightControl с его командой "step-left". Фича в том, что этот вызов идет через меню плагинов, и в такой команде можно, например, открыть панель, чего при обычном вызове из Plugin.Call не сделаешь.

NightRoman

2012-12-13 05:14

reporter   bugnote:0009845

Перечитал. На самом деле, может, и просто все воспроизвести и без Фарнет. Можно перефразировать, кажется - "MacroControl не работает при вызове через Plugin.Call". Если это так, то тогда Фарнет и не понадобится (для этой проблемы, но я за пазухой еще одну держу :)).

max rusov

2012-12-13 07:12

reporter   bugnote:0009846

Last edited: 2012-12-13 07:14

Подтверждаю. Раньше в MacroLib работал такой прием:

macro Key="AltX"
{{
  msgbox("1")
  MacroLib = "84884660-5B2F-4581-9282-96E00AE109A2"
  Plugin.Call(MacroLib, "call Macro2")
}}

macro Name="Macro2"
{{
  msgbox("2")
}}

С внедрением LUA это перестало работать (Macro2 не отрабатывает). Мне кажется это та же проблема, о которой говорит Роман.

shmuel

2013-05-07 14:46

developer   bugnote:0010947

3394.

NightRoman

2013-05-07 15:24

reporter   bugnote:0010948

Работает, спасибо.

Issue History

Date Modified Username Field Change
2012-12-11 07:42 NightRoman New Issue
2012-12-12 22:04 shmuel Note Added: 0009840
2012-12-13 04:30 NightRoman Note Added: 0009841
2012-12-13 04:43 NightRoman Note Added: 0009842
2012-12-13 04:47 NightRoman Note Added: 0009843
2012-12-13 05:09 NightRoman Note Added: 0009844
2012-12-13 05:14 NightRoman Note Added: 0009845
2012-12-13 07:12 max rusov Note Added: 0009846
2012-12-13 07:14 max rusov Note Edited: 0009846
2013-05-07 14:46 shmuel Note Added: 0010947
2013-05-07 14:46 shmuel Assigned To => shmuel
2013-05-07 14:46 shmuel Status new => feedback
2013-05-07 15:24 NightRoman Note Added: 0010948
2013-05-07 15:24 NightRoman Status feedback => assigned
2013-05-07 15:24 NightRoman Status assigned => resolved
2013-05-07 15:38 shmuel Build => 3394
2013-05-07 15:38 shmuel Status resolved => closed
2013-05-07 15:38 shmuel Resolution open => fixed
2013-05-07 15:38 shmuel Fixed in Version => 3.0