The Problem:
on a full screen mac app, when you move the mouse pointer to the top, the mac menu bar will instantly drop down. I'd like to make an app which delays the showing of the menu bar by a couple seconds.
It should be possible since that is the exact behaviour that VMWare Fusion does. while in fullscreen, the app lets the mouse pointer sits at the top of the screen for a couple seconds, before dropping down the menu bar.
how would I go about approaching this problem?
---- Update ----
I'm able to hide and show the menu bar when I want using NSMenu.setMenuBarVisible().
However, this doesn't seem to work as I thought it should be if I have multiple window app in fullscreen.
it works fine for one of the fullscreen window, but if I switch to the other fullscreen window I have to move the mouse before the call to setMenuBarVisible(true) seems to take effect.
Code
public class CustomWindowController: NSWindowController, NSWindowDelegate {
override public func windowDidLoad() {
window!.delegate = self
}
public class func create() -> CustomWindowController {
let storyboard = NSStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateControllerWithIdentifier("CustomWindowController") as! CustomWindowController
controller.window?.collectionBehavior.insert(.FullScreenDisallowsTiling)
return controller
}
// MARK: NSWindowDelegate protocol
public func windowDidEnterFullScreen(notification: NSNotification) {
print("window did enter fullscreen")
NSMenu.setMenuBarVisible(false)
}
public func windowDidBecomeKey(notification: NSNotification) {
print("window did become key")
NSMenu.setMenuBarVisible(false)
}
}
public class CustomWindow: NSWindow {
// right now I'm using mouse click to trigger the showing of the menu bar
// but my end goal is to use timer to trigger the showing of the menu bar
// to delay the menu bar showing by a couple seconds
public override func mouseUp(theEvent: NSEvent) {
NSMenu.setMenuBarVisible(true)
}
}
class CustomViewController: NSViewController {
private var otherWindowControllers = [CustomWindowController]()
// button to spawn a second identical window
@IBAction func spawnWindowButton(sender: AnyObject) {
let controller = CustomWindowController.create()
controller.showWindow(self)
// needed at least 1 strong reference to prevent the window to go away,
// so we save the controller to a list
otherWindowControllers.append(controller)
}
deinit {
otherWindowControllers.removeAll()
}
}
Repro:
- start the app
- click the spawn button to spawn a second window
- click the greenlight button to make both window go to fullscreen
- go to one of the fullscreened app window
- move the mouse to the top of the screen
- menu bar shouldn't drop down (intended behaviour)
- left click
- menu bar should drop down immediately (intended behaviour)
- go to the other fullscreened app window
- move the mouse to the top of the screen
- menu bar shouldn't drop down (intended behaviour)
- left click
- menu bar doesn't drop down
- move the mouse pointer a little bit
- now it should drop down
any idea why this happens? and how to fix it so both fullscreen window has the correct behavior