о событиях в редакторе

Разработка Far.
User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Re: о событиях в редакторе

Post by John Doe » Mon 28 Jul, 2014 16:18

Latest post of the previous page:

например до недавнего времени ee_close могло прийти раньше, чем ee_read. что-то вас это не смущало.
Не смущало, т.к. не сталкивался, и даже не представляю как воспроизвести.
Подымаю те вопросы, на которые сам напоролся. Надо как-то иначе?
ответе на три вопроса:
1. Для плагинописателя не принципиально. До рефакторинга отображалась информация о "предыдущем" активном окне.
2. Не принципиально, хоть и пустое окно.
3. Не знаю, на вопросы отвечал как пользователь апи, а не не как разработчик фара.

Я вроде бы не утверждал, будто знаю лучше всех.
Наоборот, пытаюсь выяснить в чём задумка, и как вообще плагин может применить ранние EE_REDRAW, EE_GOTFOCUS до EE_READ.

User avatar
zg
zero-gravity
Posts: 5246
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Re: о событиях в редакторе

Post by zg » Mon 28 Jul, 2014 16:57

John Doe wrote:1. Для плагинописателя не принципиально. До рефакторинга отображалась информация о "предыдущем" активном окне.
2. Не принципиально, хоть и пустое окно.
ок. так понимаю, вот этот баг можно закрывать?
John Doe wrote:Я вроде бы не утверждал, будто знаю лучше всех.
ну значит мне показалось:
John Doe wrote:А я вот не очень верю, что событие EE_READ задумано вызываться не первым.
извините.
John Doe wrote:Наоборот, пытаюсь выяснить в чём задумка, и как вообще плагин может применить ранние EE_REDRAW, EE_GOTFOCUS до EE_READ.
я не успел ответить, а вы решили поиграть в станиславского.

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Re: о событиях в редакторе

Post by John Doe » Mon 28 Jul, 2014 18:51

zg wrote:
John Doe wrote:1. Для плагинописателя не принципиально. До рефакторинга отображалась информация о "предыдущем" активном окне.
2. Не принципиально, хоть и пустое окно.
ок. так понимаю, вот этот баг можно закрывать?
При обработке события в редакторе и тип окна и макрообласть известны нам априопри.
А вот при вызове из меню плагинов нет, о чём и тикет.
zg wrote:
John Doe wrote:Наоборот, пытаюсь выяснить в чём задумка, и как вообще плагин может применить ранние EE_REDRAW, EE_GOTFOCUS до EE_READ.
я не успел ответить, а вы решили поиграть в станиславского.
Мне всё ещё хочется узнать ответ.

User avatar
zg
zero-gravity
Posts: 5246
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Re: о событиях в редакторе

Post by zg » Tue 29 Jul, 2014 10:36

John Doe wrote:Мне всё ещё хочется узнать ответ.
задумано именно так для того, чтобы в момент прихода ee_read редактор был полностью сконструирован и отображён. т.е. мне на самом деле не сложно запретить все события до полного окончания ee_read, но есть проблемы:
1. если в ee_read вывести диалог, то редактор будет не раскрашен. кому-то может не понравится.
2. теоретически кто-то может хотеть интерактивно раскрашивать редактор в ee_read и сразу видеть изменения. раньше это работало, после такого изменения — не будет.
3. EE_CHANGE. вот тут хуже всего. если один плагин в ee_read что-то поменяет, при запрете всех событий до конца ee_read, остальные плагины не получат нотификаций об этих изменениях. и это может быть очень критично.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: о событиях в редакторе

Post by NightRoman » Tue 29 Jul, 2014 10:50

По дилетантски. Что если так? В ee_read окна редактора еще нет, есть объект редактора, его текст и прочее, но окна, интеракции и событий нет. Текст плагины могут менять. Если меняют несколько плагинов, то нестыковки могут быть (при 2+ менятелях они могут быть вроде в любой реализации, можно придумать конфликты). Событий нет, пока ee_read не вызван у всех плагинов. Все плагины должны получить ee_read. ee_read для инициализации и изменения начального текста, а не для полноценной работы еще.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: о событиях в редакторе

Post by NightRoman » Tue 29 Jul, 2014 10:52

задумано именно так для того, чтобы в момент прихода ee_read редактор был полностью сконструирован и отображён.
Может быть это и полезно. Но до опыта я не знаю, зачем это нужно (редактор отображен особенно).

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: о событиях в редакторе

