karbazol / far-drag-n-drop-plugin

Far Manager plug-in to allow drag and drop operations between Far and other apps
5 stars 1 forks source link

add move and link as possible drag-n-drop actions + various fixes #20

Closed grechnik closed 7 years ago

grechnik commented 7 years ago

Комментарии по отдельным файлам: SConstruct, generated.h: очевидная опечатка growarry.h: фикс бага, когда после убийства/падения процесса Far ломается drag-n-drop на панель Far до убийства/перезапуска holder_*.dnd (отладчик говорит, что там получается GrowOnlyArray с _values=nullptr, _count=1, _capacity=16, после чего все попытки обновления данных при запусках/завершениях Far валятся с Access Violation в _values[0], а добрая винда глотает исключения в wndproc вместо убийства процесса) hldrdefs.h: два подчёркивания в OTHER__ARCH выглядят как опечатка mystring.h, mystring.cpp и первое из изменений far.cpp: я пару раз (во время отладки, когда что-то шло не так, но тем не менее) натыкался на ситуацию, когда в деструкторе WinThread -> ToolWindow -> _data оказывался ненулевым и по цепочке вызывал деструктор MyStringW; поскольку WinThread создаётся одним из первых, его деструктор вызывается одним из последних, когда финализатор внутри mystring.cpp уже отработал. Эти добавления перемещают финализатор внутри mystring.cpp на попозже остальные изменения в far.cpp, второе изменение inpprcsr.cpp, mainthrd.cpp: на фаровском форуме кто-то сидит в Far в окне с вертикальной прокруткой, и панели Far необязательно совпадают с экранным буфером configure.h, configure.cpp, первое изменение inpprcsr.cpp и два последних элемента в dndlng.py и ddlng.h: на фаровском форуме кто-то таки пробовал таскать правой кнопкой (не уточняя, правда, из Far или в Far), так что пусть будет опция для особо желающих. В принципе, наверное, можно сделать так, чтобы оно не противоречило показу меню по щелчку правой кнопкой, но надо код править, а мне влом, так что пусть будет radiobutton. Там же кто-то жаловался на то, что поле ввода для пикселей принимает только одну цифру; поскольку фича, управляемая этим полем, всё равно не реализована, имеет смысл выкинуть поле datacont.cpp, dircrtr.cpp: на фаровском форуме жаловались на проблемы с корневой папкой (которая C:\ и имеет слэш на конце, в отличие от всяких C:\somefolder) dataobj.h, dataobj.cpp: бОльшая часть правок - поддержка CFSHELLIDLIST, без которой Explorer наотрез отказывается создавать ярлыки на драггаемые элементы; deleteFilesFromDataObj - для поддержки сценария unoptimized move, когда таргет реализует операцию move как копирование + уведомление источника, что данные нужно удалить (Explorer с обычными файлами не делает так никогда, существование таргетов, поддерживающих move, но не optimized move для файлов, под большим вопросом, хотя теоретически возможно; deleteFilesFromDataObj реализована в основном на случай, если кто-то когда-то захочет перемещать псевдофайлы с панелей плагинов, ну и для теоретической корректности) fardlg.cpp: первое изменение - чтобы checkbox/radiobox в диалоге могли не только устанавливаться, но и сбрасываться (особенно заметно по Esc и повторному вызову диалога настроек), второе - потерявшийся флажок при переходе на Far3 API dropprcs.h, dropprcs.cpp, thrdpool.h, thrdpool.cpp, wrkrthrd.h, wrkrthrd.cpp: пробрасывание поддерживаемых и запрошенной операции drag-n-drop до обработчиков fldsprcs.cpp: добавлен комментарий, почему в остальной части файла не нужно ничего менять для поддержки move filelist.h, filelist.cpp: вместо события "нашли папку" теперь два "зашли в папку" и "вышли из папки", для рекурсивного move нужно обрабатывать оба filecopy.cpp, filecopy.h, hdrpprcs.h, hdrpprcs.cpp, cpydlg.h, cpydlg.cpp: реализация move и link операций toolwnd.h, toolwnd.cpp, три предпоследних элемента в dndlng.py, ddlng.h: разрешение таргету использовать move и link при драге из Far с указанием copy как предпочтительной операции (меньшая часть изменений); выбор операции при драге в Far (бОльшая часть изменений), с показом меню пользователю при драге правой кнопкой winthrd.cpp: события, открываемые в OpenEvent, создаются в `holder.dnd, аholder_.dndзапускаются внутриsetHolder`

