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