diff options
Diffstat (limited to 'modules/im/ximcp/imDefIm.c')
-rw-r--r-- | modules/im/ximcp/imDefIm.c | 87 |
1 files changed, 79 insertions, 8 deletions
diff --git a/modules/im/ximcp/imDefIm.c b/modules/im/ximcp/imDefIm.c index 2fca3f9e..e420be14 100644 --- a/modules/im/ximcp/imDefIm.c +++ b/modules/im/ximcp/imDefIm.c @@ -31,15 +31,22 @@ OF THIS SOFTWARE. makoto@sm.sony.co.jp ******************************************************************/ +/* $XFree86: xc/lib/X11/imDefIm.c,v 1.11 2002/12/14 01:53:56 dawes Exp $ */ #include <X11/Xatom.h> #define NEED_EVENTS #include "Xlibint.h" #include "Xlcint.h" #include "XlcPublic.h" +#include "XlcPubI.h" #include "XimTrInt.h" #include "Ximint.h" + +/* EXTERNS */ +/* imTransR.c */ +extern Bool _XimRegisterDispatcher(); + Public int _XimCheckDataSize(buf, len) XPointer buf; @@ -158,7 +165,7 @@ _XimCheckLocaleName(im, address, address_len, locale_name, len) *p = '\0'; for( n = 0; n < len; n++ ) - if( locale_name[n] && !strcmp( pp, locale_name[n] ) ) + if( locale_name[n] && !_XlcCompareISOLatin1( pp, locale_name[n] ) ) return locale_name[n]; if (finish) break; @@ -384,7 +391,7 @@ _XimPreConnect(im) unsigned long bytes_after; unsigned char *prop_return; Atom *atoms; - Window im_window; + Window im_window = 0; register int i; if((imserver = XInternAtom(display, XIM_SERVERS, True)) == (Atom)None) @@ -1030,6 +1037,30 @@ _XimProtoIMFree(im) _XlcCloseConverter(im->private.proto.ctow_conv); im->private.proto.ctow_conv = NULL; } + if (im->private.proto.ctoutf8_conv) { + _XlcCloseConverter(im->private.proto.ctoutf8_conv); + im->private.proto.ctoutf8_conv = NULL; + } + if (im->private.proto.cstomb_conv) { + _XlcCloseConverter(im->private.proto.cstomb_conv); + im->private.proto.cstomb_conv = NULL; + } + if (im->private.proto.cstowc_conv) { + _XlcCloseConverter(im->private.proto.cstowc_conv); + im->private.proto.cstowc_conv = NULL; + } + if (im->private.proto.cstoutf8_conv) { + _XlcCloseConverter(im->private.proto.cstoutf8_conv); + im->private.proto.cstoutf8_conv = NULL; + } + if (im->private.proto.ucstoc_conv) { + _XlcCloseConverter(im->private.proto.ucstoc_conv); + im->private.proto.ucstoc_conv = NULL; + } + if (im->private.proto.ucstoutf8_conv) { + _XlcCloseConverter(im->private.proto.ucstoutf8_conv); + im->private.proto.ucstoutf8_conv = NULL; + } #ifdef XIM_CONNECTABLE if (!IS_SERVER_CONNECTED(im) && IS_RECONNECTABLE(im)) { @@ -1105,6 +1136,13 @@ _XimProtoCloseIM(xim) #endif /* XIM_CONNECTABLE */ ic = next; } +#ifdef XIM_CONNECTABLE + if (!(!IS_SERVER_CONNECTED(im) && IS_RECONNECTABLE(im))) + im->core.ic_chain = NULL; +#else + im->core.ic_chain = NULL; +#endif + _XimUnregisterServerFilter(im); _XimResetIMInstantiateCallback(im); status = (Status)_XimClose(im); @@ -1429,7 +1467,7 @@ _XimProtoGetIMValues(xim, arg) INT16 len; CARD32 reply32[BUFSIZE/4]; char *reply = (char *)reply32; - XPointer preply; + XPointer preply = NULL; int buf_size; int ret_code; char *makeid_name; @@ -1534,7 +1572,8 @@ Private XIMMethodsRec im_methods = { _XimProtoGetIMValues, /* get_values */ _XimProtoCreateIC, /* create_ic */ _Ximctstombs, /* ctstombs */ - _Ximctstowcs /* ctstowcs */ + _Ximctstowcs, /* ctstowcs */ + _Ximctstoutf8 /* ctstoutf8 */ }; Private Bool @@ -1594,8 +1633,11 @@ _XimGetEncoding(im, buf, name, name_len, detail, detail_len) CARD16 category = buf[0]; CARD16 idx = buf[1]; int len; - XlcConv ctom_conv; - XlcConv ctow_conv; + XlcConv ctom_conv = NULL; + XlcConv ctow_conv = NULL; + XlcConv ctoutf8_conv = NULL; + XlcConv conv; + XimProtoPrivateRec *private = &im->private.proto; if (idx == (CARD16)XIM_Default_Encoding_IDX) { /* XXX */ if (!(ctom_conv = _XlcOpenConverter(lcd, @@ -1604,6 +1646,9 @@ _XimGetEncoding(im, buf, name, name_len, detail, detail_len) if (!(ctow_conv = _XlcOpenConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar))) return False; + if (!(ctoutf8_conv = _XlcOpenConverter(lcd, + XlcNCompoundText, lcd, XlcNUtf8String))) + return False; } if (category == XIM_Encoding_NameCategory) { @@ -1616,6 +1661,9 @@ _XimGetEncoding(im, buf, name, name_len, detail, detail_len) if (!(ctow_conv = _XlcOpenConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar))) return False; + if (!(ctoutf8_conv = _XlcOpenConverter(lcd, + XlcNCompoundText, lcd, XlcNUtf8String))) + return False; break; } else { /* @@ -1633,8 +1681,31 @@ _XimGetEncoding(im, buf, name, name_len, detail, detail_len) } else { return False; } - im->private.proto.ctom_conv = ctom_conv; - im->private.proto.ctow_conv = ctow_conv; + + private->ctom_conv = ctom_conv; + private->ctow_conv = ctow_conv; + private->ctoutf8_conv = ctoutf8_conv; + + if (!(conv = _XlcOpenConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte))) + return False; + private->cstomb_conv = conv; + + if (!(conv = _XlcOpenConverter(lcd, XlcNCharSet, lcd, XlcNWideChar))) + return False; + private->cstowc_conv = conv; + + if (!(conv = _XlcOpenConverter(lcd, XlcNCharSet, lcd, XlcNUtf8String))) + return False; + private->cstoutf8_conv = conv; + + if (!(conv = _XlcOpenConverter(lcd, XlcNUcsChar, lcd, XlcNChar))) + return False; + private->ucstoc_conv = conv; + + if (!(conv = _XlcOpenConverter(lcd, XlcNUcsChar, lcd, XlcNUtf8String))) + return False; + private->ucstoutf8_conv = conv; + return True; } |