If it's for windows, the API itself is quite simple (maybe it's not hard for 
other platforms too). There are several gui frameworks available, there may be 
this functionality available, better check them first.

A quick example for WInAPI (`nimble install oldwinapi` to make `windows` 
available): 
    
    
    import windows, os
    # some missing stuff
    const NIF_ICON  = 0x00000002
    const NIF_TIP   = 0x00000004
    const NIF_STATE = 0x00000008
    const NIM_ADD   = 0.DWORD
    const NIM_MODIFY= 1.DWORD
    const NIM_DELETE= 2.DWORD
    
    # a dummy window, to pass its handle to tray icon's creation proc;
    # use any your program's window instead, and then just skip this piece of 
code
    let className = "BUTTON"
    let windowName = "test"
    let hw=CreateWindow(
      className.cstring,
      windowName.cstring,
      0, # dwStyle
      400, 300, 200, 60, # position and size
      0, # hWndParent
      0, # hMenu
      0, #hInstance
      nil)
    
    # just filling the structure, describing your icon, and passing it to the 
API proc;
    # a callback can be set here too
    var nid: NotifyIconDataA
    nid.cbSize = nid.sizeof.DWORD
    nid.Wnd = hw
    nid.uFlags = NIF_ICON or NIF_TIP
    nid.hIcon = LoadIcon(0, IDI_EXCLAMATION)
    var s = "Hello from WinAPI!"
    copyMem nid.szTip.addr, s[0].addr, s.len
    nid.szTip[s.len] = '\0'
    discard Shell_NotifyIconA(NIM_ADD, addr nid)
    
    # here should be your message loop; you have that propbably already;
    # instead, for a demostration, we just keep the process alive for some 
seconds,
    # enough to see icon working, with a hint on it
    sleep 8_000
    

Reply via email to