Как написать плагин для OS X Finder
Я ищу руководство или пример кода для написания плагинов для Mac OS X Finder? Хотелось бы узнать, как сделать несколько простых действий:
- добавление наложенных изображений на иконки
- добавление пунктов контекстного меню
- прослушать изменения файла
Я нашел следующие два ресурса:
- Написание плагинов контекстного меню для OS X: устаревший документ 2002 года, использующий
COM
API для Mac OS X 8/9. - SCPlugin: SVN Mac-приложение с открытым исходным кодом, которое включает в себя плагин Finder.
Я испытываю желание рассмотреть SCPlugin
код, но надеялся найти более простой пример для переваривания.
8 ответов
К сожалению, программирование плагина Finder на самом деле все еще требует загрязнения рук с помощью COM. Если вы посмотрите на подпроект SCFinderPlugin проекта SCPlugin, вы обнаружите, что он следует точно так же, как описано в вашей первой ссылке, включая настройку vtable для COM, написание функций AddRef/ReleaseRef и так далее. Создание плагина, в котором вы одновременно управляете старым школьным управлением памятью Carbon, управлением памятью в стиле COM и управлением памятью из какао / нового стиля, может быть невероятной болью - и это полностью игнорирует тот факт, что вы будете взаимодействие в трех или более принципиально разных API, с различными соглашениями об именах и семантикой вызовов. Называть ситуацию истерически бедной было бы огромным преуменьшением.
С другой стороны, Finder в Mac OS X 10.6 Snow Leopard был полностью переписан в Какао - и с этим значительно улучшены интерфейсы плагинов. Если вам повезло оказаться в ситуации, когда вы можете нацеливаться только на Snow Leopard, вам, вероятно, следует получить членство в ADC Premier или более поздней версии, загрузить предварительные сборки и написать код против этого. Кроме того, ваш плагин может не работать на 10.6 в любом случае без переписывания Какао, поэтому, возможно, имеет смысл взглянуть на Snow Leopard до его выпуска, несмотря ни на что.
Пример проекта Finder Icon Overlay представляет собой небольшой и очень простой, но на самом деле рабочий пример ответа ниже.
https://github.com/lesnie/Finder-Icon-Overlay
Я знаю, что это так старо, но некоторые могут все еще интересоваться темой (?)
Вот что я сделал под Leopard (10.6). Сначала нужны правильные заголовки Finder. Используйте инструмент дамп класса, чтобы получить его. Затем напишите свой код в виде плагина SIMBL (обратитесь к документации, как это сделать), используя несколько методов. Например, чтобы нарисовать что-то поверх значка в ListView, drawIconWithFrame: метод метода TIconAndTextCell должен быть переопределен.
Вот код для метода Swizzling:
+ (void) Plugin_load
{
Method old, new;
Class self_class = [self class];
Class finder_class = [objc_getClass("TIconAndTextCell") class];
class_addMethod(finder_class, @selector(FT_drawIconWithFrame:),
class_getMethodImplementation(self_class, @selector(FT_drawIconWithFrame:)),"v@:{CGRect={CGPoint=dd}{CGSize=dd}}");
old = class_getInstanceMethod(finder_class, @selector(drawIconWithFrame:));
new = class_getInstanceMethod(finder_class, @selector(FT_drawIconWithFrame:));
method_exchangeImplementations(old, new);
}
Я переопределяю метод "drawIconWithFrame:" своим методом "FT_drawIconWithFrame:". Ниже приведен пример реализации этого метода.
- (void) FT_drawIconWithFrame:(struct CGRect)arg1
{
[self FT_drawIconWithFrame:arg1];
if ([self respondsToSelector:@selector(node)]) {
if ([[[[NSClassFromString(@"FINode") nodeWithFENode:[(TNodeIconAndNameCell *)self node]] fullPath] lastPathComponent] hasPrefix:@"A"])
[myPrettyIconOverlayImage drawInRect:NSMakeRect(arg1.origin.x, arg1.origin.y, arg1.size.height, arg1.size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
}
}
По сути, он рисует "myPrettyIconOverlayImage" над каждым значком файла с именем файла, начинающимся с буквы "A". Эта логика зависит от вас.
Обратите внимание на эту строку: [self FT_drawIconWithFrame:arg1];
это как назвать "супер", чтобы получить нормальный значок и имя и т. д. Я знаю, выглядит странно, как цикл, но на самом деле это не так. Затем включите плагин SIMBL, установите SIMBL и... запустите.
Из-за изменений в Lion некоторая работа должна быть сделана с нуля (создайте новый файл "Finder.h" со всеми необходимыми объявлениями, найдите правильный класс и методы для переопределения), но этот метод все еще работает.
Счастливого взлома!
Для Yosemite (MacOS 10.10 и новее) вы можете использовать инфраструктуру Apple FinderSync, которая позволяет расширениям Finder:
- Выразить интерес к определенной иерархии папок
- Предоставьте "значки", чтобы указать статус элементов в этих иерархиях
- Предоставление динамических пунктов меню в контекстных меню Finder, когда выбранные элементы (или цель окна) находятся в этих иерархиях
- Предоставьте элемент панели инструментов, который отображает меню с динамическими элементами (даже если выбор не связан)
Для Finder не существует официальной или поддерживаемой системы плагинов. Начиная с OS X 10.6, вам нужно будет внедрить код в процесс Finder и переопределить целевые методы C в процессе Finder.
Я сделал это для частного проекта. Я могу сказать вам, что причина, по которой нет примеров или учебных пособий, заключается в том, что это довольно сложная и трудоемкая задача разработки. По этой причине у частных лиц или организаций, которые достигли этого, есть множество стимулов для тщательного отслеживания специфики своего процесса.
Если есть какой-либо способ, которым вы можете достичь своей цели с помощью API служб, сделайте это. Написание плагина Finder займет у вас 1-2 месяца кропотливого кропотливого развития и достаточно глубокое знание внутренних компонентов C и Objective-C.
Если вы все еще уверены, что хотите сделать это, возьмите mach_star. Удачи.
Вот законченное решение для значков Finder и контекстных меню в Lion и Mountain Lion с использованием методов, описанных Les Nie.
Liferay Nativity предоставляет пакет сценариев, который будет использовать соответствующие методы Finder, и Java-клиент для настройки значков и контекстных меню. Он также включает в себя эквивалентные проекты для Windows и Linux.
Проект с открытым исходным кодом под LGPL, так что не стесняйтесь вносить любые исправления ошибок или улучшения!
Насколько я знаю, нет официальной архитектуры плагинов для Finder. Возможно, вы сможете добавить наложение изображений на значки через внешнее приложение, не подключаясь к Finder, хотя это не произойдет на лету. Я не думаю, что есть способ добавить элементы контекстного меню, кроме действий с папками и Automator. Вы также можете написать внешнее приложение для мониторинга изменений файловой системы с помощью FSEvents API.
Сборы тонкие; Мне никогда не было ясно, действительно ли плагины Finder поддерживаются. Тем не менее, еще несколько потенциальных клиентов:
- SampleCMPlugIn - Конечно, на основе углерода, так как это Finder. Обратите внимание, что почти любой плагин Finder, вероятно, перестанет работать с 10.6.
- Automator может сохранять вещи как "плагин Finder". Это более поддерживаемая версия того, что вы обсуждаете, но, конечно, менее гибкая.
Чтобы добавить кросс-платформенные наложения значков Finder/File и контекстные меню из Java, посмотрите библиотеку Liferay Nativity.
Я также упоминаю об этом в другом посте SO, который также содержит ссылки на документы и API Apple 'Finder Sync'.