Index: libx11-1.0.3/modules/im/ximcp/imThaiFlt.c =================================================================== --- libx11-1.0.3.orig/modules/im/ximcp/imThaiFlt.c 2007-10-09 23:50:49.000000000 +0700 +++ libx11-1.0.3/modules/im/ximcp/imThaiFlt.c 2007-10-10 00:08:38.000000000 +0700 @@ -564,7 +564,40 @@ c = ucs2tis(screc.text->string.wcs[0]); XFree(screc.text->string.wcs); } else { - c = screc.text->string.mbs[0]; + Xim im; + char *codeset; + + im = (Xim) XIMOfIC((XIC)ic); + codeset = XLC_PUBLIC_PART(im->core.lcd)->codeset; + if (_XlcCompareISOLatin1(codeset, "TIS620") == 0 || + _XlcCompareISOLatin1(codeset, "ISO8859-11") == 0) + { + c = screc.text->string.mbs[0]; + } else if (_XlcCompareISOLatin1(codeset, "UTF-8") == 0) { + XlcConv conv; + int from_left; + int to_left; + char *from_buf; + char *to_buf; + + conv = _XlcOpenConverter(im->core.lcd, XlcNUtf8String, + im->core.lcd, XlcNCharSet); + from_buf = screc.text->string.mbs; + from_left = screc.text->length; + to_buf = (char *)&c; + to_left = 1; + + _XlcResetConverter(conv); + if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left, + (XPointer *)&to_buf, &to_left, NULL, 0) < 0) + { + c = (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb]; + } + _XlcCloseConverter(conv); + } else { + c = (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb]; + } + XFree(screc.text->string.mbs); } }