it-swarm.dev

Come scrivere il plugin OS X Finder

Sto cercando una guida o un codice di esempio per scrivere plugin per Mac OS X Finder? Vorrebbe sapere come fare alcune semplici azioni:

  1. aggiungere sovrapposizioni di immagini alle icone
  2. aggiungere voci del menu contestuale
  3. ascolta le modifiche ai file

Ho trovato le seguenti due risorse:

Sono tentato di rivedere il codice SCPlugin, ma speravo di trovare un campione più semplice da digerire.

46
notnoop

Purtroppo, programmare un plugin per Finder in realtà fa richiede ancora di sporcarsi le mani con COM. Se si guarda il sottoprogetto SCFinderPlugin del progetto SCPlugin, si scoprirà che segue esattamente le stesse tecniche delineate nel primo collegamento, inclusa l'impostazione di un vtable per COM, la scrittura di funzioni AddRef/ReleaseRef e così via. La scrittura di un plug-in, in cui si gestiscono contemporaneamente la gestione della memoria del carbonio della vecchia scuola, la gestione della memoria in stile COM e la gestione della memoria del carbonio Cocoa/nuovo stile, può essere un dolore incredibile e ignora totalmente il fatto che sarete interagire in tre o più API radicalmente differenti, con diverse convenzioni di denominazione e semantica chiamante. Chiamare la situazione istericamente povera sarebbe un eufemismo.

Sul lato positivo, il Finder di Mac OS X 10.6 Snow Leopard è stato completamente riscritto in Cocoa - e con questo le interfacce di plugin sono notevolmente superiori. Se sei abbastanza fortunato da trovarti in una situazione in cui puoi effettivamente bersagliare Snow Leopard, probabilmente dovresti prendere un abbonamento ADC Premier o superiore, scaricare i build prerelease e il codice contro questo. Inoltre, il tuo plugin potrebbe non funzionare su 10.6 in ogni caso senza una riscrittura di Cocoa, quindi potrebbe essere sensato dare un'occhiata a Snow Leopard prima che venga rilasciato, a prescindere.

17
Benjamin Pollack

Il Finder Icon Overlay example project rappresenta un esempio piccolo e molto semplice ma effettivamente funzionante della risposta seguente.

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

So che è così vecchio, ma alcuni potrebbero essere ancora interessati all'argomento (?)

Ecco cosa ho fatto sotto Leopard (10.6). All'inizio sono necessarie le intestazioni di Finder appropriate. Usa lo strumento dump di classe per ottenerlo. Quindi scrivi il tuo codice come plugin SIMBL (fai riferimento alla documentazione su come farlo), scambiando alcuni metodi. Ad esempio, per disegnare qualcosa sopra un'icona in ListView, drawIconWithFrame: il metodo del metodo TIconAndTextCell deve essere sovrascritto.

Ecco il codice per il metodo 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);

}

Sto sovrascrivendo il metodo "drawIconWithFrame:" con il mio metodo "FT_drawIconWithFrame:". Di seguito è riportata l'implementazione di esempio per questo metodo.

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

In pratica disegna "myPrettyIconOverlayImage" su ogni icona per il file con il nome del file che inizia con la lettera "A". Questa logica dipende da te.

Presta attenzione a questa riga: [self FT_drawIconWithFrame:arg1]; questo è come chiamare 'super' per ottenere un'icona e un nome normali ecc. Lo so, sembra strano, come il loop, ma in realtà non lo è. Quindi connettiti al plugin SIMBL, installa SIMBL e ... esegui.

A causa dei cambiamenti in Lion, alcuni lavori devono essere fatti da zero (creare un nuovo file "Finder.h" con tutte le dichiarazioni necessarie in esso, trovare classi e metodi appropriati per l'override), ma questa tecnica funziona ancora. 

Happy hacking!

28
Les Nie

Per Yosemite (MacOS 10.10 e successivi), è possibile utilizzare il framework Apple FinderSync , che consente alle estensioni del Finder di:

  • Esprimere interesse in specifiche gerarchie di cartelle 
  • Fornire "badge" a Indica lo stato degli elementi all'interno di tali gerarchie 
  • Fornire voci di menu Dinamiche nel menu contestuale del Finder, quando gli elementi selezionati (o L'obiettivo della finestra) si trovano in tali gerarchie 
  • Fornire un elemento barra degli strumenti Che visualizza un menu con elementi dinamici (anche se la selezione è Non correlata)
22

Non esiste un sistema di plugin ufficiale o supportato per il Finder. A partire da OS X 10.6, sarà necessario inserire il codice nel processo Finder e sovrascrivere i metodi Objective C nel processo Finder.

L'ho fatto per un progetto proprietario. Posso dirvi che la ragione per cui non ci sono esempi o tutorial per questo è perché è un'attività di sviluppo molto difficile e dispendiosa in termini di tempo. Per questo motivo, ci sono molti incentivi per le persone o le organizzazioni che hanno compiuto questo compito per proteggere da vicino le specifiche del loro processo.

Se esiste un modo per raggiungere l'obiettivo utilizzando l'API dei servizi, fallo. Scrivere un plugin per Finder ti porta 1-2 solido mesi di accurato sviluppo e conoscenza ragionevolmente profonda degli interni di C e di Objective-C.

Se sei ancora convinto di volerlo fare, prendi mach_star . In bocca al lupo.

14
anthony

Ecco una soluzione completa per i badge icona di Finder e i menu contestuali di Lion e Mountain Lion, utilizzando le tecniche descritte da Les Nie.

Presepi Liferay fornisce un pacchetto di scripting che sfrutterà i metodi Finder rilevanti e un client Java per l'impostazione di icone e menu contestuali. Include anche progetti equivalenti per Windows e Linux.

Il progetto è open source sotto LGPL, quindi sentiti libero di contribuire con eventuali correzioni di bug o miglioramenti!

2
dejuknow

Per quanto ne so, non esiste un'architettura plugin ufficiale per il Finder. Potresti essere in grado di aggiungere sovrapposizioni di immagini alle icone tramite un'applicazione esterna senza dover agganciare il Finder, anche se non sarebbe al volo. Non penso che ci sia un modo per aggiungere voci di menu contestuali oltre a Folder Actions e Automator. Puoi anche cercare di scrivere un'applicazione esterna per monitorare le modifiche del File System usando l'API FSEvents .

2
Martin Gordon

Le raccolte sono magre; non è mai stato chiaro per me se i Plugin del Finder sono effettivamente supportati. Alcuni altri indizi, però:

  • SampleCMPlugIn - Carbon-based, naturalmente, poiché lo è anche Finder. Nota che quasi tutti i plugin di Finder probabilmente smetteranno di funzionare con 10.6.
  • Automator può salvare le cose come un "plugin del Finder". È una versione più supportata di ciò che stai discutendo, ma ovviamente meno flessibile.
1
Rob Napier

Per aggiungere overlay icona Finder/File Browser e menu contestuali, in modo multipiattaforma, da Java, dare un'occhiata a Liferay Nativity library.

Ne parlo anche in un altro SO post , che contiene anche collegamenti ai documenti e alle API di Apple "Finder Sync".

0
Big Rich