Подтвердить что ты не робот

Как написать плагин OS X Finder

Я ищу руководство или образец кода для написания плагинов Mac OS X Finder? Он хотел бы знать, как выполнять некоторые простые действия:

  • добавление наложения изображений к значкам
  • добавление пунктов контекстного меню
  • слушать изменения файлов

Я нашел следующие два ресурса:

Я испытываю соблазн рассмотреть код SCPlugin, но надеялся найти более простой образец для переваривания.

4b9b3361

Ответ 1

К сожалению, программирование плагина Finder по-прежнему требует, чтобы ваши руки были загрязнены COM. Если вы посмотрите на подпроект SCFinderPlugin проекта SCPlugin, вы обнаружите, что он соответствует точно таким же методам, изложенным в вашей первой ссылке, включая настройку vtable для COM, запись функций AddRef/ReleaseRef и т.д. Написание плагина, в котором вы одновременно управляете управлением памятью Carbon в старой школе, управлением памятью в стиле COM и управлением памятью памяти Cocoa/new-style, может быть невероятной болью и полностью игнорирует тот факт, будут взаимодействовать в трех или более радикально различных API-интерфейсах с различными соглашениями об именах и семантикой вызова. Вызов ситуации истерически бедных был бы огромным преуменьшением.

С яркой стороны Finder в Mac OS X 10.6 Snow Leopard полностью переписан в Cocoa - и с этим выходят значительно более совершенные интерфейсы плагина. Если вам посчастливилось оказаться в ситуации, когда вы на самом деле можете ориентироваться только на Snow Leopard, вы, вероятно, должны получить ADC Premier или более высокое членство, загрузите предварительные сборки и код против этого. Кроме того, ваш плагин может вообще не работать на 10.6 без перезаписи Cocoa, поэтому имеет смысл взглянуть на Snow Leopard, прежде чем он будет выпущен независимо.

Ответ 2

Пример прокрутки значка Finder представляет собой небольшой и очень простой, но фактически рабочий пример ответа ниже.

https://github.com/lesnie/Finder-Icon-Overlay

Я знаю, что это так старо, но некоторые могут по-прежнему интересоваться темой (?)

Вот что я сделал в Leopard (10.6). Сначала нужны правильные заголовки Finder. Используйте инструмент класса-дампа, чтобы получить его. Затем напишите свой код как плагин SIMBL (см. Документацию, как это сделать), swizzling некоторые методы. Например, чтобы нарисовать что-то поверх значка в 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:)),"[email protected]:{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 со всеми необходимыми в нем объявлениями, найдите подходящую классность и методы для переопределения), но этот метод все еще работает.

Счастливый взлом!

Ответ 3

Для Yosemite (MacOS 10.10 и новее) вы можете использовать Apple структуру FinderSync, которая позволяет расширениям Finder:

  • Повысить интерес к определенным иерархиям папок.
  • Предоставить "значки" для укажите статус элементов внутри этих иерархий.
  • Обеспечить динамическое пунктов меню в контекстных меню Finder, когда выбранные элементы (или цель окна) находятся в этих иерархиях
  • Предоставить элемент панели инструментов который отображает меню с динамическими элементами (даже если выбор несвязанный)

Ответ 4

Нет официальной или поддерживаемой системы плагинов для Finder. Начиная с OS X 10.6, вам нужно будет ввести код в процесс Finder и переопределить объектные методы C в процессе Finder.

Я сделал это для проприетарного проекта. Я могу сказать вам, что причина, по которой нет примеров или учебников для этого, заключается в том, что это сложная и трудоемкая задача разработки. По этой причине существует множество стимулов для отдельных лиц или организаций, которые достигли этого, чтобы тщательно следить за спецификой их процесса.

Если вы вообще можете достичь своей цели, используя API-интерфейс служб, сделайте это. Написание плагина Finder займет 1-2 твердых месяца кропотливого развития и разумного глубокого знания внутренних и внутренних компонентов Objective-C.

Если вы все еще уверены, что хотите сделать это, возьмите mach_star. Удачи.

Ответ 5

Насколько я знаю, нет официальной архитектуры плагинов для Finder. Возможно, вы сможете добавлять наложения изображений к значкам через внешнее приложение без необходимости подключаться к Finder, хотя он не будет "на лету". Я не думаю, что есть способ добавить элементы контекстного меню, кроме действий Папки и Automator. Вы также можете посмотреть на внешнее приложение для мониторинга изменений файловой системы с помощью API FSEvents.

Ответ 6

Здесь завершено решение для значков значков Finder и контекстных меню в Lion и Mountain Lion с использованием методов, описанных Les Nie.

Liferay Nativity предоставляет набор сценариев, который будет подбирать соответствующие методы Finder и клиент Java для настройки значков и контекстных меню. Он также включает эквивалентные проекты для Windows и Linux.

Проект является открытым исходным кодом под LGPL, поэтому не стесняйтесь вносить какие-либо исправления или улучшения ошибок!

Ответ 7

Сбор тонкий; мне никогда не было действительно ясно, поддерживаются ли плагины Finder. Еще несколько ведет:

  • SampleCMPlugIn - Углеродная основа, конечно, так как это и есть Finder. Обратите внимание, что почти любой плагин Finder, вероятно, перестанет работать с 10.6.
  • Automator может сохранять вещи как "плагин Finder". Это более поддерживаемая версия того, что вы обсуждаете, но, конечно, менее гибкая.

Ответ 8

Чтобы добавить оверлей значков браузера Finder/File и контекстных меню в кросс-платформенном виде из Java, посмотрите Liferay Nativity.

Я также упоминаю об этом в другом сообщении SO, в котором также содержатся ссылки на документы и API Apple Finder Sync.