JDK 7/8 falling back to headless toolkit in ssh login session

Phil Race philip.race at oracle.com
Fri May 24 12:16:19 PDT 2013


When we ssh into an OS X system as the currently logged in user, we
would like to run automated tests that display on the screen. However
I found that I need to explicitly tell it the toolkit to use to get this to work
"AWT_TOOLKIT=CToolkit    java ..."

else it falls back into a path where it selects the headless toolkit
which then complains when we try to create a window :

java -jar SwingSet2.jar
Exception in thread "main" java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
         at sun.java2d.HeadlessGraphicsEnvironment.getDefaultScreenDevice(HeadlessGraphicsEnvironment.java:77)
         at SwingSet2.main(SwingSet2.java:222)
....
The X11 message is a bit confusing but is basically the fallback code assuming
that the headful toolkit would have been X11.

And  SwingSet2 uses the SplashScreen API which displays an image before
AWT starts running, so we get the oddity that you see the splash screen displayed
for a moment before AWT decides that can't have been possible and shuts down :-)

The ultimate root of the problem is a function called "isInAquaSession" which uses
The OSX GetSessionInfo call. JFK checks the returned bit flag for sessionHasGraphicsAccessFlag
which is however "clear", even though as far as I can tell, it should be "set".
SwingSet2 seems to work just fine when run as
AWT_TOOLKIT=CToolkit    java -jar SwingSet2.jar
So it appears GetSessionInfo is unreliable, or maybe too picky over something
that doesn't matter ?

So are we required to forever use the workaround above, or is there something
we can do to get the right answer ?

-phil.



More information about the macosx-port-dev mailing list