I have been trying to develop a simple program that sits in the Mac's status bar. I need it so that if you left click, it runs a function, but if you right click it displays a menu with an About and Quit item.
I have been looking but all I could find was command or control click suggestions however I would prefer not to go this route.
Thanks in advance and any help appreciated!
Swift 3
let statusItem = NSStatusBar.system().statusItem(withLength: NSVariableStatusItemLength)
if let button = statusItem.button {
button.action = #selector(self.statusBarButtonClicked(sender:))
button.sendAction(on: [.leftMouseUp, .rightMouseUp])
}
func statusBarButtonClicked(sender: NSStatusBarButton) {
let event = NSApp.currentEvent!
if event.type == NSEventType.rightMouseUp {
print("Right click")
} else {
print("Left click")
}
}
Swift 4
let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
if let button = statusItem.button {
button.action = #selector(self.statusBarButtonClicked(_:))
button.sendAction(on: [.leftMouseUp, .rightMouseUp])
}
func statusBarButtonClicked(sender: NSStatusBarButton) {
let event = NSApp.currentEvent!
if event.type == NSEvent.EventType.rightMouseUp {
print("Right click")
} else {
print("Left click")
}
}
A longer post is available at https://samoylov.eu/2016/09/14/handling-left-and-right-click-at-nsstatusbar-with-swift-3/
for this you can use statusItem button property.
let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-1)
let statusButton = statusItem!.button!
statusButton?.target = self // or wherever you implement the action method
statusButton?.action = "statusItemClicked:" // give any name you want
statusButton?.sendActionOn(Int((NSEventMask.LeftMouseUpMask | NSEventMask.RightMouseUpMask).rawValue)) // what type of action to observe
then you implement the action function, in the above code I named it "statusItemClicked"
func statusItemClicked(sender: NSStatusBarButton!){
var event:NSEvent! = NSApp.currentEvent!
if (event.type == NSEventType.RightMouseUp) {
statusItem?.menu = myMenu //set the menu
statusItem?.popUpStatusItemMenu(myMenu)// show the menu
}
else{
// call your function here
}
}