Skip to content

Commit 0c68d70

Browse files
committed
access built-in menus
Conflicts: src/api/dispatcher_bindings.cc
1 parent 12419eb commit 0c68d70

File tree

7 files changed

+200
-1
lines changed

7 files changed

+200
-1
lines changed

nw.gypi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@
137137
'src/api/dispatcher.h',
138138
'src/api/dispatcher_bindings.cc',
139139
'src/api/dispatcher_bindings.h',
140+
'src/api/dispatcher_bindings_mac.mm',
140141
'src/api/dispatcher_host.cc',
141142
'src/api/dispatcher_host.h',
142143
'src/api/window_bindings.cc',

src/api/dispatcher_bindings.cc

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ namespace nwapi {
4848

4949
namespace {
5050

51+
5152
v8::Handle<v8::String> WrapSource(v8::Handle<v8::String> source) {
5253
v8::Isolate* isolate = v8::Isolate::GetCurrent();
5354
v8::EscapableHandleScope handle_scope(isolate);
@@ -118,6 +119,9 @@ DispatcherBindings::DispatcherBindings()
118119
NULL, // dependencies array.
119120
GetStringResource(
120121
IDR_NW_API_DISPATCHER_BINDINGS_JS).size()) {
122+
#if defined(OS_MACOSX)
123+
InitMsgIDMap();
124+
#endif
121125
}
122126

123127
DispatcherBindings::~DispatcherBindings() {
@@ -155,7 +159,12 @@ DispatcherBindings::GetNativeFunctionTemplate(
155159
return v8::FunctionTemplate::New(isolate, SetCrashDumpDir);
156160
else if (name->Equals(v8::String::NewFromUtf8(isolate, "AllocateId")))
157161
return v8::FunctionTemplate::New(isolate, AllocateId);
158-
162+
#if defined(OS_MACOSX)
163+
else if (name->Equals(v8::String::NewFromUtf8(isolate, "GetNSStringWithFixup")))
164+
return v8::FunctionTemplate::New(isolate, GetNSStringWithFixup);
165+
else if (name->Equals(v8::String::NewFromUtf8(isolate, "GetNSStringFWithFixup")))
166+
return v8::FunctionTemplate::New(isolate, GetNSStringFWithFixup);
167+
#endif
159168
NOTREACHED() << "Trying to get an non-exist function in DispatcherBindings:"
160169
<< *v8::String::Utf8Value(name);
161170
return v8::FunctionTemplate::New(isolate);

src/api/dispatcher_bindings.h

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

6873
DISALLOW_COPY_AND_ASSIGN(DispatcherBindings);
6974
};

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: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,104 @@ Menu.prototype.popup = function(x, y) {
6969
nw.callObjectMethod(this, 'Popup', [ x, y ]);
7070
}
7171

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