2012-07-08 14 views
6

La mia domanda è molto semplice:Mostra le icone nei menu contestuali del dock in OS X?

Per utilizzare un menu personalizzato per l'icona app sul dock, - (NSMenu*) applicationDockMenu: (id) sender; della NSApplicationDelegate deve restituire il menu che il dock visualizzerà.

Utilizzando setImage su un NSMenuItem, è possibile aggiungere icone al menu. Vengono visualizzati nel menu normale, ma non nel menu contestuale dell'icona del dock dell'applicazione.

Allora come ha fatto di Apple QuickTime gestire, XCode, Anteprima per mostrare le icone nella lista degli ultimi file aperti accessibili nel loro menu contestuale dock?

Thx.

risposta

3

La recente lista dei file è in realtà parte del menu icona standard Dock. Per utilizzarlo nella tua app, dovresti creare un'applicazione basata su NSDocument. Usando NSDocument, otterrai gratuitamente il menu/comportamento dei file recenti.

Se l'applicazione non può essere basata su NSDocument, è possibile indicare di cacao di mantenere un elenco dei documenti recenti in base agli URL:

NSDocumentController *docController = [NSDocumentController sharedDocumentController]; 
[docController noteNewRecentDocumentURL:locationOfMyRecentFile1]; 
[docController noteNewRecentDocumentURL:locationOfMyRecentFile2]; 
[docController noteNewRecentDocumentURL:locationOfMyRecentFile3]; 

Si noti che attualmente, -noteNewRecentDocumentURL: supporta solo file:// URL (che è possibile creare da un percorso con +[NSURL fileURLWithPath:].) In futuro, il suo comportamento cambierà presumibilmente per consentire URL con altri schemi.

1

Ecco la mia comprensione, che è in parte congetturali e relativo al dettagli di implementazione:

Il Dock viene eseguito in un processo separato, e non è possibile passare un arbitrario NSImage banalmente attraverso il confine processo dall'applicazione al Dock . Esistono solo due tipi di immagini che possono essere trasmesse correttamente: icone di sistema standard e icone nel pacchetto di risorse. Ma non penso che lo NSImage compia gli incantesimi necessari per far funzionare entrambi.

So you're going to have to use Carbon. In particolare, è necessario utilizzare SetMenuItemIconHandle sia con kMenuSystemIconSelectorType (copre Carbon IconRef s, ottenuti con GetIconRef) o kMenuIconResourceType (CFString s che fanno riferimento a un file .icns nella cartella Risorse del bundle dell'applicazione).

Le intestazioni rilevanti sono <HIToolbox/MacApplication.h> (per GetApplicationDockTileMenu), <HIToolbox/Menus.h> (per SetMenuItemIconHandle) e <HIServices/Icons.h>, (per GetIconRef, se si sta utilizzando icone di sistema).

testato, ma dovrebbe essere simile a questa:

#include <Carbon/Carbon.h> 

SetMenuItemIconHandle(
    GetApplicationDockTileMenu(), 
    [dockMenu indexOfItem:dockMenuItem], 
    kMenuIconResourceType, 
    (Handle) CFSTR("icon.icns") 
); 

potrebbe non essere questo semplice; alcuni di questi possono essere solo a 32 bit.

+0

"Non disponibile per applicazioni a 64 bit." :( – Wevah

+0

Deve esserci qualcos'altro, QuickTime, Anteprima e XCode sono applicazioni a 64 bit –

+0

@MatthieuRiegler Non è qualcosa che 'NSDocumentController' fa? Potrebbe utilizzare un'API Apple privata. –

Problemi correlati