Skip to content

Commit cb36749

Browse files
committed
Merge pull request nwjs#1936 from gitchs/backporting
Backport build-in menu to nw0.8
2 parents d3b3020 + 314f487 commit cb36749

File tree

7 files changed

+196
-0
lines changed

7 files changed

+196
-0
lines changed

nw.gypi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
'src/api/dispatcher.h',
123123
'src/api/dispatcher_bindings.cc',
124124
'src/api/dispatcher_bindings.h',
125+
'src/api/dispatcher_bindings_mac.mm',
125126
'src/api/dispatcher_host.cc',
126127
'src/api/dispatcher_host.h',
127128
'src/api/window_bindings.cc',

src/api/dispatcher_bindings.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ DispatcherBindings::DispatcherBindings()
101101
NULL, // dependencies array.
102102
GetStringResource(
103103
IDR_NW_API_DISPATCHER_BINDINGS_JS).size()) {
104+
#if defined(OS_MACOSX)
105+
InitMsgIDMap();
106+
#endif
104107
}
105108

106109
DispatcherBindings::~DispatcherBindings() {
@@ -136,6 +139,10 @@ DispatcherBindings::GetNativeFunction(v8::Handle<v8::String> name) {
136139
return v8::FunctionTemplate::New(SetCrashDumpDir);
137140
else if (name->Equals(v8::String::New("AllocateId")))
138141
return v8::FunctionTemplate::New(AllocateId);
142+
else if (name->Equals(v8::String::New("GetNSStringWithFixup")))
143+
return v8::FunctionTemplate::New(GetNSStringWithFixup);
144+
else if (name->Equals(v8::String::New("GetNSStringFWithFixup")))
145+
return v8::FunctionTemplate::New(GetNSStringFWithFixup);
139146

140147
NOTREACHED() << "Trying to get an non-exist function in DispatcherBindings:"
141148
<< *v8::String::Utf8Value(name);

src/api/dispatcher_bindings.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ class DispatcherBindings : public v8::Extension {
6262
static void CallStaticMethodSync(const v8::FunctionCallbackInfo<v8::Value>& args);
6363
static void CrashRenderer(const v8::FunctionCallbackInfo<v8::Value>& args);
6464
static void SetCrashDumpDir(const v8::FunctionCallbackInfo<v8::Value>& args);
65+
#if defined(OS_MACOSX)
66+
static void InitMsgIDMap();
67+
static void GetNSStringWithFixup(const v8::FunctionCallbackInfo<v8::Value>& args);
68+
static void GetNSStringFWithFixup(const v8::FunctionCallbackInfo<v8::Value>& args);
69+
#endif
6570

6671
DISALLOW_COPY_AND_ASSIGN(DispatcherBindings);
6772
};

src/api/dispatcher_bindings.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ var nwDispatcher = nwDispatcher || {};
3838
native function CrashRenderer();
3939
native function SetCrashDumpDir();
4040

41+
native function GetNSStringWithFixup();
42+
native function GetNSStringFWithFixup();
43+
4144
nwDispatcher.requireNwGui = RequireNwGui;
4245

4346
// Request a new object from browser
@@ -97,4 +100,8 @@ var nwDispatcher = nwDispatcher || {};
97100
nwDispatcher.crashRenderer = CrashRenderer;
98101
nwDispatcher.setCrashDumpDir = SetCrashDumpDir;
99102
nwDispatcher.allocateId = AllocateId;
103+
104+
nwDispatcher.getNSStringWithFixup = GetNSStringWithFixup;
105+
nwDispatcher.getNSStringFWithFixup = GetNSStringFWithFixup;
106+
100107
})();

