>>> 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.

-DrD-

Reply via email to