2009-08-18 3 views
45

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

  1. добавляющего overlayers изображений в иконки
  2. добавляющих пунктов контекстного меню
  3. прослушать файл изменение

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

  • Writing Contextual Menu Plugins for OS X: устаревший документ от 2002 года, который использует API COM тарг ting Mac OS X 8/9.
  • SCPlugin Приложение с открытым исходным кодом SVN Mac, которое включает в себя плагин Finder.

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

+2

Прошло некоторое время с этого поста, с 10.6 легкодоступными. Вы достигли того, что пытались? Вы пошли с тактикой плагина Finder? – epologee

+1

Любые обновления по этому поводу для льва? – Tony

+0

@ LesNie ниже ссылки на его проект [Настроить значок значка] (https://github.com/lesnie/Finder-Icon-Overlay). Связывание в случае, если кто-либо еще сталкивается с трудностями при поиске примера с открытым исходным кодом OS X Finder Plugin (как и я). – pkamb

ответ

16

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

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

+0

спасибо за объяснение. Я просто подожду публичного релиза Snow Leopard. – notnoop

+1

Любая идея, где я могу найти информацию о упомянутых интерфейсах плагина Finder (для OS X Lion)? – jsherk

+0

К сожалению, не упоминается. Плагины, которые я знаю (например, Dropbox), работают, вводя себя в Finder через Mach, звонят — не совсем так, как я думал, Apple в то время. –

1

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

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

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

14

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

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

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

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

28

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

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» над каждым значком файла с именем файла начинается с буквы «А». Эта логика зависит от вас.

Обратите внимание на эту строку: [self FT_drawIconWithFrame:arg1]; вот как называть «супер», чтобы получить нормальный значок и имя и т. Д. Я знаю, выглядит странно, как цикл, но на самом деле это не так. Затем включите плагин SIMBL, установите SIMBL и ... запустите.

Из-за изменений в Lion необходимо выполнить некоторые работы с нуля (создать новый файл Finder.h со всеми необходимыми объявлениями, найти подходящую классность и методы для переопределения), но этот метод все еще работает.

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

+0

После использования этого кода вы не сможете продать свой продукт в магазине приложений Apple. –

+0

Да, я тоже согласен с @jennifer .. то, что вы делаете, не выглядит полностью законным –

+4

Возможно, да. Тем не менее это единственный способ, с помощью которого вы можете достичь такой функциональности (наложения значков) в Finder. Это может быть причиной того, что Dropbox не работает в AppStore. –

2

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

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

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

21

Для Йосемиты (MacOS 10.10 & выше), вы можете использовать Apple, FinderSync framework, что позволяет расширения Finder для:

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

thumb up для этой информации! –

0

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

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

Смежные вопросы