fullscreen/
fullscreen.rs

1#![allow(deprecated)] // the cocoa crate is deprecated
2use 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        // create Menu Bar
27        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        // create Application menu
33        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        // Create NSWindowDelegate
46        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            // Set initial presentation options for fullscreen
56            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            // Reset HideDock and HideMenuBar settings during/after we entered fullscreen.
65            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        // create Window
90        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}