karbazol commented 7 years ago

LGTM

karbazol commented 7 years ago

Думаю, надо добавить файл CONTRIBUTORS. Если не против туда попасть, то я его добавлю.

karbazol commented 7 years ago

@VictorVG есть желание потестировать?

VictorVG commented 7 years ago

Соберу поглядим вечерком как вернусь. Я сейчас вылез на пару минут, но сделаем. Самому интересно.

Кстати, и у меня есть для всех полезный инструмент - Process Hacker v3.0.0.499 (там весь комплект + доки). Его новая система сборки мне понятна, но не понравилась - медлительная раз, инсталлер выходит громоздким - два. Так что я покуда старую пошлифую, да она и по времени делает вдвое больше работы примерно на 20% быстрее.

grechnik commented 7 years ago

Думаю, надо добавить файл CONTRIBUTORS. Если не против туда попасть, то я его добавлю.

Не возражаю.

Соберу поглядим вечерком как вернусь.

@VictorVG: не забудь файлы *.lng тоже обновить, там несколько строк добавилось.

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

VictorVG commented 7 years ago

Хорошо, сделаю. Стоит чтобы самим не путаться.

karbazol commented 7 years ago

Сделал таг 3.0.81.4700. Там только те изменения, которые внес @grechnik Бампнул версию в мастере до 3.0.82.4700. Добавил файл CONTRIBUTORS.md. Убрал RunningDialogs фреймворк, цель которого была поддерживать изменения диалогов не из главного потока. Решил вместо этого спрятать межпоточный маршалинг внутри методов класса FarDialog.

VictorVG commented 7 years ago

Ну и отлично. Я тут ту же цифирь .82 на хвост поставил. Сейчас пройдусь а то голова прям взрывается и посмотрим....

VictorVG commented 7 years ago

.lng все сверил с диффом там подвохов нет, и тесты 3.0.82.4700 прошли нормально. Положил готовые сборки Drag-n-Drop.7z - VC2015 поддерживает ХР и через SCons в VC2017 - этот вариант XP не поддерживает.

VictorVG commented 7 years ago

Похоже тут есть какая-то связь провоцирующая сбой в NetBox v2.4.3.483 (скорее всего ошибка там т.к. в версии 2.4.2.475 сбоев не происходит). К сожалению точнее сказать не удаётся т.к. ОС предлагает позвать отладчик после того как Far падает и я вижу только последствия событий, но поскольку без D&D сбой не происходит, то возникает предположение о наличии ошибки в коде NetBox (не просто так там libputty в VC2010 не собирается) последствием которой становится блокировка drgndrop_x86.hook, drgndrop_x86_64.hook, holder_x86.dnd и holder_x86_64.dnd - при попытке их удалить ОС выводит Acess Deened и список задач в которых используются данные модули.

VictorVG commented 7 years ago

Ошибка сидела в NetBox-е ибо версия 2.4,3,483 собранная из Git - 7c58c40bb0a74570f9e уже с D&D не падает.

karbazol commented 7 years ago

Это хорошо

VictorVG commented 7 years ago

Естественно. Не ясно только почему сборочный скрипт вылетает в 2010-й, но в 2015-й собирает всё. Причём выяснилось ещё более интересное - в 2010-й NetBox не собирается скриптами - только в IDE, НО! только такая сборка не падает и нормально работает если запущен (видимо мы имеем дело с ошибкой компилятора ???) D&D, а сборка из VC2015 мгновенно падает с кодом исключения 0x40000015 при вызове NetBox-а.

VictorVG commented 7 years ago

Да, интересно - VC2015 сборка падает в CRT что удалось поймать только подсунув в каталог NetBox его PDB перед запуском. Одно не могу понять - что приводит к выводу сообщения в отладчике "Ссылка на объект не указывает на экземпляр объекта." - ошибка в VC++2015 либо накопление ошибок компиляции исходников NetBox при сборке которых выводится куча варнингов о возможной потере данных и некорректных операциях? Ну, с этим наверное Миша лучше меня разберётся, главное что точно выяснено что это скрытая ошибка NetBox v2.4.3.483, а наличие в ОЗУ запущенного D&D просто вызывает её проявление.