sbool trayIcon_imageAutoSize = true; static TrayIcon installTrayIcon(S imageID, S tooltip) { ret installTrayIcon(imageID, tooltip, null); } // menuItems can also just be a PopupMenu // also, first of menuItems can be a Runnable for left-click on icon static TrayIcon installTrayIcon(S imageID, S tooltip, O... menuItems) ctex { // convenience parameter swap :-) if (!isSnippetID(imageID) && isSnippetID(tooltip)) { S s = tooltip; tooltip = imageID; imageID = s; } ifdef installTrayIcon_useImageIcon Image image = imageIcon(imageID).getImage(); endifdef ifndef installTrayIcon_useImageIcon Image image = loadImage2(imageID); endifndef ret installTrayIcon(image, tooltip, menuItems); } static TrayIcon installTrayIcon(final Image image, fS tooltip, fO... _menuItems) null on exception { ret swing(func -> TrayIcon { Runnable leftClick = null; O[] menuItems = params_unpackList(_menuItems); if (l(menuItems) > 0 && menuItems[0] instanceof Runnable) { leftClick = (Runnable) menuItems[0]; menuItems = dropFirst(menuItems); } PopupMenu menu = makePopupMenu(menuItems); TrayIcon trayIcon = new TrayIcon(image, tooltip, menu); trayIcon.setImageAutoSize(trayIcon_imageAutoSize); if (leftClick != null) { final Runnable _leftClick = leftClick; onLeftClick(trayIcon, _leftClick); } SystemTray.getSystemTray().add(trayIcon); ret trayIcon; }); }