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
EndIfCode: 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
  
EndIfWilliam,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))
EndIfCode: 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))