Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/maximbilan/Mac-OS-X-App-Menu-Bar-Popup
Mac OS X Application like a menu bar popup message
https://github.com/maximbilan/Mac-OS-X-App-Menu-Bar-Popup
macosx menubar popup popup-message tutorial
Last synced: about 2 months ago
JSON representation
Mac OS X Application like a menu bar popup message
- Host: GitHub
- URL: https://github.com/maximbilan/Mac-OS-X-App-Menu-Bar-Popup
- Owner: maximbilan
- License: mit
- Created: 2015-10-21T14:51:09.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2018-09-21T14:51:01.000Z (almost 6 years ago)
- Last Synced: 2024-06-14T23:48:04.948Z (3 months ago)
- Topics: macosx, menubar, popup, popup-message, tutorial
- Language: Swift
- Size: 885 KB
- Stars: 189
- Watchers: 5
- Forks: 15
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Mac OS X Application like a menu bar popup message
A simple tutorial which explains how to create Mac OS X application as a menu bar popup message.
Like that:![alt tag](https://raw.github.com/maximbilan/Mac-OS-X-App-Menu-Bar-Popup/master/screenshots/1.png)
For that, we need to create EventMonitor class for handling monitor events.
import Cocoaopen class EventMonitor {
fileprivate var monitor: AnyObject?
fileprivate let mask: NSEventMask
fileprivate let handler: (NSEvent?) -> ()
public init(mask: NSEventMask, handler: @escaping (NSEvent?) -> ()) {
self.mask = mask
self.handler = handler
}
deinit {
stop()
}
open func start() {
monitor = NSEvent.addGlobalMonitorForEvents(matching: mask, handler: handler) as AnyObject?
}
open func stop() {
if monitor != nil {
NSEvent.removeMonitor(monitor!)
monitor = nil
}
}
}And the example of AppDelegate:
import Cocoa@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {let statusItem = NSStatusBar.system().statusItem(withLength: -2)
let popover = NSPopover()
var eventMonitor: EventMonitor?func applicationDidFinishLaunching(_ aNotification: Notification) {
if let button = statusItem.button {
button.image = NSImage(named: "StatusBarButtonImage")
button.action = #selector(AppDelegate.togglePopover(_:))
}
let mainViewController = NSStoryboard(name: "Main", bundle: nil).instantiateController(withIdentifier: "ViewControllerId") as! ViewController
popover.contentViewController = mainViewController
eventMonitor = EventMonitor(mask: [.leftMouseDown, .rightMouseDown]) { [unowned self] event in
if self.popover.isShown {
self.closePopover(event)
}
}
eventMonitor?.start()
}func applicationWillTerminate(_ aNotification: Notification) {
}func togglePopover(_ sender: AnyObject?) {
if popover.isShown {
closePopover(sender)
} else {
showPopover(sender)
}
}
func showPopover(_ sender: AnyObject?) {
if let button = statusItem.button {
popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
}
eventMonitor?.start()
}
func closePopover(_ sender: AnyObject?) {
popover.performClose(sender)
eventMonitor?.stop()
}}
It’s really simple and I think no sense to describe details, just see the code.
Full code of this example you can find in this repository.