1.6 KiB
racket-tray
A small system tray API for Racket.
Version 0.1.1 implements Windows directly through the Win32 API. It uses the
native HWND of an existing Racket frame% or dialog%, Shell_NotifyIconW,
and SetWindowSubclass. No additional native DLL is required.
#lang racket/gui
(require racket-tray)
(define tray-frame%
(class frame%
(super-new [label "Tray example"]
[width 400]
[height 250])
;; Close [X] to the tray instead of destroying the frame.
(define/override (on-close)
(send this show #f))))
(define frame (new tray-frame%))
(define (show-frame)
(send frame show #t)
(when (send frame is-iconized?)
(send frame iconize #f)))
(define tray
(mk-tray frame
"example.png"
show-frame
#:hide-on-minimize? #t))
(tray-set-menu!
tray
(list
(list "Open" show-frame)
'separator
(list "Exit"
(λ ()
(tray-close tray)
(exit)))))
(send frame show #t)
mk-tray and tray-set-icon! accept both Windows .ico files and .png
files. PNG transparency is preserved when the image is converted to a native
Windows tray icon.
With #:hide-on-minimize? #t, minimizing the associated window hides it from
the taskbar while keeping its native window handle alive. Closing a window to
the tray does not need a separate tray API: override frame%'s on-close and
call (send this show #f).
tray-set-menu! accepts a popup-menu% object directly, a simple menu list,
or #f to remove the context menu.
At the moment non-Windows platforms report that the operation is unsupported.