imRmAttr.c revision eb411b4b
11ab64890Smrg/****************************************************************** 21ab64890Smrg 31ab64890Smrg Copyright 1992, 1993, 1994 by FUJITSU LIMITED 41ab64890Smrg 51ab64890SmrgPermission to use, copy, modify, distribute, and sell this software 61ab64890Smrgand its documentation for any purpose is hereby granted without fee, 71ab64890Smrgprovided that the above copyright notice appear in all copies and 81ab64890Smrgthat both that copyright notice and this permission notice appear 91ab64890Smrgin supporting documentation, and that the name of FUJITSU LIMITED 101ab64890Smrgnot be used in advertising or publicity pertaining to distribution 111ab64890Smrgof the software without specific, written prior permission. 121ab64890SmrgFUJITSU LIMITED makes no representations about the suitability of 1361b2299dSmrgthis software for any purpose. 141ab64890SmrgIt is provided "as is" without express or implied warranty. 151ab64890Smrg 161ab64890SmrgFUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 171ab64890SmrgINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 181ab64890SmrgEVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR 191ab64890SmrgCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 201ab64890SmrgUSE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 211ab64890SmrgOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 221ab64890SmrgPERFORMANCE OF THIS SOFTWARE. 231ab64890Smrg 2461b2299dSmrg Author: Takashi Fujiwara FUJITSU LIMITED 251ab64890Smrg fujiwara@a80.tech.yk.fujitsu.co.jp 261ab64890Smrg 271ab64890Smrg******************************************************************/ 281ab64890Smrg 291ab64890Smrg#ifdef HAVE_CONFIG_H 301ab64890Smrg#include <config.h> 311ab64890Smrg#endif 321ab64890Smrg#include "Xlibint.h" 331ab64890Smrg#include "Xlcint.h" 341ab64890Smrg#include "Ximint.h" 351ab64890Smrg 361ab64890Smrg 37eb411b4bSmrgstatic XIMResourceList 381ab64890Smrg_XimGetNestedListSeparator( 391ab64890Smrg XIMResourceList res_list, /* LISTofIMATTR or IMATTR */ 401ab64890Smrg unsigned int res_num) 411ab64890Smrg{ 421ab64890Smrg return _XimGetResourceListRec(res_list, res_num, XNSeparatorofNestedList); 431ab64890Smrg} 441ab64890Smrg 45eb411b4bSmrgstatic Bool 461ab64890Smrg_XimCheckInnerIMAttributes( 471ab64890Smrg Xim im, 481ab64890Smrg XIMArg *arg, 491ab64890Smrg unsigned long mode) 501ab64890Smrg{ 511ab64890Smrg XIMResourceList res; 521ab64890Smrg int check; 531ab64890Smrg 541ab64890Smrg if (!(res = _XimGetResourceListRec(im->private.proto.im_inner_resources, 551ab64890Smrg im->private.proto.im_num_inner_resources, arg->name))) 561ab64890Smrg return False; 571ab64890Smrg 581ab64890Smrg check = _XimCheckIMMode(res, mode); 591ab64890Smrg if(check == XIM_CHECK_INVALID) 601ab64890Smrg return True; 611ab64890Smrg else if(check == XIM_CHECK_ERROR) 621ab64890Smrg return False; 631ab64890Smrg 641ab64890Smrg return True; 651ab64890Smrg} 661ab64890Smrg 67eb411b4bSmrgchar * 681ab64890Smrg_XimMakeIMAttrIDList( 691ab64890Smrg Xim im, 701ab64890Smrg XIMResourceList res_list, 711ab64890Smrg unsigned int res_num, 721ab64890Smrg XIMArg *arg, 731ab64890Smrg CARD16 *buf, 741ab64890Smrg INT16 *len, 751ab64890Smrg unsigned long mode) 761ab64890Smrg{ 771ab64890Smrg register XIMArg *p; 781ab64890Smrg XIMResourceList res; 791ab64890Smrg int check; 801ab64890Smrg 811ab64890Smrg *len = 0; 821ab64890Smrg if (!arg) 831ab64890Smrg return (char *)NULL; 841ab64890Smrg 851ab64890Smrg for (p = arg; p->name; p++) { 861ab64890Smrg if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) { 871ab64890Smrg if (_XimCheckInnerIMAttributes(im, p, mode)) 881ab64890Smrg continue; 891ab64890Smrg return p->name; 901ab64890Smrg } 911ab64890Smrg 921ab64890Smrg check = _XimCheckIMMode(res, mode); 931ab64890Smrg if (check == XIM_CHECK_INVALID) 941ab64890Smrg continue; 951ab64890Smrg else if (check == XIM_CHECK_ERROR) 961ab64890Smrg return p->name; 971ab64890Smrg 981ab64890Smrg *buf = res->id; 991ab64890Smrg *len += sizeof(CARD16); 1001ab64890Smrg buf++; 1011ab64890Smrg } 1021ab64890Smrg return (char *)NULL; 1031ab64890Smrg} 1041ab64890Smrg 105eb411b4bSmrgstatic Bool 1061ab64890Smrg_XimCheckInnerICAttributes( 1071ab64890Smrg Xic ic, 1081ab64890Smrg XIMArg *arg, 1091ab64890Smrg unsigned long mode) 1101ab64890Smrg{ 1111ab64890Smrg XIMResourceList res; 1121ab64890Smrg int check; 1131ab64890Smrg 1141ab64890Smrg if (!(res = _XimGetResourceListRec(ic->private.proto.ic_inner_resources, 1151ab64890Smrg ic->private.proto.ic_num_inner_resources, arg->name))) 1161ab64890Smrg return False; 1171ab64890Smrg 1181ab64890Smrg check = _XimCheckICMode(res, mode); 1191ab64890Smrg if(check == XIM_CHECK_INVALID) 1201ab64890Smrg return True; 1211ab64890Smrg else if(check == XIM_CHECK_ERROR) 1221ab64890Smrg return False; 1231ab64890Smrg 1241ab64890Smrg return True; 1251ab64890Smrg} 1261ab64890Smrg 127eb411b4bSmrgchar * 1281ab64890Smrg_XimMakeICAttrIDList( 1291ab64890Smrg Xic ic, 1301ab64890Smrg XIMResourceList res_list, 1311ab64890Smrg unsigned int res_num, 1321ab64890Smrg XIMArg *arg, 1331ab64890Smrg CARD16 *buf, 1341ab64890Smrg INT16 *len, 1351ab64890Smrg unsigned long mode) 1361ab64890Smrg{ 1371ab64890Smrg register XIMArg *p; 1381ab64890Smrg XIMResourceList res; 1391ab64890Smrg int check; 1401ab64890Smrg XrmQuark pre_quark; 1411ab64890Smrg XrmQuark sts_quark; 1421ab64890Smrg char *name; 1431ab64890Smrg INT16 new_len; 1441ab64890Smrg 1451ab64890Smrg *len = 0; 1461ab64890Smrg if (!arg) 1471ab64890Smrg return (char *)NULL; 1481ab64890Smrg 1491ab64890Smrg pre_quark = XrmStringToQuark(XNPreeditAttributes); 1501ab64890Smrg sts_quark = XrmStringToQuark(XNStatusAttributes); 1511ab64890Smrg 1521ab64890Smrg for (p = arg; p && p->name; p++) { 1531ab64890Smrg if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) { 1541ab64890Smrg if (_XimCheckInnerICAttributes(ic, p, mode)) 1551ab64890Smrg continue; 1561ab64890Smrg *len = -1; 1571ab64890Smrg return p->name; 1581ab64890Smrg } 1591ab64890Smrg 1601ab64890Smrg check = _XimCheckICMode(res, mode); 1611ab64890Smrg if(check == XIM_CHECK_INVALID) 1621ab64890Smrg continue; 1631ab64890Smrg else if(check == XIM_CHECK_ERROR) { 1641ab64890Smrg *len = -1; 1651ab64890Smrg return p->name; 1661ab64890Smrg } 1671ab64890Smrg 1681ab64890Smrg *buf = res->id; 1691ab64890Smrg *len += sizeof(CARD16); 1701ab64890Smrg buf++; 1711ab64890Smrg if (res->resource_size == XimType_NEST) { 1721ab64890Smrg if (res->xrm_name == pre_quark) { 1731ab64890Smrg if ((name = _XimMakeICAttrIDList(ic, res_list, res_num, 1741ab64890Smrg (XIMArg *)p->value, buf, &new_len, 1751ab64890Smrg (mode | XIM_PREEDIT_ATTR)))) { 1761ab64890Smrg if (new_len < 0) *len = -1; 1771ab64890Smrg else *len += new_len; 1781ab64890Smrg return name; 1791ab64890Smrg } 180eb411b4bSmrg *len += new_len; 181eb411b4bSmrg buf = (CARD16 *)((char *)buf + new_len); 1821ab64890Smrg } else if (res->xrm_name == sts_quark) { 1831ab64890Smrg if ((name = _XimMakeICAttrIDList(ic, res_list, res_num, 1841ab64890Smrg (XIMArg *)p->value, buf, &new_len, 1851ab64890Smrg (mode | XIM_STATUS_ATTR)))) { 1861ab64890Smrg if (new_len < 0) *len = -1; 1871ab64890Smrg else *len += new_len; 1881ab64890Smrg return name; 1891ab64890Smrg } 190eb411b4bSmrg *len += new_len; 191eb411b4bSmrg buf = (CARD16 *)((char *)buf + new_len); 1921ab64890Smrg } 193eb411b4bSmrg 1941ab64890Smrg if (!(res = _XimGetNestedListSeparator(res_list, res_num))) { 1951ab64890Smrg p++; 1961ab64890Smrg if (p) { 1971ab64890Smrg *len = -1; 1981ab64890Smrg return p->name; 1991ab64890Smrg } 2001ab64890Smrg else { 2011ab64890Smrg return (char *)NULL; 2021ab64890Smrg } 2031ab64890Smrg } 2041ab64890Smrg *buf = res->id; 2051ab64890Smrg *len += sizeof(CARD16); 2061ab64890Smrg buf++; 2071ab64890Smrg } 2081ab64890Smrg } 2091ab64890Smrg return (char *)NULL; 2101ab64890Smrg} 2111ab64890Smrg 212eb411b4bSmrgstatic Bool 2131ab64890Smrg_XimAttributeToValue( 2141ab64890Smrg Xic ic, 2151ab64890Smrg XIMResourceList res, 2161ab64890Smrg CARD16 *data, 2171ab64890Smrg INT16 data_len, 2181ab64890Smrg XPointer value, 2191ab64890Smrg BITMASK32 mode) 2201ab64890Smrg{ 2211ab64890Smrg switch (res->resource_size) { 2221ab64890Smrg case XimType_SeparatorOfNestedList: 2231ab64890Smrg case XimType_NEST: 2241ab64890Smrg break; 2251ab64890Smrg 2261ab64890Smrg case XimType_CARD8: 2271ab64890Smrg case XimType_CARD16: 2281ab64890Smrg case XimType_CARD32: 2291ab64890Smrg case XimType_Window: 2301ab64890Smrg case XimType_XIMHotKeyState: 2311ab64890Smrg _XCopyToArg((XPointer)data, (XPointer *)&value, data_len); 2321ab64890Smrg break; 2331ab64890Smrg 2341ab64890Smrg case XimType_STRING8: 2351ab64890Smrg { 2361ab64890Smrg char *str; 2371ab64890Smrg 2381ab64890Smrg if (!(value)) 2391ab64890Smrg return False; 2401ab64890Smrg 2411ab64890Smrg if (!(str = (char *)Xmalloc(data_len + 1))) 2421ab64890Smrg return False; 2431ab64890Smrg 2441ab64890Smrg (void)memcpy(str, (char *)data, data_len); 2451ab64890Smrg str[data_len] = '\0'; 2461ab64890Smrg 2471ab64890Smrg *((char **)value) = str; 2481ab64890Smrg break; 2491ab64890Smrg } 2501ab64890Smrg 2511ab64890Smrg case XimType_XIMStyles: 2521ab64890Smrg { 2531ab64890Smrg INT16 num = data[0]; 2541ab64890Smrg register CARD32 *style_list = (CARD32 *)&data[2]; 2551ab64890Smrg XIMStyle *style; 2561ab64890Smrg XIMStyles *rep; 2571ab64890Smrg register int i; 2581ab64890Smrg char *p; 2591ab64890Smrg int alloc_len; 2601ab64890Smrg 2611ab64890Smrg if (!(value)) 2621ab64890Smrg return False; 2631ab64890Smrg 2641ab64890Smrg alloc_len = sizeof(XIMStyles) + sizeof(XIMStyle) * num; 2651ab64890Smrg if (!(p = (char *)Xmalloc(alloc_len))) 2661ab64890Smrg return False; 2671ab64890Smrg 2681ab64890Smrg rep = (XIMStyles *)p; 2691ab64890Smrg style = (XIMStyle *)(p + sizeof(XIMStyles)); 2701ab64890Smrg 2711ab64890Smrg for (i = 0; i < num; i++) 2721ab64890Smrg style[i] = (XIMStyle)style_list[i]; 2731ab64890Smrg 2741ab64890Smrg rep->count_styles = (unsigned short)num; 2751ab64890Smrg rep->supported_styles = style; 2761ab64890Smrg *((XIMStyles **)value) = rep; 2771ab64890Smrg break; 2781ab64890Smrg } 2791ab64890Smrg 2801ab64890Smrg case XimType_XRectangle: 2811ab64890Smrg { 2821ab64890Smrg XRectangle *rep; 2831ab64890Smrg 2841ab64890Smrg if (!(value)) 2851ab64890Smrg return False; 2861ab64890Smrg 2871ab64890Smrg if (!(rep = (XRectangle *)Xmalloc(sizeof(XRectangle)))) 2881ab64890Smrg return False; 2891ab64890Smrg 2901ab64890Smrg rep->x = data[0]; 2911ab64890Smrg rep->y = data[1]; 2921ab64890Smrg rep->width = data[2]; 2931ab64890Smrg rep->height = data[3]; 2941ab64890Smrg *((XRectangle **)value) = rep; 2951ab64890Smrg break; 2961ab64890Smrg } 2971ab64890Smrg 2981ab64890Smrg case XimType_XPoint: 2991ab64890Smrg { 3001ab64890Smrg XPoint *rep; 3011ab64890Smrg 3021ab64890Smrg if (!(value)) 3031ab64890Smrg return False; 3041ab64890Smrg 3051ab64890Smrg if (!(rep = (XPoint *)Xmalloc(sizeof(XPoint)))) 3061ab64890Smrg return False; 3071ab64890Smrg 3081ab64890Smrg rep->x = data[0]; 3091ab64890Smrg rep->y = data[1]; 3101ab64890Smrg *((XPoint **)value) = rep; 3111ab64890Smrg break; 3121ab64890Smrg } 3131ab64890Smrg 3141ab64890Smrg case XimType_XFontSet: 3151ab64890Smrg { 3161ab64890Smrg INT16 len = data[0]; 3171ab64890Smrg char *base_name; 3181ab64890Smrg XFontSet rep = (XFontSet)NULL; 31957f47464Smrg char **missing_list = NULL; 3201ab64890Smrg int missing_count; 3211ab64890Smrg char *def_string; 3221ab64890Smrg 3231ab64890Smrg if (!(value)) 3241ab64890Smrg return False; 3251ab64890Smrg if (!ic) 3261ab64890Smrg return False; 3271ab64890Smrg 3281ab64890Smrg if (!(base_name = (char *)Xmalloc(len + 1))) 3291ab64890Smrg return False; 3301ab64890Smrg 3311ab64890Smrg (void)strncpy(base_name, (char *)&data[1], (int)len); 3321ab64890Smrg base_name[len] = '\0'; 3331ab64890Smrg 3341ab64890Smrg if (mode & XIM_PREEDIT_ATTR) { 3351ab64890Smrg if (!strcmp(base_name, ic->private.proto.preedit_font)) { 3361ab64890Smrg rep = ic->core.preedit_attr.fontset; 3371ab64890Smrg } else if (!ic->private.proto.preedit_font_length) { 3381ab64890Smrg rep = XCreateFontSet(ic->core.im->core.display, 3391ab64890Smrg base_name, &missing_list, 3401ab64890Smrg &missing_count, &def_string); 3411ab64890Smrg } 3421ab64890Smrg } else if (mode & XIM_STATUS_ATTR) { 3431ab64890Smrg if (!strcmp(base_name, ic->private.proto.status_font)) { 3441ab64890Smrg rep = ic->core.status_attr.fontset; 3451ab64890Smrg } else if (!ic->private.proto.status_font_length) { 3461ab64890Smrg rep = XCreateFontSet(ic->core.im->core.display, 3471ab64890Smrg base_name, &missing_list, 3481ab64890Smrg &missing_count, &def_string); 3491ab64890Smrg } 3501ab64890Smrg } 3511ab64890Smrg 3521ab64890Smrg Xfree(base_name); 35357f47464Smrg Xfree(missing_list); 3541ab64890Smrg *((XFontSet *)value) = rep; 3551ab64890Smrg break; 3561ab64890Smrg } 3571ab64890Smrg 3581ab64890Smrg case XimType_XIMHotKeyTriggers: 3591ab64890Smrg { 3601ab64890Smrg INT32 num = *((CARD32 *)data); 3611ab64890Smrg register CARD32 *key_list = (CARD32 *)&data[2]; 3621ab64890Smrg XIMHotKeyTrigger *key; 3631ab64890Smrg XIMHotKeyTriggers *rep; 3641ab64890Smrg register int i; 3651ab64890Smrg char *p; 3661ab64890Smrg int alloc_len; 3671ab64890Smrg 3681ab64890Smrg if (!(value)) 3691ab64890Smrg return False; 3701ab64890Smrg 3711ab64890Smrg alloc_len = sizeof(XIMHotKeyTriggers) 3721ab64890Smrg + sizeof(XIMHotKeyTrigger) * num; 3731ab64890Smrg if (!(p = (char *)Xmalloc(alloc_len))) 3741ab64890Smrg return False; 3751ab64890Smrg 3761ab64890Smrg rep = (XIMHotKeyTriggers *)p; 3771ab64890Smrg key = (XIMHotKeyTrigger *)(p + sizeof(XIMHotKeyTriggers)); 3781ab64890Smrg 3791ab64890Smrg for (i = 0; i < num; i++, key_list += 3) { 3801ab64890Smrg key[i].keysym = (KeySym)key_list[0]; /* keysym */ 3811ab64890Smrg key[i].modifier = (int)key_list[1]; /* modifier */ 3821ab64890Smrg key[i].modifier_mask = (int)key_list[2]; /* modifier_mask */ 3831ab64890Smrg } 3841ab64890Smrg 3851ab64890Smrg rep->num_hot_key = (int)num; 3861ab64890Smrg rep->key = key; 3871ab64890Smrg *((XIMHotKeyTriggers **)value) = rep; 3881ab64890Smrg break; 3891ab64890Smrg } 3901ab64890Smrg 3911ab64890Smrg case XimType_XIMStringConversion: 3921ab64890Smrg { 3931ab64890Smrg break; 3941ab64890Smrg } 3951ab64890Smrg 3961ab64890Smrg default: 3971ab64890Smrg return False; 3981ab64890Smrg } 3991ab64890Smrg return True; 4001ab64890Smrg} 4011ab64890Smrg 402eb411b4bSmrgstatic Bool 4031ab64890Smrg_XimDecodeInnerIMATTRIBUTE( 4041ab64890Smrg Xim im, 4051ab64890Smrg XIMArg *arg) 4061ab64890Smrg{ 4071ab64890Smrg XIMResourceList res; 4081ab64890Smrg XimDefIMValues im_values; 4091ab64890Smrg 4101ab64890Smrg if (!(res = _XimGetResourceListRec(im->private.proto.im_inner_resources, 4111ab64890Smrg im->private.proto.im_num_inner_resources, arg->name))) 4121ab64890Smrg return False; 4131ab64890Smrg 4141ab64890Smrg _XimGetCurrentIMValues(im, &im_values); 4151ab64890Smrg return _XimDecodeLocalIMAttr(res, (XPointer)&im_values, arg->value); 4161ab64890Smrg} 4171ab64890Smrg 418eb411b4bSmrgchar * 4191ab64890Smrg_XimDecodeIMATTRIBUTE( 4201ab64890Smrg Xim im, 4211ab64890Smrg XIMResourceList res_list, 4221ab64890Smrg unsigned int res_num, 4231ab64890Smrg CARD16 *data, 4241ab64890Smrg INT16 data_len, 4251ab64890Smrg XIMArg *arg, 4261ab64890Smrg BITMASK32 mode) 4271ab64890Smrg{ 4281ab64890Smrg register XIMArg *p; 4291ab64890Smrg XIMResourceList res; 4301ab64890Smrg int check; 4311ab64890Smrg INT16 len; 4321ab64890Smrg CARD16 *buf; 4331ab64890Smrg INT16 total; 4341ab64890Smrg INT16 min_len = sizeof(CARD16) /* sizeof attributeID */ 4351ab64890Smrg + sizeof(INT16); /* sizeof length */ 4361ab64890Smrg 4371ab64890Smrg for (p = arg; p->name; p++) { 4381ab64890Smrg if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) { 4391ab64890Smrg if (_XimDecodeInnerIMATTRIBUTE(im, p)) 4401ab64890Smrg continue; 4411ab64890Smrg return p->name; 4421ab64890Smrg } 4431ab64890Smrg 4441ab64890Smrg check = _XimCheckIMMode(res, mode); 4451ab64890Smrg if(check == XIM_CHECK_INVALID) 4461ab64890Smrg continue; 4471ab64890Smrg else if(check == XIM_CHECK_ERROR) 4481ab64890Smrg return p->name; 4491ab64890Smrg 4501ab64890Smrg total = data_len; 4511ab64890Smrg buf = data; 4521ab64890Smrg while (total >= min_len) { 4531ab64890Smrg if (res->id == buf[0]) 4541ab64890Smrg break; 4551ab64890Smrg 4561ab64890Smrg len = buf[1]; 4571ab64890Smrg len += XIM_PAD(len) + min_len; 4581ab64890Smrg buf = (CARD16 *)((char *)buf + len); 4591ab64890Smrg total -= len; 4601ab64890Smrg } 4611ab64890Smrg if (total < min_len) 4621ab64890Smrg return p->name; 4631ab64890Smrg 46461b2299dSmrg if (!(_XimAttributeToValue((Xic) im->private.local.current_ic, 4651ab64890Smrg res, &buf[2], buf[1], p->value, mode))) 4661ab64890Smrg return p->name; 4671ab64890Smrg } 4681ab64890Smrg return (char *)NULL; 4691ab64890Smrg} 4701ab64890Smrg 471eb411b4bSmrgstatic Bool 4721ab64890Smrg_XimDecodeInnerICATTRIBUTE( 4731ab64890Smrg Xic ic, 4741ab64890Smrg XIMArg *arg, 4751ab64890Smrg unsigned long mode) 4761ab64890Smrg{ 4771ab64890Smrg XIMResourceList res; 4781ab64890Smrg XimDefICValues ic_values; 4791ab64890Smrg 4801ab64890Smrg if (!(res = _XimGetResourceListRec(ic->private.proto.ic_inner_resources, 4811ab64890Smrg ic->private.proto.ic_num_inner_resources, arg->name))) 4821ab64890Smrg return False; 4831ab64890Smrg 4841ab64890Smrg _XimGetCurrentICValues(ic, &ic_values); 4851ab64890Smrg if (!_XimDecodeLocalICAttr(res, (XPointer)&ic_values, arg->value, mode)) 4861ab64890Smrg return False; 4871ab64890Smrg _XimSetCurrentICValues(ic, &ic_values); 4881ab64890Smrg return True; 4891ab64890Smrg} 4901ab64890Smrg 491eb411b4bSmrgchar * 4921ab64890Smrg_XimDecodeICATTRIBUTE( 4931ab64890Smrg Xic ic, 4941ab64890Smrg XIMResourceList res_list, 4951ab64890Smrg unsigned int res_num, 4961ab64890Smrg CARD16 *data, 4971ab64890Smrg INT16 data_len, 4981ab64890Smrg XIMArg *arg, 4991ab64890Smrg BITMASK32 mode) 5001ab64890Smrg{ 5011ab64890Smrg register XIMArg *p; 5021ab64890Smrg XIMResourceList res; 5031ab64890Smrg int check; 5041ab64890Smrg INT16 len; 5051ab64890Smrg CARD16 *buf; 5061ab64890Smrg INT16 total; 5071ab64890Smrg char *name; 5081ab64890Smrg INT16 min_len = sizeof(CARD16) /* sizeof attributeID */ 5091ab64890Smrg + sizeof(INT16); /* sizeof length */ 5101ab64890Smrg XrmQuark pre_quark; 5111ab64890Smrg XrmQuark sts_quark; 5121ab64890Smrg 5131ab64890Smrg if (!arg) 5141ab64890Smrg return (char *)NULL; 5151ab64890Smrg 5161ab64890Smrg pre_quark = XrmStringToQuark(XNPreeditAttributes); 5171ab64890Smrg sts_quark = XrmStringToQuark(XNStatusAttributes); 5181ab64890Smrg 5191ab64890Smrg for (p = arg; p->name; p++) { 5201ab64890Smrg if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) { 5211ab64890Smrg if (_XimDecodeInnerICATTRIBUTE(ic, p, mode)) 5221ab64890Smrg continue; 5231ab64890Smrg return p->name; 5241ab64890Smrg } 5251ab64890Smrg 5261ab64890Smrg check = _XimCheckICMode(res, mode); 5271ab64890Smrg if (check == XIM_CHECK_INVALID) 5281ab64890Smrg continue; 5291ab64890Smrg else if (check == XIM_CHECK_ERROR) 5301ab64890Smrg return p->name; 5311ab64890Smrg 5321ab64890Smrg total = data_len; 5331ab64890Smrg buf = data; 5341ab64890Smrg while (total >= min_len) { 5351ab64890Smrg if (res->id == buf[0]) 5361ab64890Smrg break; 5371ab64890Smrg 5381ab64890Smrg len = buf[1]; 5391ab64890Smrg len += XIM_PAD(len) + min_len; 5401ab64890Smrg buf = (CARD16 *)((char *)buf + len); 5411ab64890Smrg total -= len; 5421ab64890Smrg } 5431ab64890Smrg if (total < min_len) 5441ab64890Smrg return p->name; 5451ab64890Smrg 5461ab64890Smrg if (res->resource_size == XimType_NEST) { 5471ab64890Smrg if (res->xrm_name == pre_quark) { 5481ab64890Smrg if ((name = _XimDecodeICATTRIBUTE(ic, res_list, res_num, 5491ab64890Smrg &buf[2], buf[1], (XIMArg *)p->value, 5501ab64890Smrg (mode | XIM_PREEDIT_ATTR)))) 5511ab64890Smrg return name; 5521ab64890Smrg } else if (res->xrm_name == sts_quark) { 5531ab64890Smrg if ((name = _XimDecodeICATTRIBUTE(ic, res_list, res_num, 5541ab64890Smrg &buf[2], buf[1], (XIMArg *)p->value, 5551ab64890Smrg (mode | XIM_STATUS_ATTR)))) 5561ab64890Smrg return name; 5571ab64890Smrg } 5581ab64890Smrg } else { 5591ab64890Smrg if (!(_XimAttributeToValue(ic, res, &buf[2], buf[1], 5601ab64890Smrg p->value, mode))) 5611ab64890Smrg return p->name; 5621ab64890Smrg } 5631ab64890Smrg } 5641ab64890Smrg return (char *)NULL; 5651ab64890Smrg} 5661ab64890Smrg 567eb411b4bSmrgstatic Bool 5681ab64890Smrg_XimValueToAttribute( 5691ab64890Smrg XIMResourceList res, 5701ab64890Smrg XPointer buf, 5711ab64890Smrg int buf_size, 5721ab64890Smrg XPointer value, 5731ab64890Smrg int *len, 5741ab64890Smrg unsigned long mode, 5751ab64890Smrg XPointer param) 5761ab64890Smrg{ 5771ab64890Smrg int ret_len; 5781ab64890Smrg 5791ab64890Smrg switch (res->resource_size) { 5801ab64890Smrg case XimType_SeparatorOfNestedList: 5811ab64890Smrg case XimType_NEST: 5821ab64890Smrg *len = 0; 5831ab64890Smrg break; 5841ab64890Smrg 5851ab64890Smrg case XimType_CARD8: 5861ab64890Smrg ret_len = sizeof(CARD8); 5871ab64890Smrg if (buf_size < ret_len + XIM_PAD(ret_len)) { 5881ab64890Smrg *len = -1; 5891ab64890Smrg return False; 5901ab64890Smrg } 5911ab64890Smrg 5921ab64890Smrg *((CARD8 *)buf) = (CARD8)(long)value; 5931ab64890Smrg *len = ret_len; 5941ab64890Smrg break; 5951ab64890Smrg 5961ab64890Smrg case XimType_CARD16: 5971ab64890Smrg ret_len = sizeof(CARD16); 5981ab64890Smrg if (buf_size < ret_len + XIM_PAD(ret_len)) { 5991ab64890Smrg *len = -1; 6001ab64890Smrg return False; 6011ab64890Smrg } 6021ab64890Smrg 6031ab64890Smrg *((CARD16 *)buf) = (CARD16)(long)value; 6041ab64890Smrg *len = ret_len; 6051ab64890Smrg break; 6061ab64890Smrg 6071ab64890Smrg case XimType_CARD32: 6081ab64890Smrg case XimType_Window: 6091ab64890Smrg case XimType_XIMHotKeyState: 6101ab64890Smrg ret_len = sizeof(CARD32); 6111ab64890Smrg if (buf_size < ret_len + XIM_PAD(ret_len)) { 6121ab64890Smrg *len = -1; 6131ab64890Smrg return False; 6141ab64890Smrg } 6151ab64890Smrg 6161ab64890Smrg *((CARD32 *)buf) = (CARD32)(long)value; 6171ab64890Smrg *len = ret_len; 6181ab64890Smrg break; 6191ab64890Smrg 6201ab64890Smrg case XimType_STRING8: 6211ab64890Smrg if (!value) { 6221ab64890Smrg *len = 0; 6231ab64890Smrg return False; 6241ab64890Smrg } 6251ab64890Smrg 6261ab64890Smrg ret_len = strlen((char *)value); 6271ab64890Smrg if (buf_size < ret_len + XIM_PAD(ret_len)) { 6281ab64890Smrg *len = -1; 6291ab64890Smrg return False; 6301ab64890Smrg } 6311ab64890Smrg 6321ab64890Smrg (void)memcpy((char *)buf, (char *)value, ret_len); 6331ab64890Smrg *len = ret_len; 6341ab64890Smrg break; 6351ab64890Smrg 6361ab64890Smrg case XimType_XRectangle: 6371ab64890Smrg { 6381ab64890Smrg XRectangle *rect = (XRectangle *)value; 6391ab64890Smrg CARD16 *buf_s = (CARD16 *)buf; 6401ab64890Smrg 6411ab64890Smrg if (!rect) { 6421ab64890Smrg *len = 0; 6431ab64890Smrg return False; 6441ab64890Smrg } 6451ab64890Smrg 6461ab64890Smrg ret_len = sizeof(INT16) /* sizeof X */ 6471ab64890Smrg + sizeof(INT16) /* sizeof Y */ 6481ab64890Smrg + sizeof(CARD16) /* sizeof width */ 6491ab64890Smrg + sizeof(CARD16); /* sizeof height */ 6501ab64890Smrg if (buf_size < ret_len + XIM_PAD(ret_len)) { 6511ab64890Smrg *len = -1; 6521ab64890Smrg return False; 6531ab64890Smrg } 6541ab64890Smrg 6551ab64890Smrg buf_s[0] = (CARD16)rect->x; /* X */ 6561ab64890Smrg buf_s[1] = (CARD16)rect->y; /* Y */ 6571ab64890Smrg buf_s[2] = (CARD16)rect->width; /* width */ 6581ab64890Smrg buf_s[3] = (CARD16)rect->height; /* heght */ 6591ab64890Smrg *len = ret_len; 6601ab64890Smrg break; 6611ab64890Smrg } 6621ab64890Smrg 6631ab64890Smrg case XimType_XPoint: 6641ab64890Smrg { 6651ab64890Smrg XPoint *point = (XPoint *)value; 6661ab64890Smrg CARD16 *buf_s = (CARD16 *)buf; 6671ab64890Smrg 6681ab64890Smrg if (!point) { 6691ab64890Smrg *len = 0; 6701ab64890Smrg return False; 6711ab64890Smrg } 6721ab64890Smrg 6731ab64890Smrg ret_len = sizeof(INT16) /* sizeof X */ 6741ab64890Smrg + sizeof(INT16); /* sizeof Y */ 6751ab64890Smrg if (buf_size < ret_len + XIM_PAD(ret_len)) { 6761ab64890Smrg *len = -1; 6771ab64890Smrg return False; 6781ab64890Smrg } 6791ab64890Smrg 6801ab64890Smrg buf_s[0] = (CARD16)point->x; /* X */ 6811ab64890Smrg buf_s[1] = (CARD16)point->y; /* Y */ 6821ab64890Smrg *len = ret_len; 6831ab64890Smrg break; 6841ab64890Smrg } 6851ab64890Smrg 6861ab64890Smrg case XimType_XFontSet: 6871ab64890Smrg { 6881ab64890Smrg XFontSet font = (XFontSet)value; 6891ab64890Smrg Xic ic = (Xic)param; 6901ab64890Smrg char *base_name = NULL; 6911ab64890Smrg int length = 0; 6921ab64890Smrg CARD16 *buf_s = (CARD16 *)buf; 6931ab64890Smrg 6941ab64890Smrg if (!font) { 6951ab64890Smrg *len = 0; 6961ab64890Smrg return False; 6971ab64890Smrg } 6981ab64890Smrg 6991ab64890Smrg if (mode & XIM_PREEDIT_ATTR) { 7001ab64890Smrg base_name = ic->private.proto.preedit_font; 7011ab64890Smrg length = ic->private.proto.preedit_font_length; 7021ab64890Smrg } else if (mode & XIM_STATUS_ATTR) { 7031ab64890Smrg base_name = ic->private.proto.status_font; 7041ab64890Smrg length = ic->private.proto.status_font_length; 7051ab64890Smrg } 7061ab64890Smrg 7071ab64890Smrg if (!base_name) { 7081ab64890Smrg *len = 0; 7091ab64890Smrg return False; 7101ab64890Smrg } 7111ab64890Smrg 7121ab64890Smrg ret_len = sizeof(CARD16) /* sizeof length of Base name */ 7131ab64890Smrg + length; /* sizeof Base font name list */ 7141ab64890Smrg if (buf_size < ret_len + XIM_PAD(ret_len)) { 7151ab64890Smrg *len = -1; 7161ab64890Smrg return False; 7171ab64890Smrg } 7181ab64890Smrg 7191ab64890Smrg buf_s[0] = (INT16)length; /* length of Base font name */ 7201ab64890Smrg (void)memcpy((char *)&buf_s[1], base_name, length); 7211ab64890Smrg /* Base font name list */ 7221ab64890Smrg *len = ret_len; 7231ab64890Smrg break; 7241ab64890Smrg } 7251ab64890Smrg 7261ab64890Smrg case XimType_XIMHotKeyTriggers: 7271ab64890Smrg { 7281ab64890Smrg XIMHotKeyTriggers *hotkey = (XIMHotKeyTriggers *)value; 7291ab64890Smrg INT32 num; 7301ab64890Smrg CARD32 *buf_l = (CARD32 *)buf; 7311ab64890Smrg register CARD32 *key = (CARD32 *)&buf_l[1]; 7321ab64890Smrg register int i; 7331ab64890Smrg 7341ab64890Smrg if (!hotkey) { 7351ab64890Smrg *len = 0; 7361ab64890Smrg return False; 7371ab64890Smrg } 7381ab64890Smrg num = (INT32)hotkey->num_hot_key; 7391ab64890Smrg 7401ab64890Smrg ret_len = sizeof(INT32) /* sizeof number of key list */ 7411ab64890Smrg + (sizeof(CARD32) /* sizeof keysyn */ 7421ab64890Smrg + sizeof(CARD32) /* sizeof modifier */ 7431ab64890Smrg + sizeof(CARD32)) /* sizeof modifier_mask */ 7441ab64890Smrg * num; /* number of key list */ 7451ab64890Smrg if (buf_size < ret_len + XIM_PAD(ret_len)) { 7461ab64890Smrg *len = -1; 7471ab64890Smrg return False; 7481ab64890Smrg } 7491ab64890Smrg 7501ab64890Smrg buf_l[0] = num; /* number of key list */ 7511ab64890Smrg for (i = 0; i < num; i++, key += 3) { 7521ab64890Smrg key[0] = (CARD32)(hotkey->key[i].keysym); 7531ab64890Smrg /* keysym */ 7541ab64890Smrg key[1] = (CARD32)(hotkey->key[i].modifier); 7551ab64890Smrg /* modifier */ 7561ab64890Smrg key[2] = (CARD32)(hotkey->key[i].modifier_mask); 7571ab64890Smrg /* modifier_mask */ 7581ab64890Smrg } 7591ab64890Smrg *len = ret_len; 7601ab64890Smrg break; 7611ab64890Smrg } 7621ab64890Smrg 7631ab64890Smrg case XimType_XIMStringConversion: 7641ab64890Smrg { 7651ab64890Smrg *len = 0; 7661ab64890Smrg break; 7671ab64890Smrg } 7681ab64890Smrg 7691ab64890Smrg default: 7701ab64890Smrg return False; 7711ab64890Smrg } 7721ab64890Smrg return True; 7731ab64890Smrg} 7741ab64890Smrg 775eb411b4bSmrgstatic Bool 7761ab64890Smrg_XimSetInnerIMAttributes( 7771ab64890Smrg Xim im, 7781ab64890Smrg XPointer top, 7791ab64890Smrg XIMArg *arg, 7801ab64890Smrg unsigned long mode) 7811ab64890Smrg{ 7821ab64890Smrg XIMResourceList res; 7831ab64890Smrg int check; 7841ab64890Smrg 7851ab64890Smrg if (!(res = _XimGetResourceListRec(im->private.proto.im_inner_resources, 7861ab64890Smrg im->private.proto.im_num_inner_resources, arg->name))) 7871ab64890Smrg return False; 7881ab64890Smrg 7891ab64890Smrg check = _XimCheckIMMode(res, mode); 7901ab64890Smrg if(check == XIM_CHECK_INVALID) 7911ab64890Smrg return True; 7921ab64890Smrg else if(check == XIM_CHECK_ERROR) 7931ab64890Smrg return False; 7941ab64890Smrg 7951ab64890Smrg return _XimEncodeLocalIMAttr(res, top, arg->value); 7961ab64890Smrg} 7971ab64890Smrg 798eb411b4bSmrgchar * 7991ab64890Smrg_XimEncodeIMATTRIBUTE( 8001ab64890Smrg Xim im, 8011ab64890Smrg XIMResourceList res_list, 8021ab64890Smrg unsigned int res_num, 8031ab64890Smrg XIMArg *arg, 8041ab64890Smrg XIMArg **arg_ret, 8051ab64890Smrg char *buf, 8061ab64890Smrg int size, 8071ab64890Smrg int *ret_len, 8081ab64890Smrg XPointer top, 8091ab64890Smrg unsigned long mode) 8101ab64890Smrg{ 8111ab64890Smrg register XIMArg *p; 8121ab64890Smrg XIMResourceList res; 8131ab64890Smrg int check; 8141ab64890Smrg CARD16 *buf_s; 8151ab64890Smrg int len; 8161ab64890Smrg int min_len = sizeof(CARD16) /* sizeof attribute ID */ 8171ab64890Smrg + sizeof(INT16); /* sizeof value length */ 8181ab64890Smrg 8191ab64890Smrg *ret_len = 0; 8201ab64890Smrg for (p = arg; p->name; p++) { 8211ab64890Smrg if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) { 8221ab64890Smrg if (_XimSetInnerIMAttributes(im, top, p, mode)) 8231ab64890Smrg continue; 8241ab64890Smrg return p->name; 8251ab64890Smrg } 8261ab64890Smrg 8271ab64890Smrg check = _XimCheckIMMode(res, mode); 8281ab64890Smrg if (check == XIM_CHECK_INVALID) 8291ab64890Smrg continue; 8301ab64890Smrg else if (check == XIM_CHECK_ERROR) 8311ab64890Smrg return p->name; 8321ab64890Smrg 8331ab64890Smrg if (!(_XimEncodeLocalIMAttr(res, top, p->value))) 8341ab64890Smrg return p->name; 8351ab64890Smrg 8361ab64890Smrg buf_s = (CARD16 *)buf; 8371ab64890Smrg if (!(_XimValueToAttribute(res, (XPointer)&buf_s[2], (size - min_len), 8381ab64890Smrg p->value, &len, mode, (XPointer)NULL))) 8391ab64890Smrg return p->name; 8401ab64890Smrg 8411ab64890Smrg if (len == 0) { 8421ab64890Smrg continue; 8431ab64890Smrg } else if (len < 0) { 8441ab64890Smrg *arg_ret = p; 8451ab64890Smrg return (char *)NULL; 8461ab64890Smrg } 8471ab64890Smrg 8481ab64890Smrg buf_s[0] = res->id; /* attribute ID */ 8491ab64890Smrg buf_s[1] = len; /* value length */ 8501ab64890Smrg XIM_SET_PAD(&buf_s[2], len); /* pad */ 8511ab64890Smrg len += min_len; 8521ab64890Smrg 8531ab64890Smrg buf += len; 8541ab64890Smrg *ret_len += len; 8551ab64890Smrg size -= len; 8561ab64890Smrg } 8571ab64890Smrg *arg_ret = (XIMArg *)NULL; 8581ab64890Smrg return (char *)NULL; 8591ab64890Smrg} 8601ab64890Smrg 8611ab64890Smrg#ifdef XIM_CONNECTABLE 862eb411b4bSmrgBool 8631ab64890Smrg_XimEncodeSavedIMATTRIBUTE( 8641ab64890Smrg Xim im, 8651ab64890Smrg XIMResourceList res_list, 8661ab64890Smrg unsigned int res_num, 8671ab64890Smrg int *idx, 8681ab64890Smrg char *buf, 8691ab64890Smrg int size, 8701ab64890Smrg int *ret_len, 8711ab64890Smrg XPointer top, 8721ab64890Smrg unsigned long mode) 8731ab64890Smrg{ 8741ab64890Smrg register int i; 8751ab64890Smrg int num = im->private.proto.num_saved_imvalues; 8761ab64890Smrg XrmQuark *quark_list = im->private.proto.saved_imvalues; 8771ab64890Smrg XIMResourceList res; 8781ab64890Smrg XPointer value; 8791ab64890Smrg CARD16 *buf_s; 8801ab64890Smrg int len; 8811ab64890Smrg int min_len = sizeof(CARD16) /* sizeof attribute ID */ 8821ab64890Smrg + sizeof(INT16); /* sizeof value length */ 8831ab64890Smrg 8841ab64890Smrg if (!im->private.proto.saved_imvalues) { 8851ab64890Smrg *idx = -1; 8861ab64890Smrg *ret_len = 0; 8871ab64890Smrg return True; 8881ab64890Smrg } 8891ab64890Smrg 8901ab64890Smrg *ret_len = 0; 8911ab64890Smrg for (i = *idx; i < num; i++) { 8921ab64890Smrg if (!(res = _XimGetResourceListRecByQuark(res_list, 8931ab64890Smrg res_num, quark_list[i]))) 8941ab64890Smrg continue; 8951ab64890Smrg 8961ab64890Smrg if (!_XimDecodeLocalIMAttr(res, top, value)) 8971ab64890Smrg return False; 8981ab64890Smrg 8991ab64890Smrg buf_s = (CARD16 *)buf; 9001ab64890Smrg if (!(_XimValueToAttribute(res, (XPointer)&buf_s[2], 9011ab64890Smrg (size - min_len), value, &len, mode, (XPointer)NULL))) 9021ab64890Smrg return False; 9031ab64890Smrg 9041ab64890Smrg if (len == 0) { 9051ab64890Smrg continue; 9061ab64890Smrg } else if (len < 0) { 9071ab64890Smrg *idx = i; 9081ab64890Smrg return True; 9091ab64890Smrg } 9101ab64890Smrg 9111ab64890Smrg buf_s[0] = res->id; /* attribute ID */ 9121ab64890Smrg buf_s[1] = len; /* value length */ 9131ab64890Smrg XIM_SET_PAD(&buf_s[2], len); /* pad */ 9141ab64890Smrg len += min_len; 9151ab64890Smrg 9161ab64890Smrg buf += len; 9171ab64890Smrg *ret_len += len; 9181ab64890Smrg size -= len; 9191ab64890Smrg } 9201ab64890Smrg *idx = -1; 9211ab64890Smrg return True; 9221ab64890Smrg} 9231ab64890Smrg#endif /* XIM_CONNECTABLE */ 9241ab64890Smrg 925eb411b4bSmrgstatic Bool 9261ab64890Smrg_XimEncodeTopValue( 9271ab64890Smrg Xic ic, 9281ab64890Smrg XIMResourceList res, 9291ab64890Smrg XIMArg *p) 9301ab64890Smrg{ 9311ab64890Smrg if (res->xrm_name == XrmStringToQuark(XNClientWindow)) { 9321ab64890Smrg ic->core.client_window = (Window)p->value; 9331ab64890Smrg if (ic->core.focus_window == (Window)0) 9341ab64890Smrg ic->core.focus_window = ic->core.client_window; 9351ab64890Smrg _XimRegisterFilter(ic); 9361ab64890Smrg 9371ab64890Smrg } else if (res->xrm_name == XrmStringToQuark(XNFocusWindow)) { 9381ab64890Smrg if (ic->core.client_window) { 9391ab64890Smrg _XimUnregisterFilter(ic); 9401ab64890Smrg ic->core.focus_window = (Window)p->value; 9411ab64890Smrg _XimRegisterFilter(ic); 9421ab64890Smrg } else /* client_window not yet */ 9431ab64890Smrg ic->core.focus_window = (Window)p->value; 9441ab64890Smrg } 9451ab64890Smrg return True; 9461ab64890Smrg} 9471ab64890Smrg 948eb411b4bSmrgstatic Bool 9491ab64890Smrg_XimEncodePreeditValue( 9501ab64890Smrg Xic ic, 9511ab64890Smrg XIMResourceList res, 9521ab64890Smrg XIMArg *p) 9531ab64890Smrg{ 9541ab64890Smrg if (res->xrm_name == XrmStringToQuark(XNStdColormap)) { 9551ab64890Smrg XStandardColormap *colormap_ret; 9561ab64890Smrg int count; 9571ab64890Smrg 9581ab64890Smrg if (!(XGetRGBColormaps(ic->core.im->core.display, 9591ab64890Smrg ic->core.focus_window, &colormap_ret, 9601ab64890Smrg &count, (Atom)p->value))) 9611ab64890Smrg return False; 9621ab64890Smrg 96357f47464Smrg XFree(colormap_ret); 9641ab64890Smrg } else if (res->xrm_name == XrmStringToQuark(XNFontSet)) { 9651ab64890Smrg int list_ret; 9661ab64890Smrg XFontStruct **struct_list; 9671ab64890Smrg char **name_list; 9681ab64890Smrg char *tmp; 9691ab64890Smrg int len; 9701ab64890Smrg register int i; 9711ab64890Smrg 9721ab64890Smrg if (!p->value) 9731ab64890Smrg return False; 9741ab64890Smrg 9751ab64890Smrg if (ic->private.proto.preedit_font) 9761ab64890Smrg Xfree(ic->private.proto.preedit_font); 9771ab64890Smrg 9781ab64890Smrg list_ret = XFontsOfFontSet((XFontSet)p->value, 9791ab64890Smrg &struct_list, &name_list); 9801ab64890Smrg for (i = 0, len = 0; i < list_ret; i++) { 9811ab64890Smrg len += (strlen(name_list[i]) + sizeof(char)); 9821ab64890Smrg } 9831ab64890Smrg if (!(tmp = Xmalloc(len + 1))) { 9841ab64890Smrg ic->private.proto.preedit_font = NULL; 9851ab64890Smrg return False; 9861ab64890Smrg } 9871ab64890Smrg 9881ab64890Smrg tmp[0] = '\0'; 9891ab64890Smrg for (i = 0; i < list_ret; i++) { 9901ab64890Smrg strcat(tmp, name_list[i]); 9911ab64890Smrg strcat(tmp, ","); 9921ab64890Smrg } 9931ab64890Smrg tmp[len - 1] = 0; 9941ab64890Smrg ic->private.proto.preedit_font = tmp; 9951ab64890Smrg ic->private.proto.preedit_font_length = len - 1; 9961ab64890Smrg } 9971ab64890Smrg return True; 9981ab64890Smrg} 9991ab64890Smrg 1000eb411b4bSmrgstatic Bool 10011ab64890Smrg_XimEncodeStatusValue( 10021ab64890Smrg Xic ic, 10031ab64890Smrg XIMResourceList res, 10041ab64890Smrg XIMArg *p) 10051ab64890Smrg{ 10061ab64890Smrg if (res->xrm_name == XrmStringToQuark(XNStdColormap)) { 100757f47464Smrg XStandardColormap *colormap_ret = NULL; 10081ab64890Smrg int count; 10091ab64890Smrg 10101ab64890Smrg if (!(XGetRGBColormaps(ic->core.im->core.display, 10111ab64890Smrg ic->core.focus_window, &colormap_ret, 10121ab64890Smrg &count, (Atom)p->value))) 10131ab64890Smrg return False; 10141ab64890Smrg 101557f47464Smrg XFree(colormap_ret); 10161ab64890Smrg } else if (res->xrm_name == XrmStringToQuark(XNFontSet)) { 10171ab64890Smrg int list_ret; 10181ab64890Smrg XFontStruct **struct_list; 10191ab64890Smrg char **name_list; 10201ab64890Smrg char *tmp; 10211ab64890Smrg int len; 10221ab64890Smrg register int i; 10231ab64890Smrg 10241ab64890Smrg if (!p->value) 10251ab64890Smrg return False; 10261ab64890Smrg 10271ab64890Smrg if (ic->private.proto.status_font) 10281ab64890Smrg Xfree(ic->private.proto.status_font); 10291ab64890Smrg 10301ab64890Smrg list_ret = XFontsOfFontSet((XFontSet)p->value, 10311ab64890Smrg &struct_list, &name_list); 10321ab64890Smrg for (i = 0, len = 0; i < list_ret; i++) { 10331ab64890Smrg len += (strlen(name_list[i]) + sizeof(char)); 10341ab64890Smrg } 10351ab64890Smrg if (!(tmp = Xmalloc(len+1))) { 10361ab64890Smrg ic->private.proto.status_font = NULL; 10371ab64890Smrg return False; 10381ab64890Smrg } 10391ab64890Smrg 10401ab64890Smrg tmp[0] = '\0'; 10411ab64890Smrg for(i = 0; i < list_ret; i++) { 10421ab64890Smrg strcat(tmp, name_list[i]); 10431ab64890Smrg strcat(tmp, ","); 10441ab64890Smrg } 10451ab64890Smrg tmp[len - 1] = 0; 10461ab64890Smrg ic->private.proto.status_font = tmp; 10471ab64890Smrg ic->private.proto.status_font_length = len - 1; 10481ab64890Smrg } 10491ab64890Smrg return True; 10501ab64890Smrg} 10511ab64890Smrg 1052eb411b4bSmrgstatic Bool 10531ab64890Smrg_XimSetInnerICAttributes( 10541ab64890Smrg Xic ic, 10551ab64890Smrg XPointer top, 10561ab64890Smrg XIMArg *arg, 10571ab64890Smrg unsigned long mode) 10581ab64890Smrg{ 10591ab64890Smrg XIMResourceList res; 10601ab64890Smrg int check; 10611ab64890Smrg 10621ab64890Smrg if (!(res = _XimGetResourceListRec(ic->private.proto.ic_inner_resources, 10631ab64890Smrg ic->private.proto.ic_num_inner_resources, arg->name))) 10641ab64890Smrg return False; 10651ab64890Smrg 10661ab64890Smrg check = _XimCheckICMode(res, mode); 10671ab64890Smrg if(check == XIM_CHECK_INVALID) 10681ab64890Smrg return True; 10691ab64890Smrg else if(check == XIM_CHECK_ERROR) 10701ab64890Smrg return False; 10711ab64890Smrg 10721ab64890Smrg return _XimEncodeLocalICAttr(ic, res, top, arg, mode); 10731ab64890Smrg} 10741ab64890Smrg 1075eb411b4bSmrgchar * 10761ab64890Smrg_XimEncodeICATTRIBUTE( 10771ab64890Smrg Xic ic, 10781ab64890Smrg XIMResourceList res_list, 10791ab64890Smrg unsigned int res_num, 10801ab64890Smrg XIMArg *arg, 10811ab64890Smrg XIMArg **arg_ret, 10821ab64890Smrg char *buf, 10831ab64890Smrg int size, 10841ab64890Smrg int *ret_len, 10851ab64890Smrg XPointer top, 10861ab64890Smrg BITMASK32 *flag, 10871ab64890Smrg unsigned long mode) 10881ab64890Smrg{ 10891ab64890Smrg register XIMArg *p; 10901ab64890Smrg XIMResourceList res; 10911ab64890Smrg int check; 10921ab64890Smrg CARD16 *buf_s; 10931ab64890Smrg int len; 10941ab64890Smrg int min_len = sizeof(CARD16) /* sizeof attribute ID */ 10951ab64890Smrg + sizeof(INT16); /* sizeof value length */ 10961ab64890Smrg XrmQuark pre_quark; 10971ab64890Smrg XrmQuark sts_quark; 10981ab64890Smrg char *name; 10991ab64890Smrg 11001ab64890Smrg pre_quark = XrmStringToQuark(XNPreeditAttributes); 11011ab64890Smrg sts_quark = XrmStringToQuark(XNStatusAttributes); 11021ab64890Smrg 11031ab64890Smrg *ret_len = 0; 11041ab64890Smrg for (p = arg; p && p->name; p++) { 11051ab64890Smrg buf_s = (CARD16 *)buf; 11061ab64890Smrg if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) { 11071ab64890Smrg if (_XimSetInnerICAttributes(ic, top, p, mode)) 11081ab64890Smrg continue; 11091ab64890Smrg return p->name; 11101ab64890Smrg } 11111ab64890Smrg 11121ab64890Smrg check = _XimCheckICMode(res, mode); 11131ab64890Smrg if (check == XIM_CHECK_INVALID) 11141ab64890Smrg continue; 11151ab64890Smrg else if (check == XIM_CHECK_ERROR) 11161ab64890Smrg return p->name; 11171ab64890Smrg 11181ab64890Smrg if (mode & XIM_PREEDIT_ATTR) { 11191ab64890Smrg if (!(_XimEncodePreeditValue(ic, res, p))) 11201ab64890Smrg return p->name; 11211ab64890Smrg } else if (mode & XIM_STATUS_ATTR) { 11221ab64890Smrg if (!(_XimEncodeStatusValue(ic, res, p))) 11231ab64890Smrg return p->name; 11241ab64890Smrg } else { 11251ab64890Smrg if (!(_XimEncodeTopValue(ic, res, p))) 11261ab64890Smrg return p->name; 11271ab64890Smrg } 11281ab64890Smrg 11291ab64890Smrg if (res->resource_size == XimType_NEST) { 11301ab64890Smrg XimDefICValues *ic_attr = (XimDefICValues *)top; 11311ab64890Smrg 11321ab64890Smrg if (res->xrm_name == pre_quark) { 11331ab64890Smrg XIMArg *arg_rt; 11341ab64890Smrg if ((name = _XimEncodeICATTRIBUTE(ic, res_list, res_num, 11351ab64890Smrg (XIMArg *)p->value, &arg_rt, 11361ab64890Smrg (char *)&buf_s[2], (size - min_len), 11371ab64890Smrg &len, (XPointer)&ic_attr->preedit_attr, flag, 11381ab64890Smrg (mode | XIM_PREEDIT_ATTR)))) { 11391ab64890Smrg return name; 11401ab64890Smrg } 11411ab64890Smrg 11421ab64890Smrg } else if (res->xrm_name == sts_quark) { 11431ab64890Smrg XIMArg *arg_rt; 11441ab64890Smrg if ((name = _XimEncodeICATTRIBUTE(ic, res_list, res_num, 11451ab64890Smrg (XIMArg *)p->value, &arg_rt, 11461ab64890Smrg (char *)&buf_s[2], (size - min_len), 11471ab64890Smrg &len, (XPointer)&ic_attr->status_attr, flag, 11481ab64890Smrg (mode | XIM_STATUS_ATTR)))) { 11491ab64890Smrg return name; 11501ab64890Smrg } 11511ab64890Smrg } 11521ab64890Smrg } else { 11531ab64890Smrg#ifdef EXT_MOVE 11541ab64890Smrg if (flag) 11551ab64890Smrg *flag |= _XimExtenArgCheck(p); 11561ab64890Smrg#endif 11571ab64890Smrg if (!(_XimEncodeLocalICAttr(ic, res, top, p, mode))) 11581ab64890Smrg return p->name; 11591ab64890Smrg 11601ab64890Smrg if (!(_XimValueToAttribute(res, (XPointer)&buf_s[2], 11611ab64890Smrg (size - min_len), p->value, 11621ab64890Smrg &len, mode, (XPointer)ic))) 11631ab64890Smrg return p->name; 11641ab64890Smrg } 11651ab64890Smrg 11661ab64890Smrg if (len == 0) { 11671ab64890Smrg continue; 11681ab64890Smrg } else if (len < 0) { 11691ab64890Smrg *arg_ret = p; 11701ab64890Smrg return (char *)NULL; 11711ab64890Smrg } 11721ab64890Smrg 11731ab64890Smrg buf_s[0] = res->id; /* attribute ID */ 11741ab64890Smrg buf_s[1] = len; /* value length */ 11751ab64890Smrg XIM_SET_PAD(&buf_s[2], len); /* pad */ 11761ab64890Smrg len += min_len; 11771ab64890Smrg 11781ab64890Smrg buf += len; 11791ab64890Smrg *ret_len += len; 11801ab64890Smrg size -= len; 11811ab64890Smrg } 11821ab64890Smrg *arg_ret = (XIMArg *)NULL; 11831ab64890Smrg return (char *)NULL; 11841ab64890Smrg} 11851ab64890Smrg 11861ab64890Smrg#ifdef XIM_CONNECTABLE 1187eb411b4bSmrgstatic Bool 11881ab64890Smrg_XimEncodeSavedPreeditValue( 11891ab64890Smrg Xic ic, 11901ab64890Smrg XIMResourceList res, 11911ab64890Smrg XPointer value) 11921ab64890Smrg{ 11931ab64890Smrg int list_ret; 11941ab64890Smrg XFontStruct **struct_list; 11951ab64890Smrg char **name_list; 11961ab64890Smrg char *tmp; 11971ab64890Smrg int len; 11981ab64890Smrg register int i; 11991ab64890Smrg 12001ab64890Smrg if (res->xrm_name == XrmStringToQuark(XNFontSet)) { 12011ab64890Smrg if (!value) 12021ab64890Smrg return False; 12031ab64890Smrg 12041ab64890Smrg if (ic->private.proto.preedit_font) 12051ab64890Smrg Xfree(ic->private.proto.preedit_font); 12061ab64890Smrg 12071ab64890Smrg list_ret = XFontsOfFontSet((XFontSet)value, 12081ab64890Smrg &struct_list, &name_list); 12091ab64890Smrg for(i = 0, len = 0; i < list_ret; i++) { 12101ab64890Smrg len += (strlen(name_list[i]) + sizeof(char)); 12111ab64890Smrg } 12121ab64890Smrg if(!(tmp = Xmalloc(len + 1))) { 12131ab64890Smrg ic->private.proto.preedit_font = NULL; 12141ab64890Smrg return False; 12151ab64890Smrg } 12161ab64890Smrg 12171ab64890Smrg tmp[0] = '\0'; 12181ab64890Smrg for(i = 0; i < list_ret; i++) { 12191ab64890Smrg strcat(tmp, name_list[i]); 12201ab64890Smrg strcat(tmp, ","); 12211ab64890Smrg } 12221ab64890Smrg tmp[len - 1] = 0; 12231ab64890Smrg ic->private.proto.preedit_font = tmp; 12241ab64890Smrg ic->private.proto.preedit_font_length = len - 1; 12251ab64890Smrg } 12261ab64890Smrg return True; 12271ab64890Smrg} 12281ab64890Smrg 1229eb411b4bSmrgstatic Bool 12301ab64890Smrg_XimEncodeSavedStatusValue( 12311ab64890Smrg Xic ic, 12321ab64890Smrg XIMResourceList res, 12331ab64890Smrg XPointer value) 12341ab64890Smrg{ 12351ab64890Smrg int list_ret; 12361ab64890Smrg XFontStruct **struct_list; 12371ab64890Smrg char **name_list; 12381ab64890Smrg char *tmp; 12391ab64890Smrg int len; 12401ab64890Smrg register int i; 12411ab64890Smrg 12421ab64890Smrg if (res->xrm_name == XrmStringToQuark(XNFontSet)) { 12431ab64890Smrg if (!value) 12441ab64890Smrg return False; 12451ab64890Smrg 12461ab64890Smrg if (ic->private.proto.status_font) 12471ab64890Smrg Xfree(ic->private.proto.status_font); 12481ab64890Smrg 12491ab64890Smrg list_ret = XFontsOfFontSet((XFontSet)value, 12501ab64890Smrg &struct_list, &name_list); 12511ab64890Smrg for(i = 0, len = 0; i < list_ret; i++) { 12521ab64890Smrg len += (strlen(name_list[i]) + sizeof(char)); 12531ab64890Smrg } 12541ab64890Smrg if(!(tmp = Xmalloc(len + 1))) { 12551ab64890Smrg ic->private.proto.status_font = NULL; 12561ab64890Smrg return False; 12571ab64890Smrg } 12581ab64890Smrg 12591ab64890Smrg tmp[0] = '\0'; 12601ab64890Smrg for(i = 0; i < list_ret; i++) { 12611ab64890Smrg strcat(tmp, name_list[i]); 12621ab64890Smrg strcat(tmp, ","); 12631ab64890Smrg } 12641ab64890Smrg tmp[len - 1] = 0; 12651ab64890Smrg ic->private.proto.status_font = tmp; 12661ab64890Smrg ic->private.proto.status_font_length = len - 1; 12671ab64890Smrg } 12681ab64890Smrg return True; 12691ab64890Smrg} 12701ab64890Smrg 1271eb411b4bSmrgBool 12721ab64890Smrg_XimEncodeSavedICATTRIBUTE( 12731ab64890Smrg Xic ic, 12741ab64890Smrg XIMResourceList res_list, 12751ab64890Smrg unsigned int res_num, 12761ab64890Smrg int *idx, 12771ab64890Smrg char *buf, 12781ab64890Smrg int size, 12791ab64890Smrg int *ret_len, 12801ab64890Smrg XPointer top, 12811ab64890Smrg unsigned long mode) 12821ab64890Smrg{ 12831ab64890Smrg int i; 12841ab64890Smrg int num = ic->private.proto.num_saved_icvalues; 12851ab64890Smrg XrmQuark *quark_list = ic->private.proto.saved_icvalues; 12861ab64890Smrg XIMResourceList res; 12871ab64890Smrg XPointer value; 12881ab64890Smrg CARD16 *buf_s; 12891ab64890Smrg int len; 12901ab64890Smrg int min_len = sizeof(CARD16) /* sizeof attribute ID */ 12911ab64890Smrg + sizeof(INT16); /* sizeof value length */ 12921ab64890Smrg XrmQuark pre_quark; 12931ab64890Smrg XrmQuark sts_quark; 12941ab64890Smrg XrmQuark separator; 12951ab64890Smrg 12961ab64890Smrg if (!ic->private.proto.saved_icvalues) { 12971ab64890Smrg *idx = -1; 12981ab64890Smrg *ret_len = 0; 12991ab64890Smrg return True; 13001ab64890Smrg } 13011ab64890Smrg 13021ab64890Smrg pre_quark = XrmStringToQuark(XNPreeditAttributes); 13031ab64890Smrg sts_quark = XrmStringToQuark(XNStatusAttributes); 13041ab64890Smrg separator = XrmStringToQuark(XNSeparatorofNestedList); 13051ab64890Smrg 13061ab64890Smrg *ret_len = 0; 13071ab64890Smrg for (i = *idx; i < num; i++) { 13081ab64890Smrg if (quark_list[i] == separator) { 13091ab64890Smrg *idx = i; 13101ab64890Smrg return True; 13111ab64890Smrg } 13121ab64890Smrg 13131ab64890Smrg if (!(res = _XimGetResourceListRecByQuark(res_list, 13141ab64890Smrg res_num, quark_list[i]))) 13151ab64890Smrg continue; 13161ab64890Smrg 13171ab64890Smrg if (!_XimDecodeLocalICAttr(res, top,(XPointer)&value, mode)) 13181ab64890Smrg return False; 13191ab64890Smrg 13201ab64890Smrg if (mode & XIM_PREEDIT_ATTR) { 13211ab64890Smrg if (!(_XimEncodeSavedPreeditValue(ic, res, value))) { 13221ab64890Smrg return False; 13231ab64890Smrg } 13241ab64890Smrg } else if (mode & XIM_STATUS_ATTR) { 13251ab64890Smrg if (!(_XimEncodeSavedStatusValue(ic, res, value))) { 13261ab64890Smrg return False; 13271ab64890Smrg } 13281ab64890Smrg } 13291ab64890Smrg 13301ab64890Smrg buf_s = (CARD16 *)buf; 13311ab64890Smrg if (res->resource_size == XimType_NEST) { 13321ab64890Smrg XimDefICValues *ic_attr = (XimDefICValues *)top; 13331ab64890Smrg 13341ab64890Smrg i++; 13351ab64890Smrg if (res->xrm_name == pre_quark) { 13361ab64890Smrg if (!_XimEncodeSavedICATTRIBUTE(ic, res_list, res_num, 13371ab64890Smrg &i, (char *)&buf_s[2], (size - min_len), 13381ab64890Smrg &len, (XPointer)&ic_attr->preedit_attr, 13391ab64890Smrg (mode | XIM_PREEDIT_ATTR))) { 13401ab64890Smrg return False; 13411ab64890Smrg } 13421ab64890Smrg 13431ab64890Smrg } else if (res->xrm_name == sts_quark) { 13441ab64890Smrg if (!_XimEncodeSavedICATTRIBUTE(ic, res_list, res_num, 13451ab64890Smrg &i, (char *)&buf_s[2], (size - min_len), 13461ab64890Smrg &len, (XPointer)&ic_attr->status_attr, 13471ab64890Smrg (mode | XIM_STATUS_ATTR))) { 13481ab64890Smrg return False; 13491ab64890Smrg } 13501ab64890Smrg } 13511ab64890Smrg } else { 13521ab64890Smrg if (!(_XimValueToAttribute(res, (XPointer)&buf_s[2], 13531ab64890Smrg (size - min_len), value, 13541ab64890Smrg &len, mode, (XPointer)ic))) { 13551ab64890Smrg return False; 13561ab64890Smrg } 13571ab64890Smrg } 13581ab64890Smrg 13591ab64890Smrg if (len == 0) { 13601ab64890Smrg continue; 13611ab64890Smrg } else if (len < 0) { 13621ab64890Smrg if (quark_list[i] == separator) 13631ab64890Smrg i++; 13641ab64890Smrg *idx = i; 13651ab64890Smrg return True; 13661ab64890Smrg } 13671ab64890Smrg 13681ab64890Smrg buf_s[0] = res->id; /* attribute ID */ 13691ab64890Smrg buf_s[1] = len; /* value length */ 13701ab64890Smrg XIM_SET_PAD(&buf_s[2], len); /* pad */ 13711ab64890Smrg len += min_len; 13721ab64890Smrg 13731ab64890Smrg buf += len; 13741ab64890Smrg *ret_len += len; 13751ab64890Smrg size -= len; 13761ab64890Smrg } 13771ab64890Smrg *idx = -1; 13781ab64890Smrg return True; 13791ab64890Smrg} 13801ab64890Smrg#endif /* XIM_CONNECTABLE */ 13811ab64890Smrg 1382eb411b4bSmrgstatic unsigned int 13831ab64890Smrg_XimCountNumberOfAttr( 13841ab64890Smrg INT16 total, 13851ab64890Smrg CARD16 *attr, 13861ab64890Smrg int *names_len) 13871ab64890Smrg{ 13881ab64890Smrg unsigned int n; 13891ab64890Smrg INT16 len; 13906cc2b21fSmrg INT16 min_len = sizeof(CARD16) /* sizeof attribute ID */ 13911ab64890Smrg + sizeof(CARD16) /* sizeof type of value */ 13921ab64890Smrg + sizeof(INT16); /* sizeof length of attribute */ 13931ab64890Smrg 13941ab64890Smrg n = 0; 13951ab64890Smrg *names_len = 0; 13961ab64890Smrg while (total > min_len) { 13971ab64890Smrg len = attr[2]; 13981ab64890Smrg *names_len += (len + 1); 13991ab64890Smrg len += (min_len + XIM_PAD(len + 2)); 14001ab64890Smrg total -= len; 14011ab64890Smrg attr = (CARD16 *)((char *)attr + len); 14021ab64890Smrg n++; 14031ab64890Smrg } 14041ab64890Smrg return n; 14051ab64890Smrg} 14061ab64890Smrg 1407eb411b4bSmrgBool 14081ab64890Smrg_XimGetAttributeID( 14091ab64890Smrg Xim im, 14101ab64890Smrg CARD16 *buf) 14111ab64890Smrg{ 14121ab64890Smrg unsigned int n; 14131ab64890Smrg XIMResourceList res; 14141ab64890Smrg char *names; 14151ab64890Smrg int names_len; 14161ab64890Smrg XPointer tmp; 14171ab64890Smrg XIMValuesList *values_list; 14181ab64890Smrg char **values; 14191ab64890Smrg int values_len; 14201ab64890Smrg register int i; 14211ab64890Smrg INT16 len; 14226cc2b21fSmrg INT16 min_len = sizeof(CARD16) /* sizeof attribute ID */ 14231ab64890Smrg + sizeof(CARD16) /* sizeof type of value */ 14241ab64890Smrg + sizeof(INT16); /* sizeof length of attr */ 14251ab64890Smrg /* 14261ab64890Smrg * IM attribute ID 14271ab64890Smrg */ 14281ab64890Smrg 14291ab64890Smrg if (!(n = _XimCountNumberOfAttr(buf[0], &buf[1], &names_len))) 14301ab64890Smrg return False; 14311ab64890Smrg 14326cc2b21fSmrg if (!(res = Xcalloc(n, sizeof(XIMResource)))) 14331ab64890Smrg return False; 14341ab64890Smrg 14351ab64890Smrg values_len = sizeof(XIMValuesList) + (sizeof(char **) * n) + names_len; 14366cc2b21fSmrg if (!(tmp = Xcalloc(1, values_len))) { 14376cc2b21fSmrg Xfree(res); 14381ab64890Smrg return False; 14396cc2b21fSmrg } 14401ab64890Smrg 14411ab64890Smrg values_list = (XIMValuesList *)tmp; 14421ab64890Smrg values = (char **)((char *)tmp + sizeof(XIMValuesList)); 14431ab64890Smrg names = (char *)((char *)values + (sizeof(char **) * n)); 14441ab64890Smrg 14451ab64890Smrg values_list->count_values = n; 14461ab64890Smrg values_list->supported_values = values; 14471ab64890Smrg 14481ab64890Smrg buf++; 14491ab64890Smrg for (i = 0; i < n; i++) { 14501ab64890Smrg len = buf[2]; 14511ab64890Smrg (void)memcpy(names, (char *)&buf[3], len); 14521ab64890Smrg values[i] = names; 14531ab64890Smrg names[len] = '\0'; 14541ab64890Smrg res[i].resource_name = names; 14551ab64890Smrg res[i].resource_size = buf[1]; 14561ab64890Smrg res[i].id = buf[0]; 14571ab64890Smrg names += (len + 1); 14581ab64890Smrg len += (min_len + XIM_PAD(len + 2)); 14591ab64890Smrg buf = (CARD16 *)((char *)buf + len); 14601ab64890Smrg } 14611ab64890Smrg _XIMCompileResourceList(res, n); 14621ab64890Smrg 14631ab64890Smrg if (im->core.im_resources) 14641ab64890Smrg Xfree(im->core.im_resources); 14651ab64890Smrg if (im->core.im_values_list) 14661ab64890Smrg Xfree(im->core.im_values_list); 14671ab64890Smrg im->core.im_resources = res; 14681ab64890Smrg im->core.im_num_resources = n; 14691ab64890Smrg im->core.im_values_list = values_list; 14701ab64890Smrg 14711ab64890Smrg /* 14721ab64890Smrg * IC attribute ID 14731ab64890Smrg */ 14741ab64890Smrg 14751ab64890Smrg if (!(n = _XimCountNumberOfAttr(buf[0], &buf[2], &names_len))) 14761ab64890Smrg return False; 14771ab64890Smrg 14786cc2b21fSmrg if (!(res = Xcalloc(n, sizeof(XIMResource)))) 14791ab64890Smrg return False; 14801ab64890Smrg 14811ab64890Smrg values_len = sizeof(XIMValuesList) + (sizeof(char **) * n) + names_len; 14826cc2b21fSmrg if (!(tmp = Xcalloc(1, values_len))) { 14836cc2b21fSmrg Xfree(res); 14841ab64890Smrg return False; 14856cc2b21fSmrg } 14861ab64890Smrg 14871ab64890Smrg values_list = (XIMValuesList *)tmp; 14881ab64890Smrg values = (char **)((char *)tmp + sizeof(XIMValuesList)); 14891ab64890Smrg names = (char *)((char *)values + (sizeof(char **) * n)); 14901ab64890Smrg 14911ab64890Smrg values_list->count_values = n; 14921ab64890Smrg values_list->supported_values = values; 14931ab64890Smrg 14941ab64890Smrg buf += 2; 14951ab64890Smrg for (i = 0; i < n; i++) { 14961ab64890Smrg len = buf[2]; 14971ab64890Smrg (void)memcpy(names, (char *)&buf[3], len); 14981ab64890Smrg values[i] = names; 14991ab64890Smrg names[len] = '\0'; 15001ab64890Smrg res[i].resource_name = names; 15011ab64890Smrg res[i].resource_size = buf[1]; 15021ab64890Smrg res[i].id = buf[0]; 15031ab64890Smrg names += (len + 1); 15041ab64890Smrg len += (min_len + XIM_PAD(len + 2)); 15051ab64890Smrg buf = (CARD16 *)((char *)buf + len); 15061ab64890Smrg } 15071ab64890Smrg _XIMCompileResourceList(res, n); 15081ab64890Smrg 15091ab64890Smrg if (im->core.ic_resources) 15101ab64890Smrg Xfree(im->core.ic_resources); 15111ab64890Smrg if (im->core.ic_values_list) 15121ab64890Smrg Xfree(im->core.ic_values_list); 15131ab64890Smrg im->core.ic_resources = res; 15141ab64890Smrg im->core.ic_num_resources = n; 15151ab64890Smrg im->core.ic_values_list = values_list; 15161ab64890Smrg 15171ab64890Smrg return True; 15181ab64890Smrg} 1519