Bug 1037433 - Update the image of an NSStatusItem when the image of its corresponding NSMenuItem changes. r=smichaud

This commit is contained in:
Markus Stange 2014-07-18 21:09:19 +02:00
parent 42401caa11
commit f4ad7f7695
3 changed files with 30 additions and 0 deletions

View File

@ -21,13 +21,20 @@ public:
// nsMenuObjectX
nsMenuObjectTypeX MenuObjectType() { return eStandaloneNativeMenuObjectType; }
void * NativeData() { return mMenu != nullptr ? mMenu->NativeData() : nullptr; }
virtual void IconUpdated() MOZ_OVERRIDE;
nsMenuX * GetMenuXObject() { return mMenu; }
// If this menu is the menu of a system status bar item (NSStatusItem),
// let the menu know about the status item so that it can propagate
// any icon changes to the status item.
void SetContainerStatusBarItem(NSStatusItem* aItem);
protected:
virtual ~nsStandaloneNativeMenu();
nsMenuX * mMenu;
NSStatusItem* mContainerStatusBarItem;
};
#endif

View File

@ -18,6 +18,7 @@ NS_IMPL_ISUPPORTS_INHERITED(nsStandaloneNativeMenu, nsMenuGroupOwnerX,
nsStandaloneNativeMenu::nsStandaloneNativeMenu()
: mMenu(nullptr)
, mContainerStatusBarItem(nil)
{
}
@ -197,3 +198,18 @@ nsStandaloneNativeMenu::ForceUpdateNativeMenuAt(const nsAString& indexString)
return NS_OK;
}
void
nsStandaloneNativeMenu::IconUpdated()
{
if (mContainerStatusBarItem) {
[mContainerStatusBarItem setImage:[mMenu->NativeMenuItem() image]];
}
}
void
nsStandaloneNativeMenu::SetContainerStatusBarItem(NSStatusItem* aItem)
{
mContainerStatusBarItem = aItem;
IconUpdated();
}

View File

@ -53,10 +53,17 @@ nsSystemStatusBarCocoa::StatusItem::StatusItem(nsStandaloneNativeMenu* aMenu)
mStatusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
[mStatusItem setMenu:nativeMenu];
[mStatusItem setHighlightMode:YES];
// We want the status item to get its image from menu item that mMenu was
// initialized with. Icon loads are asynchronous, so we need to let the menu
// know about the item so that it can update its icon as soon as it has
// loaded.
mMenu->SetContainerStatusBarItem(mStatusItem);
}
nsSystemStatusBarCocoa::StatusItem::~StatusItem()
{
mMenu->SetContainerStatusBarItem(nil);
[[NSStatusBar systemStatusBar] removeStatusItem:mStatusItem];
[mStatusItem release];
mStatusItem = nil;