int32_t awt_motif_getIMStatusHeight(Widget vw, jobject tc) { XmICStruct *icp; XmVendorShellExtObject ve; XmWidgetExtData extData; XmImInfo *im_info; int32_t width = 0; int32_t height = 0; XRectangle rect; XRectangle *rp; int32_t old_height; Arg args[1]; int32_t base_height; XFontSet fs; XFontSet fss = NULL; XFontSet fsp = NULL; extData = (XmWidgetExtData)_XmGetWidgetExtData((Widget) vw, XmSHELL_EXTENSION); ve = (XmVendorShellExtObject) extData->widget; if ((icp = get_iclist(vw)) == NULL) { ve->vendor.im_height = 0; return 0; } im_info = (XmImInfo *) ve->vendor.im_info; if (im_info->xic == NULL) { ve->vendor.im_height = 0; return 0; } status_vlist[0].name = XNFontSet; status_vlist[1].name = NULL; preedit_vlist[0].name = XNFontSet; preedit_vlist[1].name = NULL; xic_vlist[0].name = XNAreaNeeded; xic_vlist[1].name = NULL; im_info->status_width = 0; im_info->status_height = 0; im_info->preedit_width = 0; im_info->preedit_height = 0; for (; icp != NULL; icp = icp->next) { if (im_info->input_style & XIMStatusArea) { if (icp->status_height == 0) { char *ret; if (icp->font_list == NO_ARG_VAL || (fss = extract_fontset((XmFontList) icp->font_list)) == NULL) continue; status_vlist[0].value = (XtArgVal) fss; XSetICValues(im_info->xic, XNStatusAttributes, &status_vlist[0], NULL); xic_vlist[0].value = (XtArgVal) & rp; ret = XGetICValues(im_info->xic, XNStatusAttributes, &xic_vlist[0], NULL); if (ret) { /* Cannot obtain XIC value. IM server may be gone. */ ve->vendor.im_height = 0; return 0; } else { icp->status_width = rp->width; icp->status_height = rp->height; XFree(rp); } } if (icp->status_width > im_info->status_width) im_info->status_width = icp->status_width; if (icp->status_height > im_info->status_height) im_info->status_height = icp->status_height; } if (im_info->input_style & XIMPreeditArea) { if (icp->preedit_height == 0) { if (icp->font_list == NO_ARG_VAL || (fsp = extract_fontset((XmFontList) icp->font_list)) == NULL) continue; preedit_vlist[0].value = (XtArgVal) fsp; XSetICValues(im_info->xic, XNPreeditAttributes, &preedit_vlist[0], NULL); xic_vlist[0].value = (XtArgVal) & rp; XGetICValues(im_info->xic, XNPreeditAttributes, &xic_vlist[0], NULL); icp->preedit_width = rp->width; icp->preedit_height = rp->height; XFree(rp); } if (icp->preedit_width > im_info->preedit_width) im_info->preedit_width = icp->preedit_width; if (icp->preedit_height > im_info->preedit_height) im_info->preedit_height = icp->preedit_height; } } if (im_info->current != NULL && (fss != NULL || fsp != NULL)) { if (im_info->current->font_list != NO_ARG_VAL && (fs = extract_fontset((XmFontList) im_info->current->font_list)) != NULL) { if (fss != NULL) status_vlist[0].value = (XtArgVal) fs; else status_vlist[0].name = NULL; if (fsp != NULL) preedit_vlist[0].value = (XtArgVal) fs; else preedit_vlist[0].name = NULL; XSetICValues(im_info->xic, XNStatusAttributes, &status_vlist[0], XNPreeditAttributes, &preedit_vlist[0], NULL); } } if (im_info->status_height > im_info->preedit_height) height = im_info->status_height; else height = im_info->preedit_height; old_height = ve->vendor.im_height; if (height) height += SEPARATOR_HEIGHT; ve->vendor.im_height = height; XtSetArg(args[0], XtNbaseHeight, &base_height); XtGetValues(vw, args, 1); if (base_height < 0) base_height = 0; XtSetArg(args[0], XtNbaseHeight, base_height); XtSetValues(vw, args, 1); return height; }
XVaNestedList awt_motif_getXICStatusAreaList(Widget w, jobject tc) { Widget p; XmVendorShellExtObject ve; XmWidgetExtData extData; XmImInfo *im_info; XmICStruct *icp; XVaNestedList list = NULL; XRectangle *ssgeometry = &geometryRect; Pixel bg; Pixel fg; Pixmap bpm; Dimension height,width; Position x,y; p = w; while (!XtIsShell(p)){ p = XtParent(p); } XtVaGetValues(p, XmNx, &x, XmNy, &y, XmNwidth, &width, XmNheight, &height, NULL); extData = (XmWidgetExtData)_XmGetWidgetExtData((Widget) p, XmSHELL_EXTENSION); if (extData == NULL) { return NULL; } ve = (XmVendorShellExtObject) extData->widget; if ((im_info = (XmImInfo *) ve->vendor.im_info) == NULL) { return NULL; } else icp = im_info->iclist; if (icp) { /* * We hava at least a textfield/textarea in the frame, use the * first one. */ ssgeometry->x = 0; ssgeometry->y = height - icp->status_height; ssgeometry->width = icp->status_width; ssgeometry->height = icp->status_height; /* * use motif TextComponent's resource */ fg = icp->foreground; bg = icp->background; bpm = icp->background_pixmap; list = XVaCreateNestedList(0, XNFontSet, extract_fontset((XmFontList)icp->font_list), XNArea, ssgeometry, XNBackground, bg, XNForeground, fg, XNBackgroundPixmap, bpm, NULL); } return list ; }
XVaNestedList awt_util_getXICStatusAreaList(Widget w) { XIC xic; XmImXICInfo icp; XmVendorShellExtObject ve; XmWidgetExtData extData; XmImShellInfo im_info; XmFontList fl=NULL; XRectangle *ssgeometry = &geometryRect; XRectangle geomRect ; XRectangle *im_rect; XFontSet *im_font; Pixel bg ; Pixel fg ; Dimension height, width ; Position x,y ; Pixmap bpm, *bpmout ; XVaNestedList list = NULL; char *ret; Widget p=w; while (!XtIsShell(p)) { p = XtParent(p); } XtVaGetValues(p, XmNx, &x, XmNy, &y, XmNwidth, &width, XmNheight, &height, XmNbackgroundPixmap, &bpm, NULL); extData = _XmGetWidgetExtData((Widget) p, XmSHELL_EXTENSION); if (extData == NULL) { return NULL; } ve = (XmVendorShellExtObject) extData->widget; im_info = get_im_info(w, False); if (im_info == NULL) { return NULL; } else { icp = im_info->iclist; } if (icp) { /* * We have at least a textfield/textarea in the frame, use the * first one. */ ssgeometry->x = 0; ssgeometry->y = height - icp->sp_height; ssgeometry->width = icp->status_width; ssgeometry->height = icp->sp_height; XtVaGetValues(w, XmNbackground, &bg, NULL); XtVaGetValues(w, XmNforeground, &fg, NULL); XtVaGetValues(w, XmNfontList, &fl, NULL); /* * use motif TextComponent's resource */ list = XVaCreateNestedList(0, XNFontSet, extract_fontset(fl), XNArea, ssgeometry, XNBackground, bg, XNForeground, fg, NULL); } return list ; }