JNIEXPORT void JNICALL SurfaceData_SetOps(JNIEnv *env, jobject sData, SurfaceDataOps *ops) { if (JNU_GetLongFieldAsPtr(env, sData, pDataID) == NULL) { JNU_SetLongFieldFromPtr(env, sData, pDataID, ops); /* Register the data for disposal */ Disposer_AddRecord(env, sData, SurfaceData_DisposeOps, ptr_to_jlong(ops)); } else { JNU_ThrowInternalError(env, "Attempting to set SurfaceData ops twice"); } }
/* * A utility to retrieve cursor from java.awt.Cursor * Create and save the cursor first if it is not yet */ Cursor getCursor(JNIEnv *env, jobject jCur) { int32_t cursorType = 0; Cursor xcursor; xcursor = (Cursor)JNU_GetLongFieldAsPtr(env, jCur, cursorIDs.pData); if (xcursor != NULL) { return xcursor; } cursorType = (*env)->GetIntField(env, jCur, cursorIDs.type); DASSERT(cursorType != java_awt_Cursor_CUSTOM_CURSOR); switch (cursorType) { case java_awt_Cursor_DEFAULT_CURSOR: cursorType = XC_left_ptr; break; case java_awt_Cursor_CROSSHAIR_CURSOR: cursorType = XC_crosshair; break; case java_awt_Cursor_TEXT_CURSOR: cursorType = XC_xterm; break; case java_awt_Cursor_WAIT_CURSOR: cursorType = XC_watch; break; case java_awt_Cursor_SW_RESIZE_CURSOR: cursorType = XC_bottom_left_corner; break; case java_awt_Cursor_NW_RESIZE_CURSOR: cursorType = XC_top_left_corner; break; case java_awt_Cursor_SE_RESIZE_CURSOR: cursorType = XC_bottom_right_corner; break; case java_awt_Cursor_NE_RESIZE_CURSOR: cursorType = XC_top_right_corner; break; case java_awt_Cursor_S_RESIZE_CURSOR: cursorType = XC_bottom_side; break; case java_awt_Cursor_N_RESIZE_CURSOR: cursorType = XC_top_side; break; case java_awt_Cursor_W_RESIZE_CURSOR: cursorType = XC_left_side; break; case java_awt_Cursor_E_RESIZE_CURSOR: cursorType = XC_right_side; break; case java_awt_Cursor_HAND_CURSOR: cursorType = XC_hand2; break; case java_awt_Cursor_MOVE_CURSOR: cursorType = XC_fleur; break; } xcursor = XCreateFontCursor(awt_display, cursorType); JNU_SetLongFieldFromPtr(env, jCur, cursorIDs.pData, xcursor); return xcursor; }
struct FontData * awtJNI_GetFontData(JNIEnv * env, jobject font, char **errmsg) { /* We are going to create at most 4 outstanding local refs in this * function. */ if ((*env)->EnsureLocalCapacity(env, 4) < 0) { return NULL; } if (!JNU_IsNull(env, font) && awtJNI_IsMultiFont(env, font)) { struct FontData *fdata = NULL; int32_t i, size; char *fontsetname = NULL; char *nativename = NULL; jobjectArray componentFonts = NULL; jobject peer = NULL; jobject fontDescriptor = NULL; jstring fontDescriptorName = NULL; jstring charsetName = NULL; fdata = (struct FontData *) JNU_GetLongFieldAsPtr(env,font, fontIDs.pData); if (fdata != NULL && fdata->flist != NULL) { return fdata; } size = (*env)->GetIntField(env, font, fontIDs.size); fdata = (struct FontData *) malloc(sizeof(struct FontData)); peer = (*env)->CallObjectMethod(env, font, fontIDs.getPeer); componentFonts = (*env)->GetObjectField(env, peer, platformFontIDs.componentFonts); /* We no longer need peer */ (*env)->DeleteLocalRef(env, peer); fdata->charset_num = (*env)->GetArrayLength(env, componentFonts); fdata->flist = (awtFontList *) malloc(sizeof(awtFontList) * fdata->charset_num); fdata->xfont = NULL; for (i = 0; i < fdata->charset_num; i++) { /* * set xlfd name */ fontDescriptor = (*env)->GetObjectArrayElement(env, componentFonts, i); fontDescriptorName = (*env)->GetObjectField(env, fontDescriptor, fontDescriptorIDs.nativeName); if (!JNU_IsNull(env, fontDescriptorName)) { nativename = (char *) JNU_GetStringPlatformChars(env, fontDescriptorName, NULL); } else { nativename = ""; } fdata->flist[i].xlfd = malloc(strlen(nativename) + strlen(defaultXLFD)); jio_snprintf(fdata->flist[i].xlfd, strlen(nativename) + 10, nativename, size * 10); if (nativename != NULL && nativename != "") JNU_ReleaseStringPlatformChars(env, fontDescriptorName, (const char *) nativename); /* * set charset_name */ charsetName = (*env)->GetObjectField(env, fontDescriptor, fontDescriptorIDs.charsetName); fdata->flist[i].charset_name = (char *) JNU_GetStringPlatformChars(env, charsetName, NULL); /* We are done with the objects. */ (*env)->DeleteLocalRef(env, fontDescriptor); (*env)->DeleteLocalRef(env, fontDescriptorName); (*env)->DeleteLocalRef(env, charsetName); /* * set load & XFontStruct */ fdata->flist[i].load = 0; /* * This appears to be a bogus check. The actual intent appears * to be to find out whether this is the "base" font in a set, * rather than iso8859_1 explicitly. Note that iso8859_15 will * and must also pass this test. */ if (fdata->xfont == NULL && strstr(fdata->flist[i].charset_name, "8859_1")) { fdata->flist[i].xfont = loadFont(awt_display, fdata->flist[i].xlfd, size * 10); if (fdata->flist[i].xfont != NULL) { fdata->flist[i].load = 1; fdata->xfont = fdata->flist[i].xfont; fdata->flist[i].index_length = 1; } else { if (errmsg != NULL) { *errmsg = "java/lang" "NullPointerException"; } (*env)->DeleteLocalRef(env, componentFonts); return NULL; } } } (*env)->DeleteLocalRef(env, componentFonts); /* * XFontSet will create if the peer of TextField/TextArea * are used. */ fdata->xfs = NULL; JNU_SetLongFieldFromPtr(env,font,fontIDs.pData,fdata); Disposer_AddRecord(env, font, pDataDisposeMethod, ptr_to_jlong(fdata)); return fdata; } else { Display *display = NULL; struct FontData *fdata = NULL; char fontSpec[1024]; int32_t height; int32_t oheight; int32_t above = 0; /* tries above height */ int32_t below = 0; /* tries below height */ char *foundry = NULL; char *name = NULL; char *encoding = NULL; char *style = NULL; XFontStruct *xfont = NULL; jstring family = NULL; if (JNU_IsNull(env, font)) { if (errmsg != NULL) { *errmsg = "java/lang" "NullPointerException"; } return (struct FontData *) NULL; } display = XDISPLAY; fdata = (struct FontData *) JNU_GetLongFieldAsPtr(env,font,fontIDs.pData); if (fdata != NULL && fdata->xfont != NULL) { return fdata; } family = (*env)->CallObjectMethod(env, font, fontIDs.getFamily); if (!awtJNI_FontName(env, family, &foundry, &name, &encoding)) { if (errmsg != NULL) { *errmsg = "java/lang" "NullPointerException"; } (*env)->DeleteLocalRef(env, family); return (struct FontData *) NULL; } style = Style((*env)->GetIntField(env, font, fontIDs.style)); oheight = height = (*env)->GetIntField(env, font, fontIDs.size); while (1) { jio_snprintf(fontSpec, sizeof(fontSpec), "-%s-%s-%s-*-*-%d-*-*-*-*-*-%s", foundry, name, style, height, encoding); /*fprintf(stderr,"LoadFont: %s\n", fontSpec); */ xfont = XLoadQueryFont(display, fontSpec); /* XXX: sometimes XLoadQueryFont returns a bogus font structure */ /* with negative ascent. */ if (xfont == (Font) NULL || xfont->ascent < 0) { if (xfont != NULL) { XFreeFont(display, xfont); } if (foundry != anyfoundry) { /* Use ptr comparison here, not strcmp */ /* Try any other foundry before messing with the sizes */ foundry = anyfoundry; continue; } /* We couldn't find the font. We'll try to find an */ /* alternate by searching for heights above and below our */ /* preferred height. We try for 4 heights above and below. */ /* If we still can't find a font we repeat the algorithm */ /* using misc-fixed as the font. If we then fail, then we */ /* give up and signal an error. */ if (above == below) { above++; height = oheight + above; } else { below++; if (below > 4) { if (name != defaultfontname || style != anystyle) { name = defaultfontname; foundry = defaultfoundry; height = oheight; style = anystyle; encoding = isolatin1; above = below = 0; continue; } else { if (errmsg != NULL) { *errmsg = "java/io/" "FileNotFoundException"; } (*env)->DeleteLocalRef(env, family); return (struct FontData *) NULL; } } height = oheight - below; } continue; } else { fdata = ZALLOC(FontData); if (fdata == NULL) { if (errmsg != NULL) { *errmsg = "java/lang" "OutOfMemoryError"; } } else { fdata->xfont = xfont; JNU_SetLongFieldFromPtr(env,font,fontIDs.pData,fdata); Disposer_AddRecord(env, font, pDataDisposeMethod, ptr_to_jlong(fdata)); } (*env)->DeleteLocalRef(env, family); return fdata; } } /* not reached */ } }
static void setX11InputMethodData(JNIEnv * env, jobject imInstance, X11InputMethodData *pX11IMData) { JNU_SetLongFieldFromPtr(env, imInstance, x11InputMethodIDs.pData, pX11IMData); }