src/api/dispatcher_bindings_mac.mm

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include "content/nw/src/api/dispatcher_bindings.h"
2+
3+
#include <string>
4+
5+
#include "grit/nw_strings.h"
6+
#include "ui/base/l10n/l10n_util.h"
7+
#include "ui/base/l10n/l10n_util_mac.h"
8+
9+
#import <Cocoa/Cocoa.h>
10+
11+
namespace nwapi {
12+
13+
typedef struct {
14+
std::string msgstr;
15+
int msgid;
16+
} MsgMapEntry;
17+
18+
const MsgMapEntry msg_map[] = {
19+
{ "IDS_ABOUT_MAC", IDS_ABOUT_MAC },
20+
{ "IDS_HIDE_APP_MAC", IDS_HIDE_APP_MAC},
21+
{ "IDS_HIDE_OTHERS_MAC", IDS_HIDE_OTHERS_MAC},
22+
{ "IDS_SHOW_ALL_MAC", IDS_SHOW_ALL_MAC },
23+
{ "IDS_EXIT_MAC", IDS_EXIT_MAC },
24+
{ "IDS_EDIT_MENU_MAC", IDS_EDIT_MENU_MAC },
25+
{ "IDS_EDIT_UNDO_MAC", IDS_EDIT_UNDO_MAC },
26+
{ "IDS_EDIT_REDO_MAC", IDS_EDIT_REDO_MAC },
27+
{ "IDS_CUT_MAC", IDS_CUT_MAC },
28+
{ "IDS_COPY_MAC", IDS_COPY_MAC },
29+
{ "IDS_PASTE_MAC", IDS_PASTE_MAC },
30+
{ "IDS_EDIT_DELETE_MAC", IDS_EDIT_DELETE_MAC },
31+
{ "IDS_EDIT_SELECT_ALL_MAC", IDS_EDIT_SELECT_ALL_MAC },
32+
{ "IDS_WINDOW_MENU_MAC", IDS_WINDOW_MENU_MAC },
33+
{ "IDS_MINIMIZE_WINDOW_MAC", IDS_MINIMIZE_WINDOW_MAC },
34+
{ "IDS_CLOSE_WINDOW_MAC", IDS_CLOSE_WINDOW_MAC },
35+
{ "IDS_ALL_WINDOWS_FRONT_MAC", IDS_ALL_WINDOWS_FRONT_MAC },
36+
};
37+
38+
typedef base::hash_map<std::string, int> MsgIDMap;
39+
MsgIDMap g_msgid_map;
40+
41+
void DispatcherBindings::InitMsgIDMap() {
42+
g_msgid_map.clear();
43+
for (size_t i = 0; i < arraysize(msg_map); i++) {
44+
g_msgid_map.insert(std::make_pair(msg_map[i].msgstr, msg_map[i].msgid));
45+
}
46+
}
47+
48+
// static
49+
void DispatcherBindings::GetNSStringWithFixup(
50+
const v8::FunctionCallbackInfo<v8::Value>& args) {
51+
std::string msgstr = *v8::String::Utf8Value(args[0]);
52+
MsgIDMap::iterator it = g_msgid_map.find(msgstr);
53+
if (it != g_msgid_map.end()) {
54+
int msgid = it->second;
55+
args.GetReturnValue().Set(v8::String::New([l10n_util::GetNSStringWithFixup(msgid) UTF8String]));
56+
return;
57+
}
58+
args.GetReturnValue().Set(v8::Undefined());
59+
}
60+
61+
// static
62+
void DispatcherBindings::GetNSStringFWithFixup(
63+
const v8::FunctionCallbackInfo<v8::Value>& args) {
64+
std::string msgstr = *v8::String::Utf8Value(args[0]);
65+
base::string16 arg = *v8::String::Value(args[1]);
66+
MsgIDMap::iterator it = g_msgid_map.find(msgstr);
67+
if (it != g_msgid_map.end()) {
68+
int msgid = it->second;
69+
args.GetReturnValue().Set(v8::String::New([l10n_util::GetNSStringFWithFixup(msgid, arg) UTF8String]));
70+
return;
71+
}
72+
args.GetReturnValue().Set(v8::Undefined());
73+
}
74+
75+
} // namespace nwapi

src/api/menu/menu.js

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,103 @@ Menu.prototype.popup = function(x, y) {
6969
nw.callObjectMethod(this, 'Popup', [ x, y ]);
7070
}
7171

