View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000466 | Wishes | Macro | public | 2008-02-04 03:12 | 2013-05-30 14:25 |
Reporter | CrOm | Assigned To | shmuel | ||
Priority | normal | Severity | feature | Reproducibility | have not tried |
Status | closed | Resolution | fixed | ||
Fixed in Version | 3.0 | ||||
Summary | 0000466: Расширение макроязыка плагинами | ||||
Description | Добавить возможность плагинам расширять функциональность макроязыка путем добавления своих функций, позволяющих обращаться к функциям плагина из макроязыка напрямую (а не программированием комбинаций клавиш) выглядить это может примерно так. плагин определяет свой неймспейс, в котором он работает. по этому неймспейсу фар будет определять какому длл отсылать функцию. плагин должен экспортировать функцию обработки конструкций языка. например: paramType * ProcessMacro(char * macro, paramsArray * params, int paramsCount) //macro - макрослово //params - массив параметров (элементы либо переменного типа, либо строковые) //paramsCount - количество переменных (размер массива) //возвращается тоже либо переменный тип, либо строковый т.е. если парсер встречает в скрипте что-нить типа math.sin("1.0"), то из плагина, обрабатывающего неймспейс "math", вызовится функция ProcessMacro("sin", "1.0", 1); ну как-то так. | ||||
Tags | No tags attached. | ||||
Build | 2893 | ||||
|
Плагин сам будет исполнять код? Или... хмм... только функции экспортить? |
|
исполнять код чего? макроса? плагин будет обрабатывать только функцию с параметрами. не буду далеко ходить за примерами. вот сейчас чтобы обновить панель в qPlayEx я делаю так: вызываю в Control апдейт, а потом в AdvControl макрос, который вернет на экран окно управления и эквалайзер, если это необходимо после обновления панелей. выглядит макрос так: "ShiftF3 E". он, естественно, будет работать только с панели плагина. а вот если бы была возможность расширения макроязыка, то можно былобы сделать макрос типа такого: "qplay.show('main') E" и он бы сработал с любого места |
|
Нужно подумать... Как, например, макродвиг узнает, что для "qplay" нужно обращаться к плагину qPlayEx? Наверное нужен какая-нибуть функция у плагина, которую будет дергать ФАР... Как вариант - расширить структуру OpenPluginInfo - добавить поля "const char *macronamespace" (для "младших моделей" ФАРа, если все правильно программировалось, это будет невидимо, а для дальнейших версий...) + та самая экспортируемая функция ProcessMacro. ы? |
|
...точнее структура не OpenPluginInfo, а PluginInfo. |
|
попутно вопрос. в изначальном топике был пример math.sin("1.0") а зачем единицу в кавыки брать? плагин сам будет заниматься парсеньем того, что ему подуснули? Может имеет смысл плагину в ProcessMacro() передавать массив структур-параметров функции аля struct { int type; enum{ char *s; __int64 i; } val; }; |
|
да через PluginInfo будет наверное правильно. этот неймспейс можно будет кешировать. чтобы потом загружать плагин в нужный момент. а насчет параметров... ну просто если у фара только 2 типа данных: строка и целое число, то дробные придется посылать через строку. |
|
ну... плавающую точка добавить непроблема - не было нужды, т.к. макросы предназначены в основном не для расчетов, а для упрощения управления ФАРом ;-) |
|
CrOm, а как быть с потенциально опасными "функциями"? Текст макроса можно проанализировать визуально, понять что и как. В случае плагина - сорцов может и не быть (безобидный math.sin("1.0") вместо синуса будет форматировать CD-привод :-)) Хотя и обычные плагины такую же подлянку могут кинуть... |
|
потенциально опасными функциями пользоваться не нужно :) как правильно замеченно, если захотят нагадить, то нагадят, через макроязык или через плагин или через батник - уже не важно. зы. приятно, что к теме интерес не пропал |
|
> зы. приятно, что к теме интерес не пропал я думаю :-) |
|
опять на форуме подняли схожую хотелку. как там, ы? |
|
svs 20.03.2009 22:20:25 +0300 - build 832 1. Macro: V=callplugin(SysID[,param]) это то, о чем я думаю? можно пояснить как-нибудь? |
|
нет, это не то, о чем ты думаешь (к этому тикету не относится). это несколько из иной плоскости... грубо - некий заменитель f11 о нем я попозжее в Писании расскажу. |
|
ну собственно, тоже неплохо. у меня применение этому уже есть. а что такое "Писание" ? |
|
> а что такое "Писание" ? :-) http://api.farmanager.com/ |
|
я вернулся... :-) Есть 2 сценария 1. использовать namespace + ProcessMacroW (в этом случае трудности с контролем аргументов у функций... может что-то еще) 2. имеем MCMD_REGFUNC + ProcessMacroW - здесь ФАР точно будет знать к какому плагину обратится, сколько у функции параметров обязательных и необязательных (здесь по аналогии с регистрацией функций можно добавить MCMD_DEFCONST - регистрацию констант) ы? |
|
Хмм... А если плагин "новый" и ни разу не загружался... то нет информации о том, что функция "foo.bar" принадлежит ЭТОМУ плагину! Видимо namespace нужен... хотя бы для хранения онной в PluginsCache. хмм.. а имена функций нужно ли сохранять в реестре? |
|
да кеширование неймспейса необходимо. ну а имена функций хранить в реестре, думаю, нет смысла. а насчет количества параметров... ну тут я даж не знаю. можно экспортировать функцию-обработчик, примерно с такими параметрами: ProcessMacroW(LPCTSR sFuncName, varParams* pParams, int nParams); ну а плагин уже по имени функции будет знать сколько должно быть параметров и какие из них обязательные, а какие нет. и если что возвращать код ошибки. |
|
> ну а плагин уже по имени функции будет знать сколько должно быть параметров а смысл от этого? гораздо удобнее на этапе компиляции макроса сказать "вот здесь что-то не так с количеством параметров", чем потом гадать, что за ошибку вернул плагин. Еще открытый вопрос. Вот мы добавили плагин. Как ФАР узнает, что ЭТА функция относится к вновь прибывшему плагину? (это к тому, что потребуется 2 рестарта ФАРа :-)). Дело в том, что макросы грузятся и компилятся до загрузки плагинов... так, надо наверное макросы грузить после плагинов... |
|
>а смысл от этого? гораздо удобнее на этапе компиляции макроса сказать "вот >здесь что-то не так с количеством параметров", чем потом гадать, что за ошибку >вернул плагин. в таком случае да. надо заморачиваться с регистрацией функции. и макросы грузить уже опосля. |
|
Тут подумалось. А может нафиг эту неймспейс и регистрацию? Можно проще :-) Сделать через реестр, как описано в 0000018 (описание там я немного подправлю). Т.е.: 1. плагин экспортирует функцию ProcessMacroW 2. в ветку KeyMacros\MCode забиваем нужную инфу - фар берет отсюда все что нужно. типа дешево и сердито :-) |
|
> типа дешево и сердито :-) если это означает, что возни меньше, то я согласен и за такой вариант. главное чтобы он привел к исходной идее - расширение макроязыка |
|
небольшой тест: http://skirda-file.googlecode.com/files/m466-1.rar просьба проверить как взлетит с макросами: просто поработать в этой версии. здесь немного изменен механизм работы с функциями, без реализации которого дальше трудно двигаться, в разрезе 0000466 и 0000018 (и наследнико-последователей) |
|
Утверждение верно? "Макрофункция плагина возвращает в качестве результата своей работы только одно значение" |
|
А помимо возвращаемого значения: сможет ли функция производить какие-либо действия? Типа http://forum.farmanager.com/viewtopic.php?f=15&t=5409 |
|
а то! например, если в плагине повторить математику бэйсиковского оператора PLYA и обозвать его как "sound.play", то вызов в макросе вот такого чуда: sound.play("T150 ml O3 D#32 O3 C#32 O3 G#32 O2 G#32 O0 G#64 O1 G#64 O3 D#32 C#16") проиграет первые аккорды Шопена ;-) |
|
>sound.play( Только музыки в ФАРе и не хватает :-) Погонял тестовую версию, ничего деструктивного не замечено. |
|
В LuaMacro предлагается "экспортировать" функции таким образом: function sin(arg) return Plugin.Call("887631b9-49cc-415f-be22-d6b07510510d","Sin",arg) end http://forum.farmanager.com/viewtopic.php?p=102943#p102943 |
|
В Lua есть стандартное стредство - внешние модули, загружаемые через require. Dll плагина могла бы одновременно служить и модулем, хотя врядли это будет удобно http://forum.farmanager.com/viewtopic.php?p=104534#p104534 |
|
> function sin(arg) > return Plugin.Call("887631b9-49cc-415f-be22-d6b07510510d","Sin",arg) > end Как выяснилось, есть более красивый способ. Нужно (абсолютно произвольно) выбрать нэймспейс для плагина, а заполнить его функциями можно "автоматически". А точнее базовыми средствами Lua, даже без какой-либо специальной подержки со стороны фара и плагинов http://forum.farmanager.com/viewtopic.php?f=15&t=7759 |
|
Как уже было сказано, Plugin.Call + средства Lua дают возможность расширения макроязыка плагинами. |
|
intptr_t WINAPI ProcessMacroW(struct ProcessMacroInfo *Info) и всё остальное под #ifdef MANTIS_0000466 ещё актуально или удаляем? |
|
Мне кажется, что можно удалить. |
|
Закрыто ввиду отсутствия фидбека. |
Date Modified | Username | Field | Change |
---|---|---|---|
2008-02-04 03:12 | CrOm | New Issue | |
2008-02-04 11:11 | vskirdin | Note Added: 0001169 | |
2008-02-04 13:18 | CrOm | Note Added: 0001170 | |
2008-03-15 00:46 | vskirdin | Note Added: 0001324 | |
2008-03-15 01:24 | vskirdin | Note Added: 0001327 | |
2008-03-15 01:38 | vskirdin | Note Added: 0001328 | |
2008-03-16 01:44 | CrOm | Note Added: 0001333 | |
2008-03-17 12:37 | vskirdin | Note Added: 0001361 | |
2008-10-24 12:05 | vskirdin | Project | Wishes.Plugins => Wishes |
2008-10-24 12:05 | vskirdin | Category | _Common => Macro |
2008-10-29 01:31 | vskirdin | Note Added: 0001900 | |
2008-10-29 02:58 | CrOm | Note Added: 0001902 | |
2008-10-29 11:06 | vskirdin | Note Added: 0001904 | |
2008-11-01 00:28 | vskirdin | Status | new => assigned |
2008-11-01 00:28 | vskirdin | Assigned To | => vskirdin |
2009-03-10 06:04 | CrOm | Note Added: 0002732 | |
2009-03-23 03:51 | CrOm | Note Added: 0002816 | |
2009-03-23 07:18 | vskirdin | Note Added: 0002818 | |
2009-03-23 07:58 | CrOm | Note Added: 0002819 | |
2009-03-23 08:00 | vskirdin | Note Added: 0002820 | |
2009-09-07 14:07 | vskirdin | Note Added: 0004028 | |
2009-09-07 14:41 | vskirdin | Note Added: 0004029 | |
2009-09-08 05:05 | CrOm | Note Added: 0004035 | |
2009-09-08 05:59 | vskirdin | Note Added: 0004036 | |
2009-09-08 07:25 | CrOm | Note Added: 0004037 | |
2009-09-08 14:11 | vskirdin | Note Added: 0004042 | |
2009-09-08 14:40 | vskirdin | Relationship added | related to 0000018 |
2009-09-08 16:08 | CrOm | Note Added: 0004045 | |
2009-09-30 07:28 | vskirdin | Relationship added | child of 0000346 |
2010-09-27 20:38 | vskirdin | Note Added: 0005838 | |
2010-09-28 13:16 | vskirdin | Note Added: 0005841 | |
2010-09-28 15:30 | JohnDoe | Note Added: 0005842 | |
2010-09-28 16:01 | vskirdin | Note Added: 0005843 | |
2010-09-28 18:11 | DAtaMan | Note Added: 0005844 | |
2013-01-30 13:06 | JohnDoe | Note Added: 0010149 | |
2013-02-26 14:06 | JohnDoe | Note Added: 0010388 | |
2013-02-26 14:15 | JohnDoe | Note Added: 0010389 | |
2013-02-26 17:53 | vskirdin | Assigned To | vskirdin => |
2013-02-26 17:53 | vskirdin | Status | assigned => new |
2013-03-10 09:32 | shmuel | Note Added: 0010488 | |
2013-03-10 09:32 | shmuel | Assigned To | => shmuel |
2013-03-10 09:32 | shmuel | Status | new => feedback |
2013-03-15 20:49 | DrKnS | Note Added: 0010523 | |
2013-03-15 21:22 | shmuel | Note Added: 0010524 | |
2013-05-30 14:25 | shmuel | Build | => 2893 |
2013-05-30 14:25 | shmuel | Note Added: 0011052 | |
2013-05-30 14:25 | shmuel | Status | feedback => closed |
2013-05-30 14:25 | shmuel | Resolution | open => fixed |
2013-05-30 14:25 | shmuel | Fixed in Version | => 3.0 |