--- old/src/solaris/native/sun/awt/awt_LoadLibrary.c 2012-02-27 18:16:13.000000000 +0400 +++ new/src/solaris/native/sun/awt/awt_LoadLibrary.c 2012-02-27 18:16:12.000000000 +0400 @@ -85,8 +85,9 @@ JNIEnv *env = (JNIEnv *)JNU_GetEnv(vm, JNI_VERSION_1_2); void *v; char *envvar; - jstring fmanager = NULL; - jstring fmProp = NULL; + jstring toolkit = NULL, grenv = NULL, fmanager = NULL; + jstring tkProp = NULL, geProp = NULL, fmProp = NULL; + jboolean forceXToolkit = JNI_FALSE; if (awtHandle != NULL) { /* Avoid several loading attempts */ @@ -104,14 +105,31 @@ /* * 1. Set the "sun.font.fontmanager" system property, * 2. Choose the library image name. + * 3. Override the awt.toolkit and java.awt.graphicsenv properties + * if XToolkit is requested via the AWT_TOOLKIT env var. */ + // Defaults are defined in java_props_md.c except for the font manager fmProp = (*env)->NewStringUTF(env, "sun.font.fontmanager"); + /* Check if toolkit is specified in env variable */ -#ifdef MACOSX envvar = getenv("AWT_TOOLKIT"); if (envvar && strstr(envvar, "XToolkit")) { + forceXToolkit = JNI_TRUE; + } + +#ifdef MACOSX + if (forceXToolkit) { #endif + // On non-MACOSX this is the first if() + // On MACOSX the check is always true (see the above if()) + if (forceXToolkit) { + tkProp = (*env)->NewStringUTF(env, "awt.toolkit"); + toolkit = (*env)->NewStringUTF(env, "sun.awt.X11.XToolkit"); + + geProp = (*env)->NewStringUTF(env, "java.awt.graphicsenv"); + grenv = (*env)->NewStringUTF(env, "sun.awt.X11GraphicsEnvironment"); + } fmanager = (*env)->NewStringUTF(env, "sun.awt.X11FontManager"); tk = "/xawt/libmawt"; #ifdef MACOSX @@ -120,12 +138,37 @@ tk = "/lwawt/liblwawt"; } #endif + + if (toolkit && tkProp) { + JNU_CallStaticMethodByName(env, NULL, "java/lang/System", "setProperty", + "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", + tkProp, toolkit); + } + if (grenv && geProp) { + JNU_CallStaticMethodByName(env, NULL, "java/lang/System", "setProperty", + "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", + geProp, grenv); + } if (fmanager && fmProp) { JNU_CallStaticMethodByName(env, NULL, "java/lang/System", "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", fmProp, fmanager); } +#define DELETE_GLOBAL_REF(ref) \ + if (ref) { \ + (*env)->DeleteLocalRef(env, (ref)); \ + (ref) = NULL; \ + } + + DELETE_GLOBAL_REF(toolkit); + DELETE_GLOBAL_REF(tkProp); + DELETE_GLOBAL_REF(grenv); + DELETE_GLOBAL_REF(geProp); + DELETE_GLOBAL_REF(fmanager); + DELETE_GLOBAL_REF(fmProp); + + /* Calculate library name to load */ #ifndef MACOSX if (AWTIsHeadless()) {