Como escrever o plugin do OS X Finder

Estou procurando um guia ou código de exemplo para escrever plugins do Mac OS X Finder? Gostaria de saber como fazer algumas ações simples:

  1. adicionando superposições de imagem aos icons
  2. adicionando itens do menu de contexto
  3. ouça as alterações nos arquivos

Eu encontrei os dois resources a seguir:

  • Escrevendo Plug-ins de Menu Contextual para o OS X : Um documento desatualizado de 2002 que usa a API COM que tem como alvo o Mac OS X 8/9.
  • SCPlugin : aplicativo Mac SVN de código aberto que inclui um plug-in do Finder.

Estou tentado a rever o código SCPlugin , mas esperava encontrar uma amostra mais fácil de digerir.

    Infelizmente, a programação de um plugin do Finder, na verdade , ainda exige que você fique suja com o COM. Se você olhar para o subprojeto SCFinderPlugin do projeto SCPlugin, verá que segue exatamente as mesmas técnicas descritas em seu primeiro link, incluindo a configuração de uma vtable para COM, a gravação de funções AddRef / ReleaseRef e assim por diante. Escrever um plugin, no qual você gerencia simultaneamente o gerenciamento de memory Carbono da velha guarda, o gerenciamento de memory no estilo COM e o gerenciamento de memory Cocoa / estilo New Carbon, pode ser uma dor incrível – e isso ignora totalmente o fato de que você será interagindo em três ou mais APIs radicalmente diferentes, com diferentes convenções de nomenclatura e semântica de chamada. Chamar a situação de histericamente pobre seria um enorme eufemismo.

    No lado positivo, o Finder no Mac OS X 10.6 Snow Leopard foi totalmente reescrito em Cocoa – e com isso vêm interfaces de plugins muito superiores. Se você tiver sorte o suficiente para estar em uma situação na qual você pode apenas segmentar o Snow Leopard, provavelmente você deve obter uma associação ADC Premier ou superior, baixar as compilações de pré-lançamento e codificar isso. Além disso, o seu plugin pode não funcionar no 10.6 de qualquer forma sem uma reescrita do Cocoa, por isso pode fazer sentido dar uma olhada no Snow Leopard antes de ser lançado, independentemente.

    O projeto de exemplo Finder Icon Overlay representa um exemplo pequeno e muito básico, mas na verdade funcional da resposta abaixo.

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

    Eu sei que isso é tão antigo, mas alguns ainda podem estar interessados ​​em tópicos (?)

    Aqui está o que eu fiz no Leopard (10.6). Primeiramente, os headers do Finder são necessários. Use a ferramenta de despejo de class para obtê-lo. Em seguida, escreva seu código como um plugin SIMBL (consulte a documentação sobre como fazer isso), misturando alguns methods. Por exemplo, para desenhar algo sobre o ícone em ListView, o método drawIconWithFrame: do método TIconAndTextCell deve ser substituído.

    Aqui está o código para o método 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); } 

    Eu estou substituindo o método “drawIconWithFrame:” pelo método “FT_drawIconWithFrame:”. Abaixo está a implementação de amostra para este método.

     - (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]; } } 

    Essencialmente, ele desenha “myPrettyIconOverlayImage” sobre cada ícone para o arquivo com o nome do arquivo iniciado com a letra “A”. Essa lógica é com você.

    Preste atenção a esta linha: [self FT_drawIconWithFrame:arg1]; isso é como chamar ‘super’ para obter o ícone e o nome normal, etc. Eu sei, parece estranho, como loop, mas na verdade não é. Em seguida, envolva o plugin SIMBL, instale o SIMBL e … execute.

    Devido a mudanças no Lion, algum trabalho tem que ser feito do zero (faça o novo arquivo “Finder.h” com todas as declarações necessárias nele, encontre classs e methods apropriados para sobrescrever), mas esta técnica ainda funciona.

    Hacker feliz!

    Para o Yosemite (MacOS 10.10 e mais recente), você pode usar a estrutura FinderSync da Apple, que permite que as extensões do Finder:

    • Expressar interesse em hierarquias de pastas específicas
    • Fornecer “emblemas” para indicar o status dos itens dentro dessas hierarquias
    • Fornecer itens de menu dynamics nos menus contextuais do Finder, quando os itens selecionados (ou o destino da janela) estiverem nessas hierarquias
    • Fornecer um item da barra de ferramentas que exibe um menu com itens dynamics (mesmo se a seleção não estiver relacionada)

    Não existe um sistema de plugins oficial ou suportado para o Finder. A partir do OS X 10.6, você precisará injetar código no processo do Finder e replace os methods da objetiva C no processo do Finder.

    Eu fiz isso por um projeto proprietário. Posso dizer-lhe que a razão pela qual não existem exemplos ou tutoriais para isso é porque é uma tarefa de desenvolvimento significativamente difícil e demorada. Por essa razão, há muito incentivo para indivíduos ou organizações que conseguiram isso para proteger as especificidades de seus processos de perto.

    Se houver alguma maneira de conseguir seu objective usando a API de serviços, faça isso. Escrever um plugin do Finder levará 1-2 meses completos de desenvolvimento meticuloso e um conhecimento razoavelmente profundo dos aspectos internos de C e Objective-C.

    Se você ainda está convencido de que quer fazer isso, pegue mach_star . Boa sorte.

    Até onde sei, não há uma arquitetura de plugins oficial para o Finder. Você pode adicionar superposições de imagem a icons por meio de um aplicativo externo sem precisar conectar-se ao Finder, embora não seja necessário. Eu não acho que há uma maneira de adicionar itens de menu contextuais além de ações de pasta e Automator. Você também pode procurar escrever um aplicativo externo para monitorar as alterações do sistema de arquivos usando a API do FSEvents .

    Aqui está uma solução completa para emblemas com icons do Finder e menus contextuais no Lion e no Mountain Lion usando as técnicas descritas por Les Nie.

    O Liferay Nativity fornece um pacote de scripts que irá migrar os methods relevantes do Finder e um cliente Java para configurar os icons e menus de contexto. Inclui também projetos equivalentes para Windows e Linux.

    O projeto é open source sob LGPL, então fique à vontade para contribuir com correções de bugs ou melhorias!

    As colheitas são pequenas; Nunca foi muito claro para mim se os Plugins do Finder são realmente suportados. Mais alguns leads, no entanto:

    • SampleCMPlugIn – Baseado em carbono, claro, uma vez que assim é o Finder. Note que quase qualquer plugin do Finder provavelmente irá parar de funcionar com o 10.6.
    • O Automator pode salvar coisas como um “plugin do Finder”. É uma versão mais suportada do que você está discutindo, mas é claro, menos flexível.

    Para adicionar as sobreposições de icons do Finder / File e os menus de contexto, de maneira multiplataforma, a partir do Java, dê uma olhada na biblioteca do Liferay Nativity .

    Também faço menção a isso em outro post do SO , que também contém links para documentos e API ‘Finder Sync’ da Apple.