1 extern crate cocoa;
2 extern crate core_graphics;
3 
4 #[macro_use]
5 extern crate objc;
6 
7 use cocoa::base::{selector, nil, NO, id};
8 use cocoa::foundation::{NSRect, NSPoint, NSSize, NSAutoreleasePool, NSProcessInfo,
9                         NSString, NSUInteger};
10 use cocoa::appkit::{NSApp, NSApplication, NSApplicationActivationPolicyRegular, NSWindow,
11                     NSBackingStoreBuffered, NSMenu, NSMenuItem, NSWindowStyleMask,
12                     NSRunningApplication, NSApplicationActivateIgnoringOtherApps,
13                     NSWindowCollectionBehavior, NSApplicationPresentationOptions};
14 
15 use core_graphics::display::CGDisplay;
16 
17 use objc::runtime::{Object, Sel};
18 use objc::declare::ClassDecl;
19 
main()20 fn main() {
21     unsafe {
22         let _pool = NSAutoreleasePool::new(nil);
23 
24         let app = NSApp();
25         app.setActivationPolicy_(NSApplicationActivationPolicyRegular);
26 
27         // create Menu Bar
28         let menubar = NSMenu::new(nil).autorelease();
29         let app_menu_item = NSMenuItem::new(nil).autorelease();
30         menubar.addItem_(app_menu_item);
31         app.setMainMenu_(menubar);
32 
33         // create Application menu
34         let app_menu = NSMenu::new(nil).autorelease();
35         let quit_prefix = NSString::alloc(nil).init_str("Quit ");
36         let quit_title =
37             quit_prefix.stringByAppendingString_(NSProcessInfo::processInfo(nil).processName());
38         let quit_action = selector("terminate:");
39         let quit_key = NSString::alloc(nil).init_str("q");
40         let quit_item = NSMenuItem::alloc(nil)
41             .initWithTitle_action_keyEquivalent_(quit_title, quit_action, quit_key)
42             .autorelease();
43         app_menu.addItem_(quit_item);
44         app_menu_item.setSubmenu_(app_menu);
45 
46         // Create NSWindowDelegate
47         let superclass = class!(NSObject);
48         let mut decl = ClassDecl::new("MyWindowDelegate", superclass).unwrap();
49 
50         extern fn will_use_fillscreen_presentation_options(_: &Object, _: Sel, _: id, _: NSUInteger) -> NSUInteger {
51             // Set initial presentation options for fullscreen
52             let options = NSApplicationPresentationOptions::NSApplicationPresentationFullScreen
53                 | NSApplicationPresentationOptions::NSApplicationPresentationHideDock
54                 | NSApplicationPresentationOptions::NSApplicationPresentationHideMenuBar
55                 | NSApplicationPresentationOptions::NSApplicationPresentationDisableProcessSwitching;
56             options.bits()
57         }
58 
59         extern fn window_entering_fullscreen(_: &Object, _: Sel, _: id) {
60             // Reset HideDock and HideMenuBar settings during/after we entered fullscreen.
61             let options = NSApplicationPresentationOptions::NSApplicationPresentationHideDock | NSApplicationPresentationOptions::NSApplicationPresentationHideMenuBar;
62             unsafe {
63                 NSApp().setPresentationOptions_(options);
64             }
65         }
66 
67         decl.add_method(sel!(window:willUseFullScreenPresentationOptions:),
68             will_use_fillscreen_presentation_options as extern fn(&Object, Sel, id, NSUInteger) -> NSUInteger);
69         decl.add_method(sel!(windowWillEnterFullScreen:),
70             window_entering_fullscreen as extern fn(&Object, Sel, id));
71         decl.add_method(sel!(windowDidEnterFullScreen:),
72             window_entering_fullscreen as extern fn(&Object, Sel, id));
73 
74         let delegate_class = decl.register();
75         let delegate_object = msg_send![delegate_class, new];
76 
77         // create Window
78         let display = CGDisplay::main();
79         let size = NSSize::new(display.pixels_wide() as _, display.pixels_high() as _);
80         let window = NSWindow::alloc(nil)
81             .initWithContentRect_styleMask_backing_defer_(NSRect::new(NSPoint::new(0., 0.), size),
82                                                           NSWindowStyleMask::NSTitledWindowMask,
83                                                           NSBackingStoreBuffered,
84                                                           NO)
85             .autorelease();
86         window.setDelegate_(delegate_object);
87         let title = NSString::alloc(nil).init_str("Fullscreen!");
88         window.setTitle_(title);
89         window.makeKeyAndOrderFront_(nil);
90 
91         let current_app = NSRunningApplication::currentApplication(nil);
92         current_app.activateWithOptions_(NSApplicationActivateIgnoringOtherApps);
93         window.setCollectionBehavior_(NSWindowCollectionBehavior::NSWindowCollectionBehaviorFullScreenPrimary);
94         window.toggleFullScreen_(nil);
95         app.run();
96     }
97 }
98