<AWT Dev> RFR: 8025673: Disable X11 AWT toolkit

David DeHaven david.dehaven at oracle.com
Wed Oct 23 09:49:09 PDT 2013

>>> Not sure about this part. We already force this property to be set in
>>> Embedded without needing any changes in the code you have modified and
>>> I'm not sure if your changes will break what we already do. Why do you
>>> need to do it?
>>> I'm getting concerned about this change touching stuff outside of OSX.
>> I think I agree with David. E.g. I'm not sure I like changing
>> j/l/System.c for this fix.
>> Given the time constraints, perhaps going with HToolkit would be a good
>> enough solution for now?
>> Artem, what's your opinion?
> I'm personally fine with the current version. The fix is now Mac OS X specific, as sprops.awt_headless is only set within #ifdef MACOSX, it won't have any impact on other platforms. At the same time it enables headless functionality on Mac OS X, while HToolkit doesn't.
> Note that it can be improved further. As it stands now, the only purpose of getPreferredToolkit() is to check if Aqua session is active. The toolkit we use is always CToolkit, regardless of what this method returns, so the method can be removed, and isInAquaSession() can be called instead. Leaving this further cleanup up to David D., though.

The only reason I left it in there was for the AWT_TOOLKIT environment variable support. Right now if you set AWT_TOOLKIT to HToolkit it will start in headless mode regardless of what isAquaSession() returns. If we don't care about that then I'll happily remove it (I'm asking because I don't know if it's used or not).

For example:
$ AWT_TOOLKIT=HToolkit ./build/macosx-x86_64-normal-server-release/jdk/bin/java -jar ~/Desktop/SwingSet2.jar 
2013-10-23 09:26:21.726 java[23276:707] [JRSAppKitAWT markAppIsDaemon]: Process manager already initialized: can't fully enable headless mode.
Exception in thread "main" java.awt.HeadlessException
	at sun.java2d.HeadlessGraphicsEnvironment.getDefaultScreenDevice(HeadlessGraphicsEnvironment.java:77)
	at SwingSet2.main(SwingSet2.java:224)

But it's *only* implemented on Mac OS X so it doesn't appear to be all that useful unless we want it implemented for other platforms, which would be a whole separate issue.

Another option (I think would make everyone happy) would be to add a native method to LWCToolkit.{java,m} that implements isAquaSession and returns a boolean. Call this new method in the static initializer and use it's return value to set java.awt.headless before calling initIDs. This will still be done early enough that Toolkit.java will end up wrapping LWCToolkit in a HeadlessToolkit, since it first initializes the wrapped toolkit *then* checks to see if it needs to be wrapped. Then all that code in java_props* and System.c could be removed.


More information about the hotspot-dev mailing list