Allow an NSWindow (NSPanel) to float above full screen apps

 ̄綄美尐妖づ 提交于 2021-02-06 12:48:26

问题


I'm trying to add a little window that provides "quick input" from any place in the system to the main app.

The user could hit a hotkey, the window pops up, and floats above all other windows.

For the most part, this isn't much of a problem. I can configure an NSWindow to be:

level = Int(CGWindowLevelKey.TornOffMenuWindowLevelKey.rawValue)
collectionBehavior = .CanJoinAllSpaces

I can also make it an NSPanel with NSNonactivatingPanelMask option set.

The only problem is: how can I make it so that the window can pop up on the screen even if the user is on a space containing a full screen app?

I know this is possible when the app is LSUIElement=true (an app without a position in the Dock), but mine isn't.


回答1:


Okay, I had the right idea, the tricky part is how all the options interact with each other. Here's what works:

  • NSPanel, not NSWindow
  • style mask: [.borderless, .nonactivatingPanel]

And these properties:

panel.level = .mainMenu
panel.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]

Swift 4.2 Code

Create and show a panel using these settings. Then you can drag the panel onto a fullscreen app (dual monitor setup).

let panel2 = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 200, height: 200), styleMask: [.titled, .nonactivatingPanel], backing: .buffered, defer: true)
panel2.level = .mainMenu
panel2.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
panel2.orderFrontRegardless()

Switching to borderless will prevent the user from moving your window.

let panel2 = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 200, height: 200), styleMask: [.borderless, .nonactivatingPanel], backing: .buffered, defer: true)
panel2.level = .mainMenu
panel2.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
panel2.orderFrontRegardless()



回答2:


And the Swift 4.0 translation is this.. I am still testing this, but it seems to be working.

self.view.window?.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.mainMenuWindow)))
self.view.window?.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]



回答3:


The Swift 3.0 version of your self-answer is

window.level = Int(CGWindowLevelForKey(.mainMenuWindow))
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]


来源:https://stackoverflow.com/questions/36205834/allow-an-nswindow-nspanel-to-float-above-full-screen-apps

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!