Post by NightRoman » Tue 29 Jul, 2014 10:58

И если не нравится, что мною написано, прошу не утруждаться сарказмом, поберегите свое время. Мне все равно, как будет сделано. Хуже, чем чтобы хоть как-то можно было приспособиться к Фар АПИ, наверное, не будет.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: о событиях в редакторе

Post by NightRoman » Tue 29 Jul, 2014 11:16

Возможно, не хватает еще одного события типа EE_OPEN, которое вызывается уже после всех EE_READ. В этом событии уже есть окно, отрисовка, интеракция, события. Это если действительно нужно, я пока не имею юз-кейсов.

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Re: о событиях в редакторе

Post by John Doe » Tue 29 Jul, 2014 11:21

NightRoman wrote:Возможно, не хватает еще одного события типа EE_OPEN, которое вызывается уже после всех EE_READ. В этом событии уже есть окно, отрисовка, интеракция, события. Это если действительно нужно, я пока не имею юз-кейсов.
Юзкейс: преодолеть ограничения EE_READ, перечисленные выше:
Но как я понимаю тут можно обойтись и без EE_OPEN: выставить в EE_READ для себя флаг, и обработать всё при первом EE_GOTFOCUS.
zg wrote:3. EE_CHANGE. вот тут хуже всего. если один плагин в ee_read что-то поменяет, при запрете всех событий до конца ee_read, остальные плагины не получат нотификаций об этих изменениях. и это может быть очень критично.
А можно пример сценария, где это критично?

User avatar
zg
zero-gravity
Posts: 5246
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Re: о событиях в редакторе

Post by zg » Tue 29 Jul, 2014 19:11

NightRoman wrote:Может быть это и полезно. Но до опыта я не знаю, зачем это нужно (редактор отображен особенно).
для согласованности, чтобы не было ситуации, когда апи говорит нам, что на экране редактор, а реально там панели. для единообразия, диалог в ve_read — под ним окно просмотра, в ee_read — панели. но нарисовать редактор можно и без событий, проблема не в этом. ещё мне показалось, что в вопросе есть непонимание, зачем при посылке ee_read нужен полностью сконструированный редактор? это мне показалось или нет?
John Doe wrote:
zg wrote:3. EE_CHANGE. вот тут хуже всего. если один плагин в ee_read что-то поменяет, при запрете всех событий до конца ee_read, остальные плагины не получат нотификаций об этих изменениях. и это может быть очень критично.
А можно пример сценария, где это критично?
1. в энциклопедии написано, что ee_change приходит при изменении текста в редакторе. если вдруг он при каком-то изменении перестаёт приходить — это 100% баг. если хотелось какого-то другого поведения от этого события, то об этом надо было писать, когда оно предлагалось, а не вдруг сейчас.
2. напомню, что EE_CHANGE один раз ломалось, вместо посылки всем сделали только тем кто подписался. и тогда тоже казалось, что ничего в этом сильно критичного нет. а вдруг внезапно оказалось, что EdtFind начал файлы портить. но в тот раз это хоть было обосновано.

в целом повторюсь. запретить ee_redraw/ee_*focus до полного окончания ee_read — вообще не проблема. но вот ee_change запрещать нельзя. и вот для меня не очень понятно, если ee_change всё равно останется, то какой смысл в запрете ee_redraw/ee_*focus? в чём принципиальная разница?

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Re: о событиях в редакторе

Post by John Doe » Tue 29 Jul, 2014 19:54

А как же запретить ee_redraw/ee_*focus? Что если плагин рассчитывает при открытии редактора их получить?
Лично у меня замечания только к порядку следования событий.
EE_READ раньше что приходило первым и один раз, что было удобно для инициализации.
Если сейчас по дизайну нельзя получать его первым, то может быть есть смысл завести EE_INIT, при обработке которого запретить использовать все "опасные" функции апи?

Update: http://bugs.farmanager.com/view.php?id=2831

User avatar
zg
zero-gravity
Posts: 5246
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Re: о событиях в редакторе

Post by zg » Tue 29 Jul, 2014 20:21

John Doe wrote:А как же запретить ee_redraw/ee_*focus? Что если плагин рассчитывает при открытии редактора их получить?
получит, в чём проблема?
John Doe wrote:EE_READ раньше что приходило первым
не всегда.
John Doe wrote:и один раз
сейчас что, два раза приходит? хотя конечно при перезагрузке файла при смене кодировки и записи в другую кодировку по логике надо ee_read тоже вызывать.
John Doe wrote:что было удобно для инициализации.
приведите реальный код. это не сарказм, реально вот приведите. что-то большое не нужно, но чтобы смысл был понятен.

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Re: о событиях в редакторе

