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) {