72+
Menu.prototype.createMacBuiltin = function (app_name) {
73+
var appleMenu = new Menu();
74+
appleMenu.append(new exports.MenuItem({
75+
label: nw.getNSStringFWithFixup("IDS_ABOUT_MAC", app_name),
76+
selector: "orderFrontStandardAboutPanel:"
77+
}));
78+
appleMenu.append(new exports.MenuItem({
79+
type: "separator"
80+
}));
81+
appleMenu.append(new exports.MenuItem({
82+
label: nw.getNSStringFWithFixup("IDS_HIDE_APP_MAC", app_name),
83+
selector: "hide:",
84+
key: "h"
85+
}));
86+
appleMenu.append(new exports.MenuItem({
87+
label: nw.getNSStringFWithFixup("IDS_HIDE_OTHERS_MAC", app_name),
88+
selector: "hideOtherApplications:",
89+
key: "h",
90+
modifiers: "cmd-alt"
91+
}));
92+
appleMenu.append(new exports.MenuItem({
93+
label: nw.getNSStringWithFixup("IDS_SHOW_ALL_MAC"),
94+
selector: "unhideAllApplications:",
95+
}));
96+
appleMenu.append(new exports.MenuItem({
97+
type: "separator"
98+
}));
99+
appleMenu.append(new exports.MenuItem({
100+
label: nw.getNSStringFWithFixup("IDS_EXIT_MAC", app_name),
101+
selector: "closeAllWindowsQuit:",
102+
key: "q"
103+
}));
104+
this.append(new exports.MenuItem({ label:'', submenu: appleMenu}));
105+
106+
var editMenu = new Menu();
107+
editMenu.append(new exports.MenuItem({
108+
label: nw.getNSStringWithFixup("IDS_EDIT_UNDO_MAC"),
109+
selector: "undo:",
110+
key: "z"
111+
}));
112+
editMenu.append(new exports.MenuItem({
113+
label: nw.getNSStringWithFixup("IDS_EDIT_REDO_MAC"),
114+
selector: "redo:",
115+
key: "z",
116+
modifiers: "cmd-shift"
117+
}));
118+
editMenu.append(new exports.MenuItem({
119+
type: "separator"
120+
}));
121+
editMenu.append(new exports.MenuItem({
122+
label: nw.getNSStringWithFixup("IDS_CUT_MAC"),
123+
selector: "cut:",
124+
key: "x"
125+
}));
126+
editMenu.append(new exports.MenuItem({
127+
label: nw.getNSStringWithFixup("IDS_COPY_MAC"),
128+
selector: "copy:",
129+
key: "c"
130+
}));
131+
editMenu.append(new exports.MenuItem({
132+
label: nw.getNSStringWithFixup("IDS_PASTE_MAC"),
133+
selector: "paste:",
134+
key: "v"
135+
}));
136+
editMenu.append(new exports.MenuItem({
137+
label: nw.getNSStringWithFixup("IDS_EDIT_DELETE_MAC"),
138+
selector: "delete:",
139+
key: ""
140+
}));
141+
editMenu.append(new exports.MenuItem({
142+
label: nw.getNSStringWithFixup("IDS_EDIT_SELECT_ALL_MAC"),
143+
selector: "selectAll:",
144+
key: "a"
145+
}));
146+
this.append(new exports.MenuItem({ label: nw.getNSStringWithFixup("IDS_EDIT_MENU_MAC"),
147+
submenu: editMenu}));
148+
149+
var winMenu = new Menu();
150+
winMenu.append(new exports.MenuItem({
151+
label: nw.getNSStringWithFixup("IDS_MINIMIZE_WINDOW_MAC"),
152+
selector: "performMiniaturize:",
153+
key: "m"
154+
}));
155+
winMenu.append(new exports.MenuItem({
156+
label: nw.getNSStringWithFixup("IDS_CLOSE_WINDOW_MAC"),
157+
selector: "performClose:",
158+
key: "w"
159+
}));
160+
winMenu.append(new exports.MenuItem({
161+
type: "separator"
162+
}));
163+
winMenu.append(new exports.MenuItem({
164+
label: nw.getNSStringWithFixup("IDS_ALL_WINDOWS_FRONT_MAC"),
165+
selector: "arrangeInFront:",
166+
}));
167+
this.append(new exports.MenuItem({ label: nw.getNSStringWithFixup("IDS_WINDOW_MENU_MAC"),
168+
submenu: winMenu}));
169+
}
170+
72171
exports.Menu = Menu;

src/browser/app_controller_mac.mm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,14 @@ - (void) applicationDidFinishLaunching: (NSNotification *) note {
6666
[NSApp setMainMenu:[[[NSMenu alloc] init] autorelease]];
6767
[[NSApp mainMenu] addItem:[[[NSMenuItem alloc]
6868
initWithTitle:@"" action:nil keyEquivalent:@""] autorelease]];
69+
#if 0
6970
nw::StandardMenusMac standard_menus(
7071
browser_client->shell_browser_main_parts()->package()->GetName());
7172
standard_menus.BuildAppleMenu();
7273
if (!no_edit_menu)
7374
standard_menus.BuildEditMenu();
7475
standard_menus.BuildWindowMenu();
76+
#endif
7577
}
7678

7779
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication

0 commit comments

Comments
 (0)