Mac Tray Icon Question

Jeremy Wood mickleness at gmail.com
Wed Aug 10 15:50:07 UTC 2022


Alan & Phil:

Thanks so much. I just ran a test in JDK 18 with 
“apple.awt.enableTemplateImages” set to true and it works as expected. 
(I realize now part of the problem was on one of my machines I was 
reading JDK 14 code, but I’m not 100% sure even if I had the correct 
version in front of me that I would have pieced all of this together...)

  Regards,
  - Jeremy

------ Original Message ------
>From "Philip Race" <philip.race at oracle.com>
To "alan Snyder" <fishgarage at cbfiddle.com>; "Jeremy Wood" 
<mickleness at gmail.com>
Cc "client-libs-dev at openjdk.org" <client-libs-dev at openjdk.org>
Date 8/10/2022 11:41:53 AM
Subject Re: Mac Tray Icon Question

>
>This was implemented in JDK 17 as 
>https://bugs.openjdk.org/browse/JDK-8252015
>You need to set that property yourself and then ALL your images for 
>TrayIcon had better
>all be template images else it will likely look very bad ..
>
>It was done this way to avoid "accidentally" interpretation of images 
>as template images
>Personally I wonder if the definition of template images is simple and 
>stable we could
>just scan the images to see if they meet the criteria and then mark 
>them as template
>images automatically .. but very clearly the developer would need to 
>know the rules
>for template images and supply these for mac. There's nothing I can 
>think of which
>would allow someone writing a Java app on Windows and not a mac aware 
>developer
>to have this magically done for them ...
>
>-phil.
>
>On 8/10/22 7:47 AM, Alan Snyder wrote:
>>It appears that CTrayIcon has an option to use template images.
>>
>>apple.awt.enableTemplateImages
>>
>>So, either this option is off or your image does not satisfy the rules 
>>for template images.
>>
>>
>>
>>
>>>On Aug 10, 2022, at 7:28 AM, Jeremy Wood <mickleness at gmail.com> 
>>>wrote:
>>>
>>>I like that theory, thanks. Is it possible to make/assign a template 
>>>image in Java?
>>>
>>>Glancing around just now didn’t turn up any leads. Specifically:
>>>
>>>In CTrayIcon#updateNativeImage(Image), we call:
>>>CImage.getCreator().createFromImage(image, observer)
>>>
>>>… and that method appears to convert ‘image’ (a java.awt.Image) into 
>>>a TYPE_INT_ARGB_PRE formatted int array. The word “template” isn’t in 
>>>the CImage class at all. So even if I had the imagePtr I don’t see 
>>>how I can toggle the template attribute.
>>>
>>>Regards,
>>>  - Jeremy
>>>
>>>------ Original Message ------
>>>From "Alan Snyder" <javalists at cbfiddle.com>
>>>To "Jeremy Wood" <mickleness at gmail.com>
>>>Cc "client-libs-dev at openjdk.org" <client-libs-dev at openjdk.org>
>>>Date 8/10/2022 8:25:11 AM
>>>Subject Re: Mac Tray Icon Question
>>>
>>>>I suspect the images that work are template images, rather than 
>>>>pairs of images.
>>>>
>>>>See 
>>>>https://developer.apple.com/documentation/appkit/nsimage/1520017-template
>>>>
>>>>
>>>>
>>>>>On Aug 9, 2022, at 7:12 PM, Jeremy Wood <mickleness at gmail.com> 
>>>>>wrote:
>>>>>
>>>>>On Macs the tray can present black or white icons, depending on the 
>>>>>color of the desktop underneath the menubar.
>>>>>
>>>>>For example:
>>>>>
>>>>><galpmnvf.png>
>>>>>
>>>>><qtqoidmn.png>
>>>>>
>>>>>Most icons switch from a black icon to a white icon as needed. A 
>>>>>few 3rd party app icons do not switch to a white icon against the 
>>>>>black background (for ex: Evernote). And interestingly: Apple’s 
>>>>>Airdrop icon (the concentric circles shaped like a sideways pacman) 
>>>>>also appears to do the wrong thing too.
>>>>>
>>>>>Is there a way in a Java desktop app to set up a tray icon that can 
>>>>>toggle between white and black icons as needed?
>>>>>
>>>>>Obviously we’d love it if this “just worked” without further 
>>>>>intervention by inverting our icon, but we’d also be happy if a 
>>>>>solution involved adding a PropertyChangeListener somewhere to 
>>>>>identify the menubar change and we could update the tray icons 
>>>>>ourselves.
>>>>>
>>>>>For ex:
>>>>>If I change the highlight/accent color (in “System Preferences -> 
>>>>>General”), then 8 UIManager Colors change (including 
>>>>>“textHighlight”, “Button.light”, etc.) as of JDK 18. As far as I 
>>>>>can tell: there is no similar model to identify when the menubar 
>>>>>changes colors.
>>>>>
>>>>>For now we’ve made a work-around by using the Robot class to grab a 
>>>>>pixel from the Apple menu icon every few seconds to determine if 
>>>>>it’s light or dark.
>>>>>
>>>>>Is there an existing way to resolve this we don’t know about?
>>>>>
>>>>>Or if not: is anyone reading this with “author” status interested 
>>>>>in helping write this up as an openjdk bug?
>>>>>
>>>>>Regards,
>>>>>  - Jeremy
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/client-libs-dev/attachments/20220810/d854d354/attachment.htm>


More information about the client-libs-dev mailing list