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

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

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

Post by Shmuel » Wed 15 Aug, 2018 12:24

Некоторые (эмулируемые) файловые системы могут содержать "папки" с именами .., / и \. Например, для баз данных 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 9 times

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

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

Post by zg » Wed 15 Aug, 2018 13:13

1. в начале заявлено, что не работают .., / и \, а решения предложены только для ...
2. четвёртый пункт возможного решения не очень понятен.

Shmuel
Posts: 5524
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 179 times

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

Post by Shmuel » Wed 15 Aug, 2018 13:25

1. Это потому, что вначале проблема рассматривалась только для .. - а уже потом обнаружилось, что и со слешами проблема.
2. В GetFindDataW() плагин в UserData помечает такие папки как "обычные", а в SetDirectoryW() читает UserData и на основании этого пытается перейти либо как в обычную папку, либо как в родительскую или корневую,

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

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

Post by zg » Wed 15 Aug, 2018 13:45

Shmuel wrote:
Wed 15 Aug, 2018 13:25
1. Это потому, что вначале проблема рассматривалась только для .. - а уже потом обнаружилось, что и со слешами проблема.
тогда первые три варианта не решают проблему совсем, как мне кажется. возможно стоит подумать об условном флаге OPIF_RAW, когда фар показывает всё как есть и та же навигация отдаётся плагину.
Shmuel wrote:
Wed 15 Aug, 2018 13:25
2. В GetFindDataW() плагин в UserData помечает такие папки как "обычные", а в SetDirectoryW() читает UserData и на основании этого пытается перейти либо как в обычную папку, либо как в родительскую или корневую.
а что мешает делать так сейчас?

Shmuel
Posts: 5524
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 179 times

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

Post by Shmuel » Wed 15 Aug, 2018 13:55

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

На данный момент нормального решения ещё нет, поэтому любые предложения могут обсуждаться, в т.ч. не имеющие ничего общего с 4-мя перечисленными тезисами.

User avatar
DrKnS
Posts: 4914
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 161 times

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

Post by DrKnS » Wed 15 Aug, 2018 14:55

zg wrote:
Wed 15 Aug, 2018 13:45
а что мешает делать так сейчас?
В некоторых местах в апи только wchar_t* и юзердата не пропихнуть.
А в некоторых других местах можно, но фар его тупо теряет (что мог - поправил).

Shmuel
Posts: 5524
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 179 times

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

Post by Shmuel » Wed 15 Aug, 2018 18:35

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

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

Но оказалось, что в Фаре многое слишком завязано на имя и передаётся во внутренних функциях Фара только имя, а не, например, PluginPanelItem*.

Shmuel
Posts: 5524
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 179 times

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

Post by Shmuel » Thu 16 Aug, 2018 12:40

Ещё одно наблюдение: если имя директории - пустая строка, то зайти в папку можно, но при выходе из этой папки Фар закрывает панель.

Shmuel
Posts: 5524
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 179 times

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

Post by Shmuel » Sat 18 Aug, 2018 20:26

Кто-то что-то планирует доработать по теме? Если нет, я потихоньку возьмусь за это, но не хотелось бы дублировать усилия.

User avatar
DrKnS
Posts: 4914
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 161 times

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

Post by DrKnS » Sat 18 Aug, 2018 23:07

Да, кое-что уже есть, закоммичу через пару дней.

User avatar
DrKnS
Posts: 4914
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 161 times

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

Post by DrKnS » Sun 19 Aug, 2018 11:15

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: 5524
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 179 times

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

Post by Shmuel » Sun 19 Aug, 2018 12:23

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: 5492
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 73 times
Contact:

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

Post by zg » Sun 19 Aug, 2018 14:39

DrKnS wrote:
Sun 19 Aug, 2018 11:15
zg, нам это точно надо?
история вопроса.

User avatar
DrKnS
Posts: 4914
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 161 times

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

Post by DrKnS » Sun 19 Aug, 2018 15:35

zg wrote:
Sun 19 Aug, 2018 14:39
история вопроса
Спасибо.
DrKnS wrote:
Sat 18 Aug, 2018 23:07
закоммичу через пару дней
5258.

Shmuel
Posts: 5524
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 179 times

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

Post by Shmuel » Sun 19 Aug, 2018 21:06

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

Shmuel
Posts: 5524
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 179 times

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

Post by Shmuel » Wed 22 Aug, 2018 07:26

DrKnS, предполагается продолжение, или это уже всё?

Post Reply

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