Skip to content

Commit 0b3fda0

Browse files
committed
[OSX] Add iconIsTemplate property to MenuItem API objects
Add boolean property (defaults to `true`) `iconsIsTemplate` to `MenuItem` objects to allow for proper display of icons in Mac OS X (Yosemite) Dark Menus. When `iconsIsTemplate` is set to true, the `icon` is treated as a "template" and the system automatically ensures proper styling according to the various states of the menu item (e.g. dark menu, light menu, etc.). Template images should consist only of black and clear colours and can use the alpha channel in the image to adjust the opacity of black content. See [Dark Menus in AppKit Release Notes for OS X v10.10](https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/#10_10DarkMenus) and [`NSImage setTemplate:`](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSImage_Class/index.html#//apple_ref/occ/instm/NSImage/setTemplate:). On Linux and Windows setting the property has no effect. FIX nwjs#2773
1 parent 92ec44c commit 0b3fda0

File tree

6 files changed

+38
-0
lines changed

6 files changed

+38
-0
lines changed

src/api/menuitem/menuitem.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ void MenuItem::Call(const std::string& method,
5050
std::string icon;
5151
arguments.GetString(0, &icon);
5252
SetIcon(icon);
53+
} else if (method == "SetIconIsTemplate") {
54+
bool isTemplate;
55+
arguments.GetBoolean(0, &isTemplate);
56+
SetIconIsTemplate(isTemplate);
5357
} else if (method == "SetTooltip") {
5458
std::string tooltip;
5559
arguments.GetString(0, &tooltip);

src/api/menuitem/menuitem.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,15 @@ class MenuItem : public Base {
8282
void SetChecked(bool checked);
8383
void SetSubmenu(Menu* sub_menu);
8484

85+
// Template icon works only on Mac OS X
86+
void SetIconIsTemplate(bool isTemplate);
87+
8588
#if defined(OS_MACOSX)
8689
std::string type_;
8790

8891
NSMenuItem* menu_item_;
8992
MenuItemDelegate* delegate_;
93+
bool iconIsTemplate;
9094

9195
#elif defined(OS_WIN) || defined(OS_LINUX)
9296
friend class MenuDelegate;

src/api/menuitem/menuitem.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ function MenuItem(option) {
4646
option.icon = nw.getAbsolutePath(option.icon);
4747
}
4848

49+
if (option.hasOwnProperty('iconIsTemplate'))
50+
option.iconIsTemplate = Boolean(option.iconIsTemplate);
51+
else
52+
option.iconIsTemplate = true;
53+
4954
if (option.hasOwnProperty('tooltip'))
5055
option.tooltip = String(option.tooltip);
5156

@@ -116,6 +121,14 @@ MenuItem.prototype.__defineSetter__('icon', function(val) {
116121
this.handleSetter('icon', 'SetIcon', String, real_path);
117122
});
118123

124+
MenuItem.prototype.__defineGetter__('iconIsTemplate', function() {
125+
return this.handleGetter('iconIsTemplate');
126+
});
127+
128+
MenuItem.prototype.__defineSetter__('iconIsTemplate', function(val) {
129+
this.handleSetter('iconIsTemplate', 'SetIconIsTemplate', Boolean, val);
130+
});
131+
119132
MenuItem.prototype.__defineGetter__('tooltip', function() {
120133
return this.handleGetter('tooltip');
121134
});

src/api/menuitem/menuitem_gtk.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ void MenuItem::SetIcon(const std::string& icon) {
124124
}
125125
}
126126

127+
void MenuItem::SetIconIsTemplate(bool isTemplate) {
128+
}
129+
127130
void MenuItem::SetTooltip(const std::string& tooltip) {
128131
gtk_widget_set_tooltip_text(menu_item_, tooltip.c_str());
129132
}

src/api/menuitem/menuitem_mac.mm

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@
7171
if (option.GetBoolean("enabled", &enabled))
7272
SetEnabled(enabled);
7373

74+
bool isTemplate;
75+
if (option.GetBoolean("iconIsTemplate", &isTemplate))
76+
SetIconIsTemplate(isTemplate);
77+
7478
std::string icon;
7579
if (option.GetString("icon", &icon) && !icon.empty())
7680
SetIcon(icon);
@@ -131,13 +135,20 @@
131135
if (!icon.empty()) {
132136
NSImage* image = [[NSImage alloc]
133137
initWithContentsOfFile:[NSString stringWithUTF8String:icon.c_str()]];
138+
[image setTemplate:iconIsTemplate];
134139
[menu_item_ setImage:image];
135140
[image release];
136141
} else {
137142
[menu_item_ setImage:nil];
138143
}
139144
}
140145

146+
void MenuItem::SetIconIsTemplate(bool isTemplate) {
147+
iconIsTemplate = isTemplate;
148+
if ([menu_item_ image] != nil)
149+
[[menu_item_ image] setTemplate:isTemplate];
150+
}
151+
141152
void MenuItem::SetTooltip(const std::string& tooltip) {
142153
[menu_item_ setToolTip:[NSString stringWithUTF8String:tooltip.c_str()]];
143154
}

src/api/menuitem/menuitem_views.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ void MenuItem::SetIcon(const std::string& icon) {
134134
package->GetImage(base::FilePath::FromUTF8Unsafe(icon), &icon_);
135135
}
136136

137+
void MenuItem::SetIconIsTemplate(bool isTemplate) {
138+
}
139+
137140
void MenuItem::SetTooltip(const std::string& tooltip) {
138141
tooltip_ = base::UTF8ToUTF16(tooltip);
139142
if (menu_)

0 commit comments

Comments
 (0)