How come Dropbox gets an icon in Finder sidebar?
How come Dropbox gets a non-generic icon in Finder's sidebar, when other directories like Google Drive and Sites (native in OS X before Lion) all have the same generic one?
How can I customise the icons used by the folders in the sidebar? OS X used to show individual icons of all folders there — not any longer.
Solution 1:
As you've noticed, recent versions of OS X only display generic folder icons in the sidebar. So why does Dropbox get special treatment?
The short answer is that Dropbox uses undocumented API to accomplish this. In non-technical speak, it's a special hack that's installed by the Dropbox application.
Some curious folks on StackOverflow found the specific mechanism used by Dropbox: good ol' mach_inject. The same bundle provides both the toolbar item and the sidebar icon.
If you're curious, the resource files live here (at least, on my system):
/Library/DropboxHelperTools/Dropbox_u502/DropboxBundle.bundle/Contents/Resources
Clearly, Dropbox goes to great lengths in order to integrate seamlessly into the Finder. Lacking similar treatment, other ordinary folders have only generic icons in the sidebar.
Edit 10/1/2015: As of Yosemite (10.10), there is a new, sanctioned Finder Sync API for integration, as doovers points out in another answer. In El Capitan (10.11), System Integrity Protection will not permit the old mach_inject-style approach.
Solution 2:
According to the documentation for the Finder Sync Extension:
You can also use the extension point’s API to add a toolbar button to the Finder window or a sidebar icon for the monitored folder.
I would guess this is what Dropbox uses to achieve this and some/all the other functionality facilitated by this extension. For example you can also:
- Register a set of folders to monitor.
- Receive notifications when the user starts or stops browsing the content of a monitored folder. For example, the extension receives notification when the user opens a monitored folder in the Finder or in an Open or Save dialog.
- Add, remove, and update badges and labels on items in a monitored folder.
- Display a contextual menu when the user Control-clicks an item inside a monitored folder.
- Add a custom button to the Finder’s toolbar.
Edit:
As Mugen mentions below, El Capitan will not allow code injection making FinderSync the only option going forward. With FinderSync only available from 10.10+ the best option would be to case it like:
if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_10) { ... }