2009-08-18 9 views
45

Sto cercando una guida o un codice di esempio per scrivere i plug-in di Mac OS X Finder? Si vorrebbe sapere come fare alcune semplici azioni:Come scrivere il plug-in OS X Finder

  1. aggiungendo overlayer immagine alle icone
  2. aggiungendo voci del menu contestuale
  3. ascoltare file cambia

ho trovato i seguenti due risorse:

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

+2

E 'stato un po' di tempo da questo post, con 10.6 prontamente disponibili. Hai raggiunto ciò che stavi cercando? Sei andato con le tattiche del plugin Finder? – epologee

+1

Qualche aggiornamento su questo per leone? – Tony

+0

@LesNie sotto link al suo progetto [Finder Icon Overlay] (https://github.com/lesnie/Finder-Icon-Overlay). Collegamento nel caso in cui qualcun altro abbia difficoltà nel trovare un esempio di plugin per OS X Finder open source (come ho fatto io). – pkamb

risposta

16

Purtroppo, la programmazione di un plug-Finder in realtà fa ancora richiede 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 Carbon della vecchia scuola, la gestione della memoria in stile COM e la gestione della memoria Carbon in stile nuovo o Cocoa, può essere un'incredibile sofferenza — e che ignora totalmente il fatto che sarete interagire in tre o più API radicalmente differenti, con diverse convenzioni di denominazione e semantica chiamante. Definire 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 quello. 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.

+0

grazie per la spiegazione. Aspetterò solo l'uscita pubblica di Snow Leopard. – notnoop

+1

Qualche idea su dove posso trovare informazioni sulle interfacce plugin del Finder citate (per OS X Lion)? – jsherk

+0

Purtroppo non è menzionato. I plug-in che conosco (ad es. Dropbox) funzionano iniettando se stessi nel Finder tramite Mach e chiamano — non esattamente nella direzione in cui pensavo che Apple stesse andando in quel momento. –

1

Le raccolte sono sottili; non è mai stato chiaro per me se i Plugin del Finder sono effettivamente supportati. Un paio di contatti, però:

  • SampleCMPlugIn - a base di carbonio, naturalmente, dal momento che così è Finder. Nota che quasi tutti i plugin per Finder probabilmente smetteranno di funzionare con 10.6.
  • Automator può salvare le cose come un "plug-in Finder". È una versione più supportata di ciò che stai discutendo, ma ovviamente meno flessibile.
2

Per quanto ne so, non esiste un'architettura plug-in ufficiale per il Finder. Potrebbe essere possibile aggiungere sovrapposizioni di immagini a 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. È inoltre possibile esaminare la scrittura di un'applicazione esterna per monitorare le modifiche del file system utilizzando lo FSEvents API.

14

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 C oggettivi nel processo Finder.

Ho fatto questo 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, farlo. Scrivere un plug-in del Finder richiede 1-2 solidi mesi di accurato sviluppo e una conoscenza ragionevolmente profonda degli interni di C e di Objective-C.

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

28

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

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

So che questo è così vecchio, ma alcuni possono essere ancora interessati a tema (?)

Ecco quello che 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 (consulta la documentazione su come farlo), procedendo con alcuni metodi. Ad esempio per disegnare qualcosa su 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 prevalente "drawIconWithFrame:" il metodo 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]; 
    } 
} 

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

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

A causa di modifiche in Lion, alcuni lavori devono essere eseguiti 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!

+0

Dopo aver utilizzato questo codice, non è possibile vendere il prodotto su Apple App Store. –

+0

Sì, anch'io sono d'accordo con @jennifer .. quello che stai facendo non sembra del tutto legale –

+4

Sì, probabilmente. Tuttavia questo è l'unico metodo per raggiungere tale funzionalità (sovrapposizioni di icone) nel Finder. Potrebbe essere la ragione per cui Dropbox non è disponibile in AppStore. –

2

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

Liferay Nativity fornisce un pacchetto di script che converte i metodi Finder rilevanti e un client Java per l'impostazione delle icone e dei menu di scelta rapida. Include anche progetti equivalenti per Windows e Linux.

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

21

Per Yosemite (MacOS 10.10 & più recente), è possibile utilizzare Apple FinderSync framework, che permette estensioni Finder a:

  • espresso interesse per la cartella specifica gerarchie
  • Fornire "badge" per indicare lo stato degli elementi all'interno di quelle gerarchie
  • Fornire dinamiche voci di menu nel menu contestuale del Finder, quando gli elementi selezionati (o la destinazione della finestra) sono in quelle gerarchie
  • Fornire una barra degli strumenti Elemento che visualizza un menu con elementi dinamici (anche se la selezione è correlato)
+0

pollice in su per queste informazioni! –

0

Per aggiungere Finder/file sull'icona del browser sovrapposizioni e menu contestuali, in modo cross-platform, da Java, date un'occhiata alla biblioteca Liferay Nativity.

Ho anche menzionato questo in another SO post, che contiene anche i collegamenti a Apple 'Finder Sync' documenti e API.