src/solaris/native/sun/awt/awt_LoadLibrary.c

Print this page

        

@@ -83,12 +83,13 @@
     JNI_OnLoad_type *JNI_OnLoad_ptr;
     struct utsname name;
     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 */
         return JNI_VERSION_1_2;
     }

@@ -102,32 +103,74 @@
     p = strrchr(buf, '/');
 
     /*
      * 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
     } else {
         fmanager = (*env)->NewStringUTF(env, "sun.font.CFontManager");
         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()) {
         strcpy(p, "/headless/libmawt");
     } else if (tk) {