Изменить момент вызова FreeFindData

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

Latest post of the previous page:

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

Дело вот в чем. Все эти кастом FreeData мне нужны были для освобождений во время поиска в первую очередь. Без поиска я выкручивался и так. А фаровский поиск был просто запрещен в фарнет-панелях и применялся свой. Свой чем-то лучше, но не всегда, и не замещает родной полностью. Теперь фаровский поиск я разрешаю, но получается, что не могу отработать SetDirectoryW, так там только строки-пути, а для .нет объектов они ничего не значат. Вся связь с реальными объектами идет через юзер дата файлов, а строки - это просто так, юзеру показать, могут и повторяться в одной панели запросто, и это даже нередко так и есть.

Проблема бы решилась, если SetDirectoryW в SetDirectoryInfo передавал не только const wchar_t *Dir, но intptr_t UserData, который сейчас не используется (не ошибаюсь?). А в этот UserData записать указатель на UserData из того файла-папки в которую Фар сейчас "входит" при поиске. Такое возможно в принципе или Фар не знает в "какой элемент заходит" и его UserData?

(ПС. UserData в SetDirectoryInfo - указатель на всю структуру UserData из файла, включая FreeData - она полезна плагину для различения типов элементов и как трактовать поле Data).
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

И еще. Это вложенный поиск не работает у меня по описанной причине, но файлы первого уровня-то находятся нормально, и вот им я и приписываю мой кастом FreeData. Так вот, при этом мой FreeData никогда не вызывается. Это уже похоже на баг, вроде.
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by zg »

NightRoman wrote:И еще. Это вложенный поиск не работает у меня по описанной причине, но файлы первого уровня-то находятся нормально, и вот им я и приписываю мой кастом FreeData. Так вот, при этом мой FreeData никогда не вызывается. Это уже похоже на баг, вроде.
2848.
NightRoman wrote:Проблема бы решилась, если SetDirectoryW в SetDirectoryInfo передавал не только const wchar_t *Dir, но intptr_t UserData, который сейчас не используется (не ошибаюсь?). А в этот UserData записать указатель на UserData из того файла-папки в которую Фар сейчас "входит" при поиске. Такое возможно в принципе или Фар не знает в "какой элемент заходит" и его UserData?
на первый взгляд при поиске как раз — знает. правда часть поиска придётся переделать. плюс SetDirectoryW не только из поиска вызывается.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

2848. Кое-что начало работать. Но не совсем. На панели 15 элементов (все "папки" если это важно), 2 из них начинаются с "С".

-- Запускаю поиск по *. GetFindDataW дает Фару 15 файлов, всем записан кастом FreeData. Находятся все 15, показываются в диалоге. Выхожу из диалога -- мое кастом освобождение вызывается 15 раз. ОК.

-- Запускаю поиск по С*. GetFindDataW дает Фару 15 файлов, всем записан кастом FreeData. Находятся 2 (при этом "аллокацию" я все равно делал 15 раз во время GetFindDataW). Закрываю диалог -- кастом освобождение вызывается 2 раза, а не 15, как ожидается.

(Если поспекулировать, то по идее, 13 раз должно было бы вызваться до показа диалога для ненайденных файлов и 2 раза при закрытии диалога для найденных.)
на первый взгляд при поиске как раз — знает. правда часть поиска придётся переделать.
Хорошо бы..
плюс SetDirectoryW не только из поиска вызывается.
Это да. В идеале, если делать, то уж везде. Но без поиска я пока выкручиваюсь хаком, получаю текущий элемент на панели сам, считая, что именно туда и входим, а у текущего элемента получаю кастом дата. Некрасиво, но работает. А с поиском и хак не годится, наверное, там понятие "текущий элемент" и не применимо.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

Вспомнился еще один случай вызова SetDirectoryW - при переходе на найденный элемент при поиске из диалога найденных файлов. Тут непонятно, как Фар может выкрутиться, по идее надо юзер дата родительского элемента передавать плагину, а не этого. А это уже сложно архитектурно. Но в принципе и этот элемент годится, но плагину надо тогда давать знать при SetDirectoryW, что надо не "войти" в переданный элемент, а установить "папку переданного элемента". Так можно было бы жить, плагин у себя-то знает, что такое папка элемента.
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by zg »

NightRoman wrote:-- Запускаю поиск по С*. GetFindDataW дает Фару 15 файлов, всем записан кастом FreeData. Находятся 2 (при этом "аллокацию" я все равно делал 15 раз во время GetFindDataW). Закрываю диалог -- кастом освобождение вызывается 2 раза, а не 15, как ожидается.
2849.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Изменить момент вызова FreeFindData

Post by NightRoman »

2849. Проверил с имеющимся юз-кейсом, работает нормально (освобождаются 13 файлов до диалога + 2 после).
Post Reply

Return to “Разработка плагинов”