Skip to content
This repository has been archived by the owner on Jul 10, 2023. It is now read-only.

Commit

Permalink
cocoa: Add some bare-bones menus on the Mac to conform better to the
Browse files Browse the repository at this point in the history
Apple Human Interface Guidelines.

For now, we only add menu items that are either completely implemented
by Cocoa or implemented ourselves. This means that, in particular, the
Edit and Help menus are absent, since Glutin does not implement these
features yet.

Requires servo/cocoa-rs#125.
  • Loading branch information
pcwalton committed May 13, 2016
1 parent 1e1e2bd commit d8590fe
Showing 1 changed file with 95 additions and 0 deletions.
95 changes: 95 additions & 0 deletions src/api/cocoa/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ use std::sync::Mutex;
use std::ascii::AsciiExt;
use std::ops::Deref;
use std::path::PathBuf;
use std::env;

use events::ElementState::{Pressed, Released};
use events::Event::{Awakened, MouseInput, MouseMoved, ReceivedCharacter, KeyboardInput};
Expand Down Expand Up @@ -397,6 +398,9 @@ impl Window {
}
}
app.finishLaunching();

Window::create_menus(app_name);

Some(app)
}
}
Expand Down Expand Up @@ -588,6 +592,97 @@ impl Window {
}
}

fn create_menus(app_name: Option<&str>) {
unsafe {
let main_menu = NSMenu::alloc(nil).init();

let app_name = match app_name {
None => {
match env::current_exe().ok().and_then(|path| {
path.file_name().and_then(|name| name.to_str()
.map(|name| name.to_owned()))
}) {
None => "Glutin".to_owned(),
Some(name) => name,
}
}
Some(name) => name.to_owned(),
};
let application_menu_name = NSString::alloc(nil).init_str(&app_name);

let application_menu = NSMenu::alloc(nil).initWithTitle_(application_menu_name);
let empty_string = NSString::alloc(nil).init_str("");
application_menu.addItemWithTitle_action_keyEquivalent(
NSString::alloc(nil).init_str("About ")
.stringByAppendingString_(application_menu_name),
sel!(orderFrontStandardAboutPanel:),
empty_string);
application_menu.addItem_(NSMenuItem::separatorItem(nil));
let services_string = NSString::alloc(nil).init_str("Services");
let menu = NSMenu::alloc(nil).initWithTitle_(services_string);
let item = NSMenuItem::alloc(nil).init();
item.setTitle_(services_string);
item.setSubmenu_(menu);
application_menu.addItem_(item);
NSApp().setServicesMenu_(menu);
application_menu.addItem_(NSMenuItem::separatorItem(nil));
application_menu.addItemWithTitle_action_keyEquivalent(
NSString::alloc(nil).init_str("Hide ")
.stringByAppendingString_(application_menu_name),
sel!(hide:),
NSString::alloc(nil).init_str("h"));
let item = application_menu.addItemWithTitle_action_keyEquivalent(
NSString::alloc(nil).init_str("Hide Others"),
sel!(hideOtherApplications:),
NSString::alloc(nil).init_str("h"));
item.setKeyEquivalentModifierMask_(NSCommandKeyMask | NSAlternateKeyMask);
application_menu.addItemWithTitle_action_keyEquivalent(
NSString::alloc(nil).init_str("Show All"),
sel!(unhideAllApplications:),
empty_string);
application_menu.addItem_(NSMenuItem::separatorItem(nil));
application_menu.addItemWithTitle_action_keyEquivalent(
NSString::alloc(nil).init_str("Quit ")
.stringByAppendingString_(application_menu_name),
sel!(terminate:),
NSString::alloc(nil).init_str("q"));
let item = NSMenuItem::alloc(nil).init();
item.setTitle_(application_menu_name);
item.setSubmenu_(application_menu);
main_menu.addItem_(item);

let view_string = NSString::alloc(nil).init_str("View");
let menu = NSMenu::alloc(nil).initWithTitle_(view_string);
let item = menu.addItemWithTitle_action_keyEquivalent(
NSString::alloc(nil).init_str("Enter Full Screen"),
sel!(toggleFullScreen:),
NSString::alloc(nil).init_str("f"));
item.setKeyEquivalentModifierMask_(NSCommandKeyMask | NSControlKeyMask);
let item = NSMenuItem::alloc(nil).init();
item.setTitle_(view_string);
item.setSubmenu_(menu);
main_menu.addItem_(item);

let window_string = NSString::alloc(nil).init_str("Window");
let menu = NSMenu::alloc(nil).initWithTitle_(window_string);
menu.addItemWithTitle_action_keyEquivalent(
NSString::alloc(nil).init_str("Minimize"),
sel!(performMiniaturize:),
NSString::alloc(nil).init_str("m"));
menu.addItemWithTitle_action_keyEquivalent(
NSString::alloc(nil).init_str("Zoom"),
sel!(performZoom:),
empty_string);
let item = NSMenuItem::alloc(nil).init();
item.setTitle_(window_string);
item.setSubmenu_(menu);
main_menu.addItem_(item);

NSApp().setMainMenu_(main_menu);
NSApp().setWindowsMenu_(menu);
}
}

pub fn set_title(&self, title: &str) {
unsafe {
let title = IdRef::new(NSString::alloc(nil).init_str(title));
Expand Down

0 comments on commit d8590fe

Please sign in to comment.