Post by John Doe » Tue 29 Jul, 2014 21:51

zg wrote:получит, в чём проблема?
В таком случае проблемы нет.
zg wrote:если ee_change всё равно останется, то какой смысл в запрете ee_redraw/ee_*focus? в чём принципиальная разница?
Разница в том, что EE_CHANGE требует подписки и вообще используется намного реже.
zg wrote:хотя конечно при перезагрузке файла при смене кодировки и записи в другую кодировку по логике надо ee_read тоже вызывать.
Это отдельный вопрос.
При перезагрузке файла (по ShiftF4) открывается новый редактор. Если делать так же при смене кодировки, то для пользователя может быть неожиданностью изменение настроек и потеря закладок.
zg wrote:приведите реальный код.
RecentScreens.
Есть список окон.
По EE_READ в список добавляется новое окно.
По EE_GOTFOCUS существующий элемент переносится в начало списка.

Так было раньше, но сейчас первый EE_GOTFOCUS приходит раньше EE_READ.
Разумеется можно выкрутится, и даже несколькими способами, и тем не менее иметь событие, приходящее однократно и первым — было (бы) удобно.

User avatar
zg
zero-gravity
Posts: 5246
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Re: о событиях в редакторе

Post by zg » Wed 30 Jul, 2014 02:34

John Doe wrote:Разница в том, что EE_CHANGE требует подписки и вообще используется намного реже.
неформализуемая разница.
John Doe wrote:Есть список окон.
По EE_READ в список добавляется новое окно.
По EE_GOTFOCUS существующий элемент переносится в начало списка.
для чего нужно действие по EE_READ? без него как раньше, так и сейчас должно всё прекрасно работать.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: о событиях в редакторе

Post by NightRoman » Wed 30 Jul, 2014 05:57

Мне было бы проще строить плагин, если бы существовали события редактора, которые гарантированно приходят первыми и последними и только один раз. Пусть в этот момент редакторы и не полноценные (так обстоит дело с ee_close). Если этого не будет, то жить тоже можно, но не проще. Правда, будет совсем непросто, если EE_CLOSE не будет последним или неоднократным, но, надеюсь, до этого не дойдет.

Мой код для событий редактора выглядит так: Editor0::AsProcessEditorEvent в https://code.google.com/p/farnet/source ... ditor0.cpp Привожу его не для того, чтобы что-то доказать, просто пусть будет упомянут. Код уже частично адаптирован к новым условиям и еще, вероятно, будет переделываться.

Да, есть особая ситуация, когда плагин грузится при уже открытых редакторах, то есть в такой ситуации первого события не будет. Но для моего плагина она особая, и это нормально и ожиданно, что уже загруженные редакторы могут быть неполноценно охвачены плагином. Но с остальными штатными ситуациями хотелось бы простоты и определенности с первым и последним событием.

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Re: о событиях в редакторе

Post by John Doe » Wed 30 Jul, 2014 10:19

zg wrote:для чего нужно действие по EE_READ? без него как раньше, так и сейчас должно всё прекрасно работать.
На мантисе есть запись о том, что EE_GOTFOCUS может не приходить.
В любом случае, я ведь не спорю что код можно адаптировать к любым условиям.
Но вопрос удобства остаётся, присоединяюсь к предыдущему посту NightRoman.
zg wrote:
John Doe wrote:Разница в том, что EE_CHANGE требует подписки и вообще используется намного реже.
неформализуемая разница.
Удобно иметь событие, приходящее первым.
И не страшно, если EE_CHANGE будет единственным исключением.

Или, как уже предлагалось, завести специальное ограниченное событие EE_INIT.

Да, можно оставить как есть, приспособимся и так.

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Re: о событиях в редакторе

Post by John Doe » Wed 15 Oct, 2014 12:21

EE_READ приходит в редактор один раз. Нет сейчас в фаре такой ситуации, чтобы EE_READ пришло второй раз.
Перезагрузка файла закрывает текущую копию редактора и открывает новую.

VE_READ же может приходить во вьювер сколько угодно раз, при смене файла клавишами +/-
При этом VE_GOTFOCUS не приходит.

Просто наблюдения. Полезно задокументировать.

Post Reply

Return to “Development”