How can i create a native OS X tray menu with PB?
For example:

Sorry, this is a very simple first try and still doesn't look native. It displays a popup menu on clicking onto the systray icon...deseven wrote:How can i create a native OS X tray menu with PB?
Code: Select all
UsePNGImageDecoder()
OpenWindow(0, 270, 100, 300, 100, "SysTray Menu Example")
CreatePopupMenu(0)
MenuItem(0, "Show computer name")
MenuItem(1, "Show user name")
If LoadImage(0, #PB_Compiler_Home + "Examples/Sources/Data/World.png")
AddSysTrayIcon(1, WindowID(0), ImageID(0))
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_SysTray
If EventType() = #PB_EventType_LeftClick
DisplayPopupMenu(0, WindowID(0))
EndIf
Case #PB_Event_Menu
Select EventMenu()
Case 0
MessageRequester("Info", "Computer name: " + ComputerName())
Case 1
MessageRequester("Info", "User name: " + UserName())
EndSelect
EndSelect
ForEver
EndIf
Code: Select all
UsePNGImageDecoder()
If OpenWindow(0, 100, 150, 300, 100, "PureBasic - SysTray Example", #PB_Window_SystemMenu)
LoadImage(0,#PB_Compiler_Home + "examples/sources/Data/world.png")
AddSysTrayIcon(1, WindowID(0), ImageID(0))
AddSysTrayIcon(2, WindowID(0), ImageID(0))
SysTrayIconToolTip(1, "Icon 1")
SysTrayIconToolTip(2, "Icon 2")
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_SysTray
If EventType() = #PB_EventType_LeftDoubleClick
MessageRequester("SysTray", "Left DoubleClick on SysTrayIcon "+Str(EventGadget()),0)
ChangeSysTrayIcon (EventGadget(), LoadImage(0, IconName$))
SysTrayIconToolTip(EventGadget(), "Changed !")
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
William,WilliamL wrote:I tried your example and I don't get any errors but the icon doesn't appear.
Your posted example displays 2 world icons in my system menu although it doesn't work as it should because on MacOS the EventType #PB_EventType_LeftDoubleClick isn't recognized. Only a simple #PB_EventType_LeftClick as in my example code is recognized from PB...WilliamL wrote:I modified the 'Help' example and I don't see the icon there either. Still no errors.
Sorry, but i know about CreatePopupMenu() and it's not what i'm looking for.Shardik wrote:Sorry, this is a very simple first try and still doesn't look native. It displays a popup menu on clicking onto the systray icon...deseven wrote:How can i create a native OS X tray menu with PB?
Code: Select all
If EventType() = #PB_EventType_RightClick ;always false
DisplayPopupMenu(0, WindowID(0))
EndIf
Code: Select all
EnableExplicit
#NSSquareStatusBarItemLength = -2
ImportC ""
sel_registerName(MethodName.P-ASCII)
class_addMethod(Class.I, Selector.I, Implementation.I, Types.P-ASCII)
EndImport
Enumeration #PB_Event_FirstCustomValue
#EventDisplayComputerName
#EventDisplayUserName
EndEnumeration
Structure MenuItemIDEntry
ID.I
Event.I
EndStructure
NewList MenuItemID.MenuItemIDEntry()
ProcedureC MenuItemHighlightedCallback(Object.I, Selector.I, MenuItem.I)
Shared MenuItemID.MenuItemIDEntry()
ForEach MenuItemID()
If MenuItem = MenuItemID()\ID
PostEvent(MenuItemID()\Event)
Break
EndIf
Next
EndProcedure
Define AppDelegate.I = CocoaMessage(0, CocoaMessage(0, 0,
"NSApplication sharedApplication"), "delegate")
Define DelegateClass.I = CocoaMessage(0, AppDelegate, "class")
Define ItemLength.CGFloat = 32
Define Menu.I
Define NotificationCenter.I = CocoaMessage(0, 0,
"NSNotificationCenter defaultCenter")
Define Selector.I = sel_registerName("menu:willHighlightItem:")
Define StatusBar.I
Define StatusItem.I
UsePNGImageDecoder()
OpenWindow(0, 270, 100, 300, 100, "SysTray Menu Example")
If LoadImage(0, #PB_Compiler_Home + "Examples/Sources/Data/World.png")
StatusBar = CocoaMessage(0, 0, "NSStatusBar systemStatusBar")
If StatusBar
; ----- Create icon in system status bar (SysTray)
StatusItem = CocoaMessage(0, CocoaMessage(0, StatusBar,
"statusItemWithLength:", #NSSquareStatusBarItemLength), "retain")
If StatusItem
CocoaMessage(0, StatusItem, "setLength:@", @ItemLength)
CocoaMessage(0, StatusItem, "setImage:", ImageID(0))
; ----- Create menu with entries for click on SysTray icon
Menu = CocoaMessage(0, CocoaMessage(0, 0, "NSMenu alloc"), "init")
If Menu
class_addMethod(DelegateClass, Selector,
@MenuItemHighlightedCallback(), "v@:@")
CocoaMessage(0, NotificationCenter,
"addObserver:", AppDelegate,
"selector:", Selector,
"name:$", @"NSMenuDidBeginTrackingNotification",
"object:", Menu)
; ----- Add first menu entry
AddElement(MenuItemID())
MenuItemID()\Event = #EventDisplayComputerName
MenuItemID()\ID = CocoaMessage(0, Menu,
"addItemWithTitle:$", @"Show computer name",
"action:", 0,
"keyEquivalent:$", @"")
CocoaMessage(0, MenuItemID()\ID, "setAction:", Selector)
; ----- Add second menu entry
AddElement(MenuItemID())
MenuItemID()\Event = #EventDisplayUserName
MenuItemID()\ID = CocoaMessage(0, Menu,
"addItemWithTitle:$", @"Show user name",
"action:", 0,
"keyEquivalent:$", @"")
CocoaMessage(0, MenuItemID()\ID, "setAction:", Selector)
; ----- Add menu to SysTray icon
CocoaMessage(0, StatusItem, "setMenu:", Menu)
CocoaMessage(0, Menu, "release")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #EventDisplayComputerName
MessageRequester("Info", "Computer name: " + ComputerName())
Case #EventDisplayUserName
MessageRequester("Info", "User name: " + UserName())
EndSelect
ForEver
EndIf
EndIf
EndIf
EndIf
CocoaMessage(0, NotificationCenter,
"removeObserver:", AppDelegate,
"name:$", @"NSMenuDidBeginTrackingNotification",
"object:", 0)
Code: Select all
EnableExplicit
#NSSquareStatusBarItemLength = -2
Define ItemLength.CGFloat = 32
Define StatusBar.I
Define StatusItem.I
UsePNGImageDecoder()
OpenWindow(0, 270, 100, 300, 100, "SysTray Menu Example")
If LoadImage(0, #PB_Compiler_Home + "Examples/Sources/Data/World.png")
StatusBar = CocoaMessage(0, 0, "NSStatusBar systemStatusBar")
If StatusBar
; ----- Create icon in system status bar (SysTray)
StatusItem = CocoaMessage(0, CocoaMessage(0, StatusBar,
"statusItemWithLength:", #NSSquareStatusBarItemLength), "retain")
If StatusItem
CocoaMessage(0, StatusItem, "setLength:@", @ItemLength)
CocoaMessage(0, StatusItem, "setImage:", ImageID(0))
; ----- Create menu with entries for click on SysTray icon
CreatePopupMenu(0)
MenuItem(0, "Show computer name")
MenuItem(1, "Show user name")
CocoaMessage(0, StatusItem, "setMenu:",
CocoaMessage(0, MenuID(0), "firstObject"))
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Menu
Select EventMenu()
Case 0
MessageRequester("Info", "Computer name: " + ComputerName())
Case 1
MessageRequester("Info", "User name: " + UserName())
EndSelect
EndSelect
ForEver
EndIf
EndIf
EndIf
Code: Select all
CocoaMessage(0, StatusItem, "setHighlightMode:", #YES)
Code: Select all
EnableExplicit
#NSSquareStatusBarItemLength = -2
Define ItemLength.CGFloat = 32
Define StatusBar.I
Define StatusItem.I
UsePNGImageDecoder()
OpenWindow(0, 270, 100, 300, 100, "SysTray Menu Example")
If LoadImage(0, #PB_Compiler_Home + "Examples/Sources/Data/World.png")
StatusBar = CocoaMessage(0, 0, "NSStatusBar systemStatusBar")
If StatusBar
; ----- Create icon in system status bar (SysTray)
StatusItem = CocoaMessage(0, CocoaMessage(0, StatusBar,
"statusItemWithLength:", #NSSquareStatusBarItemLength), "retain")
If StatusItem
CocoaMessage(0, StatusItem, "setLength:@", @ItemLength)
CocoaMessage(0, StatusItem, "setImage:", ImageID(0))
; ----- Create menu with entries for click on SysTray icon
CreatePopupMenu(0)
MenuItem(0, "Show computer name")
MenuItem(1, "Show user name")
CompilerIf #PB_Compiler_Version < 610
; Old __NSArrayM of NSMenu
;CocoaMessage(0, StatusItem, "setMenu:", CocoaMessage(0, MenuID(0), "firstObject"))
CompilerElse
; Now direct
CocoaMessage(0, StatusItem, "setMenu:", MenuID(0))
CompilerEndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Menu
Select EventMenu()
Case 0
MessageRequester("Info", "Computer name: " + ComputerName())
Case 1
MessageRequester("Info", "User name: " + UserName())
EndSelect
EndSelect
ForEver
EndIf
EndIf
EndIf
Code: Select all
; Associate the menu to the systray
SysTrayIconMenu(0, MenuID(0))