Comment écrire le plugin OS X Finder

Je cherche un guide ou un exemple de code pour écrire des plugins Mac OS X Finder? Il aimerait savoir comment faire des actions simples:

  1. append des superpositions d’images aux icons
  2. append des éléments de menu contextuel
  3. écouter les changements de fichiers

J’ai trouvé les deux ressources suivantes:

  • Écriture de plug-ins de menus contextuels pour OS X : un document obsolète de 2002 qui utilise l’API COM ciblant Mac OS X 8/9.
  • SCPlugin : application Mac Open-source SVN qui inclut un plug-in Finder.

Je suis tenté de revoir le code SCPlugin , mais j’espérais trouver un échantillon plus facile à digérer.

Malheureusement, la programmation d’un plugin Finder nécessite toujours de se salir avec COM. Si vous regardez le sous-projet SCFinderPlugin du projet SCPlugin, vous constaterez qu’il suit exactement les mêmes techniques que celles décrites dans votre premier lien, notamment la configuration d’une vtable pour COM, l’écriture de fonctions AddRef / ReleaseRef, etc. Ecrire un plugin, où vous gérez simultanément la gestion de la mémoire carbone, la gestion de la mémoire de style COM et la gestion de la mémoire Cocoa / new-style, peut être une douleur incroyable – et cela ignore totalement le fait que vous serez interagir dans trois API ou plus, avec des conventions de dénomination et une sémantique d’appel différentes. Appeler la situation hystériquement pauvre serait un euphémisme énorme.

Sur le plan positif, le Finder de Mac OS X 10.6 Snow Leopard a été entièrement réécrit en Cocoa. Si vous avez la chance d’être dans une situation où vous ne pouvez cibler que Snow Leopard, vous devez probablement vous procurer un abonnement ADC Premier ou supérieur, télécharger les versions préliminaires et les coder. De plus, votre plugin ne fonctionnera peut-être pas sur 10.6 sans une réécriture de Cocoa. Il serait donc judicieux de jeter un oeil à Snow Leopard avant sa sortie.

L’exemple de projet Finder Icon Overlay représente un petit exemple très simple mais très concret de la réponse ci-dessous.

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

Je sais que c’est si vieux, mais certains peuvent encore être intéressés par le sujet (?)

Voici ce que je l’ai fait sous Leopard (10.6). Au début, les en-têtes du Finder sont nécessaires. Utilisez l’outil de vidage de classe pour l’obtenir. Ensuite, écrivez votre code en tant que plug-in SIMBL (reportez-vous à la documentation pour savoir comment faire), en tapotant certaines méthodes. Par exemple, pour dessiner quelque chose sur l’icône de ListView, drawIconWithFrame: la méthode de la méthode TIconAndTextCell doit être remplacée.

Voici le code pour la méthode 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); } 

Je remplace la méthode “drawIconWithFrame:” par ma méthode “FT_drawIconWithFrame:”. Vous trouverez ci-dessous un exemple d’implémentation pour cette méthode.

 - (void) FT_drawIconWithFrame:(struct CGRect)arg1 { [self FT_drawIconWithFrame:arg1]; if ([self respondsToSelector:@selector(node)]) { if ([[[[NSClassFromSsortingng(@"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]; } } 

Essentiellement, il dessine “myPrettyIconOverlayImage” sur chaque icône pour un fichier dont le nom de fichier commence par la lettre “A”. Cette logique est à vous.

Faites attention à cette ligne: [self FT_drawIconWithFrame:arg1]; c’est comment appeler ‘super’ pour obtenir une icône et un nom normaux, etc. Je sais, a l’air bizarre, comme une boucle, mais en réalité ce n’est pas le cas. Ensuite, intégrez le plug-in SIMBL, installez SIMBL et … exécutez.

En raison de changements dans Lion, il faut travailler à partir de rien (créer un nouveau fichier “Finder.h” avec toutes les déclarations nécessaires, trouver les classes et les méthodes à remplacer), mais cette technique fonctionne toujours.

Heureux piratage!

Pour Yosemite (MacOS 10.10 et versions ultérieures ), vous pouvez utiliser le framework FinderSync d’Apple, qui permet aux extensions du Finder:

  • Exprimer de l’intérêt pour des hiérarchies de dossiers spécifiques
  • Fournir des “badges” pour indiquer le statut des éléments à l’intérieur de ces hiérarchies
  • Fournit des éléments de menu dynamics dans les menus contextuels du Finder, lorsque les éléments sélectionnés (ou la cible de la fenêtre) se trouvent dans ces hiérarchies
  • Fournir un élément de barre d’outils qui affiche un menu avec des éléments dynamics (même si la sélection n’est pas liée)

Il n’y a pas de système de plugin officiel ou supporté pour le Finder. À partir d’OS X 10.6, vous devrez injecter du code dans le processus du Finder et remplacer les méthodes de l’objective C dans le processus du Finder.

Je l’ai fait pour un projet propriétaire. Je peux vous dire que la raison pour laquelle il n’y a pas d’exemples ou de didacticiels est parce que c’est une tâche de développement très difficile et longue. Pour cette raison, il y a beaucoup d’incitatifs pour les individus ou les organisations qui ont accompli cela pour protéger les détails de leur processus.

S’il existe un moyen de réaliser votre objective à l’aide de l’API Services, faites-le. L’écriture d’un plugin Finder vous prendra 1 à 2 mois de développement minutieux et une connaissance raisonnablement approfondie des internes C et Objective-C.

Si vous êtes toujours convaincu que vous voulez faire cela, prenez mach_star . Bonne chance.

Pour autant que je sache, il n’y a pas d’architecture de plugin officielle pour le Finder. Vous pouvez peut-être append des superpositions d’images aux icons via une application externe sans avoir à vous connecter au Finder, bien que cela ne soit pas à la volée. Je ne pense pas qu’il existe un moyen d’append des éléments de menu contextuels en dehors des actions de dossier et Automator. Vous pouvez également envisager d’écrire une application externe pour surveiller les modifications du système de fichiers à l’aide de l’ API FSEvents .

Voici une solution complète pour les badges d’icône Finder et les menus contextuels dans Lion et Mountain Lion en utilisant les techniques décrites par Les Nie.

Liferay Nativity fournit un ensemble de scripts qui basculera entre les méthodes de recherche pertinentes et un client Java pour définir les icons et les menus contextuels. Il comprend également des projets équivalents pour Windows et Linux.

Le projet est open source sous LGPL, alors n’hésitez pas à apporter des corrections ou des améliorations!

Les cueillettes sont minces Je n’ai jamais vraiment compris si les plugins Finder étaient réellement supportés. Quelques pistes supplémentaires:

  • SampleCMPlugIn – Naturellement basé sur le carbone, puisque Finder l’est aussi. Notez que presque tous les plug-ins Finder vont probablement cesser de travailler avec 10.6.
  • Automator peut enregistrer des choses en tant que “plugin Finder”. C’est une version plus supscope de ce dont vous parlez, mais bien sûr moins flexible.

Pour append des superpositions d’icône de navigateur Finder / File et des menus contextuels, de manière multi-plateforme, à partir de Java, consultez la bibliothèque Liferay Nativity .

J’en fais également mention dans une autre publication de SO , qui contient également des liens vers les documents et l’API «Finder Sync» d’Apple.