Обработка пункта .. в панели плагина

Место, где разработчики плагинов могут поделиться своим опытом.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработка пункта .. в панели плагина

Post by Shmuel »

Некоторые (эмулируемые) файловые системы могут содержать "папки" с именами .., / и \. Например, для баз данных SQLite это валидные имена таблиц. Но существующее API плагинов не позволяет обрабатывать такие папки как обычные папки, то есть в них либо нельзя зайти, либо нельзя из них нормально выйти, либо нельзя выделить, удалить и т.д. Пример файла базы данных SQLite, содержащей таблицы с этими именами приложен.

Далее, в связи с перебоями на сайте, мы с DrKnS через e-mail уже некоторое время пытаемся найти решение, в плане расширения API. Решили вынести задачу на общее рассмотрение. Так что все, кто в теме, добро пожаловать :)

Поскольку подробно излагать всю дискуссию последних дней было бы утомительно, упомяну тезисно возможные направления в решении:
  1. Добавить в PluginPanelItem::Flags новый флаг PPIF_NOTPARENTDIR
  2. Изменить действие OPIF_ADDDOTS так, чтобы вспомогательная папка .. добавлялась безусловно, а не только в случаях, когда папки с таким именем нет в списке.
  3. Добавить новый флаг OPIF_ADDPARENTPOINT.
  4. Использовать PluginPanelItem::UserData.

testdb3.sqlite3.7z
(1.04 KiB) Downloaded 93 times
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Обработка пункта .. в панели плагина

Post by zg »

1. в начале заявлено, что не работают .., / и \, а решения предложены только для ...
2. четвёртый пункт возможного решения не очень понятен.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработка пункта .. в панели плагина

Post by Shmuel »

1. Это потому, что вначале проблема рассматривалась только для .. - а уже потом обнаружилось, что и со слешами проблема.
2. В GetFindDataW() плагин в UserData помечает такие папки как "обычные", а в SetDirectoryW() читает UserData и на основании этого пытается перейти либо как в обычную папку, либо как в родительскую или корневую,
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Обработка пункта .. в панели плагина

Post by zg »

Shmuel wrote: Wed 15 Aug, 2018 13:251. Это потому, что вначале проблема рассматривалась только для .. - а уже потом обнаружилось, что и со слешами проблема.
тогда первые три варианта не решают проблему совсем, как мне кажется. возможно стоит подумать об условном флаге OPIF_RAW, когда фар показывает всё как есть и та же навигация отдаётся плагину.
Shmuel wrote: Wed 15 Aug, 2018 13:252. В GetFindDataW() плагин в UserData помечает такие папки как "обычные", а в SetDirectoryW() читает UserData и на основании этого пытается перейти либо как в обычную папку, либо как в родительскую или корневую.
а что мешает делать так сейчас?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработка пункта .. в панели плагина

Post by Shmuel »

zg wrote: Wed 15 Aug, 2018 13:45 тогда первые три варианта не решают проблему совсем
Все приведенные варианты не являются решениями, это просто перечислены направления обсуждения с DrKnS.
zg wrote: Wed 15 Aug, 2018 13:45 а что мешает делать так сейчас?
Пробовали - со стороны плагина нет проблем, но Фар относится к таким именам по-особому.

На данный момент нормального решения ещё нет, поэтому любые предложения могут обсуждаться, в т.ч. не имеющие ничего общего с 4-мя перечисленными тезисами.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Обработка пункта .. в панели плагина

Post by DrKnS »

zg wrote: Wed 15 Aug, 2018 13:45а что мешает делать так сейчас?
В некоторых местах в апи только wchar_t* и юзердата не пропихнуть.
А в некоторых других местах можно, но фар его тупо теряет (что мог - поправил).
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработка пункта .. в панели плагина

Post by Shmuel »

В самом начале мне казалось, что это задача на 15 минут (у меня такой супер-оптимизм не редок и иногда боком обходится).

Я предложил добавить новый флаг PPIF_NOTPARENTDIR - если учитывать и слеши, то лучше этот флаг назвать PPIF_COMMONDIR, и с моей точки зрения этого должно было быть достаточно, чтобы сказать Фару: это обычная папка, не обращай внимания на её имя. Если ещё добавить флаг OPIF_ADDPARENTPOINT, который бы добавлял папку .. наподобие OPIF_ADDDOTS, но безусловно, то вроде бы вот и всё, что надо.

Но оказалось, что в Фаре многое слишком завязано на имя и передаётся во внутренних функциях Фара только имя, а не, например, PluginPanelItem*.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработка пункта .. в панели плагина

Post by Shmuel »

Ещё одно наблюдение: если имя директории - пустая строка, то зайти в папку можно, но при выходе из этой папки Фар закрывает панель.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработка пункта .. в панели плагина

Post by Shmuel »

Кто-то что-то планирует доработать по теме? Если нет, я потихоньку возьмусь за это, но не хотелось бы дублировать усилия.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Обработка пункта .. в панели плагина

Post by DrKnS »

Да, кое-что уже есть, закоммичу через пару дней.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Обработка пункта .. в панели плагина

Post by DrKnS »

Shmuel wrote: Thu 16 Aug, 2018 12:40 Ещё одно наблюдение: если имя директории - пустая строка, то зайти в папку можно, но при выходе из этой папки Фар закрывает панель.
Таков контракт:
https://api.farmanager.com/ru/structures/openpanelinfo.html wrote:CurDir
Текущая директория панели. Если панельный плагин вернёт здесь пустую строку, то при нажатии ENTER на ".." Far Manager закроет панель плагина автоматически.
Однако, начиная с 2554, фар делает то же самое и для "\". zg, нам это точно надо?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработка пункта .. в панели плагина

Post by Shmuel »

DrKnS wrote: Sun 19 Aug, 2018 11:15Таков контракт: [...]
Это плохо (не смертельно, но плохо). Пустая строка - это всё же полноценная строка, и для SQLite3 является валидным именем таблицы. Уверен, что есть и другие форматы, для которых это справедливо.

P.S. Далеко за примером ходить не пришлось: в Lua пустая строка - валидное имя таблицы:

Code: Select all

_G[""] = { 1, 2, "foobar" }
far.Show(unpack(_G[""]))
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Обработка пункта .. в панели плагина

Post by zg »

DrKnS wrote: Sun 19 Aug, 2018 11:15zg, нам это точно надо?
история вопроса.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Обработка пункта .. в панели плагина

Post by DrKnS »

zg wrote: Sun 19 Aug, 2018 14:39история вопроса
Спасибо.
DrKnS wrote: Sat 18 Aug, 2018 23:07 закоммичу через пару дней
5258.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Обработка пункта .. в панели плагина

Post by Shmuel »

5258.
1. Если ограничиваемся только "..", но оставляем без изменений "\", "/" и "", то это как бы решаем только 1/4 часть задачи.
2. Независимо от того, добавляются ли служебные ".." плагином или Фаром, при выходе из реальной папки "..", курсор становится не на реальную папку, как должно быть, а на служебную.
Post Reply

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