web-dev-qa-db-fra.com

Comment écrire le plugin OS X Finder

Je cherche un guide ou un exemple de code pour l'écriture de plugins Mac OS X Finder? Il voudrait savoir faire quelques gestes simples:

  1. ajout de calques d'image aux icônes
  2. ajout d'éléments de menu contextuel
  3. écouter les modifications de fichiers

J'ai trouvé les deux ressources suivantes:

Je suis tenté de passer en revue le code SCPlugin, mais espérais trouver un échantillon plus facile à digérer.

46
notnoop

Malheureusement, pour programmer un plugin Finder, do nécessite toujours de se salir les mains avec COM. Si vous examinez le sous-projet SCFinderPlugin du projet SCPlugin, vous constaterez qu'il applique 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. Écrire un plug-in, où vous gérez simultanément la gestion de la mémoire Carbon à l'ancienne, la gestion de la mémoire de style COM et la gestion de la mémoire Carbon de Cocoa/new-style, peut être une douleur incroyable - et cela ignore totalement le fait que vous soyez interagir dans au moins trois API radicalement différentes, avec des conventions de dénomination et une sémantique d'appel différentes. Appeler la situation hystériquement pauvre serait un énorme euphémisme.

Du côté positif, le Finder de Mac OS X 10.6 Snow Leopard a été entièrement réécrit dans Cocoa - et avec cela des interfaces de plug-in considérablement supérieures. Si vous avez la chance d'être dans une situation où vous ne pouvez cibler que Snow Leopard, vous devriez probablement saisir un abonnement ADC Premier ou supérieur, télécharger les versions préliminaires et coder en conséquence. De plus, votre plugin risque de ne pas fonctionner sous 10.6 de toute façon sans une réécriture de Cocoa. Il serait donc logique de jeter un coup d'œil à Snow Leopard avant qu'il ne soit publié, peu importe.

17
Benjamin Pollack

Le projet Finder Icon Overlay example représente un exemple petit et très basique, mais réellement fonctionnel, de la réponse ci-dessous.

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

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

Voici ce que j'ai fait sous Léopard (10.6). Au début, les en-têtes appropriés 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 le faire), en analysant quelques méthodes. Par exemple, pour dessiner quelque chose sur l'icône dans ListView, drawIconWithFrame: method de la méthode TIconAndTextCell doit être remplacé.

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 la méthode "FT_drawIconWithFrame:". Vous trouverez ci-dessous un exemple de mise en œuvre pour cette méthode.

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

Essentiellement, il dessine "myPrettyIconOverlayImage" sur chaque icône du 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" afin d'obtenir une icône et un nom normaux, etc. Je sais, ça a l'air bizarre, comme une boucle, mais en réalité ça ne l'est pas. Ensuite, insérez SIMBL dans le plugin, installez SIMBL et ... lancez.

En raison de changements dans Lion, certains travaux doivent être effectués à partir de zéro (créer un nouveau fichier "Finder.h" avec toutes les déclarations nécessaires, trouver la classe appropriée et les méthodes à remplacer), mais cette technique fonctionne toujours. 

Bonne piratage!

28
Les Nie

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

  • Exprimer son intérêt pour des hiérarchies de dossiers spécifiques 
  • Fournissez des "badges" à Pour indiquer le statut des éléments à l'intérieur de ces hiérarchies. 
  • Fournissez des éléments dynamiquesmenu 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. 
  • Fournissez un élément de la barre d’outils Qui affiche un menu avec des éléments dynamiques (même si la sélection est Non liée)
22
Michael Dautermann

Il n'y a pas de système de plugin officiel ou supporté pour le Finder. À partir de OS X 10.6, vous devez injecter du code dans le processus du Finder et remplacer les méthodes 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’existe aucun exemple ou tutoriel à cet égard est qu’il s’agit d’une tâche de développement extrêmement difficile et qui prend du temps. Pour cette raison, les individus ou les organisations qui ont accompli cela ont tout intérêt à surveiller de près les détails de leur processus.

Si vous pouvez atteindre votre objectif à l'aide de l'API Services, faites-le. Écrire un plugin Finder vous demandera entre 1 et solide mois de développement laborieux et une connaissance assez approfondie des éléments internes de C et d'Objective-C.

Si vous êtes toujours convaincu de vouloir faire cela, saisissez mach_star . Bonne chance.

14
anthony

Voici une solution complète pour les badges d’icône du 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 analysera les méthodes de recherche appropriées et un client Java permettant de définir les icônes et les menus contextuels. Il inclut également des projets équivalents pour Windows et Linux.

Le projet est open source sous LGPL, alors n'hésitez pas à contribuer aux corrections de bugs ou aux améliorations!

2
dejuknow

Autant que je sache, il n'y a pas d'architecture de plugin officielle pour le Finder. Vous pourrez peut-être ajouter des superpositions d'images à des icônes via une application externe sans avoir à vous connecter au Finder, même si cela ne se fait pas à la volée. Je ne pense pas qu'il soit possible d'ajouter des éléments de menu contextuels en dehors de Folder Actions et Automator. Vous pouvez également envisager d'écrire une application externe pour surveiller les modifications du système de fichiers à l'aide de FSEvents API .

2
Martin Gordon

Les cueillettes sont minces; il n'a jamais été vraiment clair pour moi si les plugins Finder sont réellement supportés. Quelques autres pistes, cependant:

  • SampleCMPlugIn - À base de carbone bien sûr, tout comme le Finder. Notez que presque tous les plugins du Finder vont probablement cesser de fonctionner avec 10.6.
  • Automator peut enregistrer des choses sous forme de "plug-in Finder". C'est une version plus supportée de ce dont vous parlez, mais bien sûr moins flexible.
1
Rob Napier

Pour ajouter des superpositions d'icônes du navigateur Finder/File et des menus contextuels, de manière multiplateforme, depuis Java, consultez la bibliothèque Liferay Nativity .

Je mentionne également cela dans un autre SO post , qui contient également des liens vers la documentation et l'API "Finder Sync" d'Apple.

0
Big Rich