Home | History | Annotate | Line # | Download | only in ximcp
      1 /******************************************************************
      2 
      3           Copyright 1992, 1993, 1994 by FUJITSU LIMITED
      4           Copyright 1993 by Digital Equipment Corporation
      5 
      6 Permission to use, copy, modify, distribute, and sell this software
      7 and its documentation for any purpose is hereby granted without fee,
      8 provided that the above copyright notice appear in all copies and that
      9 both that copyright notice and this permission notice appear in
     10 supporting documentation, and that the name of FUJITSU LIMITED and
     11 Digital Equipment Corporation not be used in advertising or publicity
     12 pertaining to distribution of the software without specific, written
     13 prior permission.  FUJITSU LIMITED and Digital Equipment Corporation
     14 makes no representations about the suitability of this software for
     15 any purpose.  It is provided "as is" without express or implied
     16 warranty.
     17 
     18 FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
     19 WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
     20 WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
     21 FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR
     22 ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     23 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
     24 IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
     25 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
     26 THIS SOFTWARE.
     27 
     28   Author:    Takashi Fujiwara     FUJITSU LIMITED
     29                                	  fujiwara (at) a80.tech.yk.fujitsu.co.jp
     30   Modifier:  Franky Ling          Digital Equipment Corporation
     31 	                          frankyling (at) hgrd01.enet.dec.com
     32 
     33 ******************************************************************/
     34 
     35 #ifdef HAVE_CONFIG_H
     36 #include <config.h>
     37 #endif
     38 #include <stdio.h>
     39 #include <X11/Xlib.h>
     40 #include <X11/Xmd.h>
     41 #include <X11/Xatom.h>
     42 #include <X11/Xos.h>
     43 #include "Xlibint.h"
     44 #include "Xlcint.h"
     45 #include "XlcPublic.h"
     46 #include "XlcPubI.h"
     47 #include "Ximint.h"
     48 
     49 static XIMMethodsRec      Xim_im_thai_methods = {
     50     _XimThaiCloseIM,           /* close */
     51     _XimLocalSetIMValues,      /* set_values */
     52     _XimLocalGetIMValues,      /* get_values */
     53     _XimThaiCreateIC,          /* create_ic */
     54     _XimLcctstombs,            /* ctstombs */
     55     _XimLcctstowcs,            /* ctstowcs */
     56     _XimLcctstoutf8            /* ctstoutf8 */
     57 };
     58 
     59 #define THAI_LANGUAGE_NAME 	"th"
     60 
     61 Bool
     62 _XimCheckIfThaiProcessing(Xim im)
     63 {
     64     char *language;
     65 
     66     _XGetLCValues(im->core.lcd, XlcNLanguage, &language, NULL);
     67     if(strcmp(language, THAI_LANGUAGE_NAME) == 0 &&
     68        (strcmp(im->core.im_name, "") == 0 ||
     69         strcmp(im->core.im_name, "BasicCheck") == 0 ||
     70         strcmp(im->core.im_name, "Strict") == 0 ||
     71         strcmp(im->core.im_name, "Thaicat") == 0 ||
     72         strcmp(im->core.im_name, "Passthrough") == 0))
     73     {
     74 	return(True);
     75     }
     76     return(False);
     77 }
     78 
     79 Bool
     80 _XimThaiOpenIM(Xim im)
     81 {
     82     XLCd		 lcd = im->core.lcd;
     83     XlcConv		 conv;
     84     XimDefIMValues	 im_values;
     85     XimLocalPrivateRec*  private = &im->private.local;
     86 
     87     _XimInitialResourceInfo();
     88     if(_XimSetIMResourceList(&im->core.im_resources,
     89 		 		&im->core.im_num_resources) == False) {
     90 	goto Open_Error;
     91     }
     92     if(_XimSetICResourceList(&im->core.ic_resources,
     93 				&im->core.ic_num_resources) == False) {
     94 	goto Open_Error;
     95     }
     96 
     97     _XimSetIMMode(im->core.im_resources, im->core.im_num_resources);
     98 
     99     _XimGetCurrentIMValues(im, &im_values);
    100     if(_XimSetLocalIMDefaults(im, (XPointer)&im_values,
    101 		im->core.im_resources, im->core.im_num_resources) == False) {
    102 	goto Open_Error;
    103     }
    104     _XimSetCurrentIMValues(im, &im_values);
    105 
    106     if (!(conv = _XlcOpenConverter(lcd,	XlcNCompoundText, lcd, XlcNMultiByte)))
    107 	goto Open_Error;
    108     private->ctom_conv = conv;
    109 
    110     if (!(conv = _XlcOpenConverter(lcd,	XlcNCompoundText, lcd, XlcNWideChar)))
    111 	goto Open_Error;
    112     private->ctow_conv = conv;
    113 
    114     if (!(conv = _XlcOpenConverter(lcd,	XlcNCompoundText, lcd, XlcNUtf8String)))
    115 	goto Open_Error;
    116     private->ctoutf8_conv = conv;
    117 
    118     if (!(conv = _XlcOpenConverter(lcd,	XlcNCharSet, lcd, XlcNMultiByte)))
    119 	goto Open_Error;
    120     private->cstomb_conv = conv;
    121 
    122     if (!(conv = _XlcOpenConverter(lcd,	XlcNCharSet, lcd, XlcNWideChar)))
    123 	goto Open_Error;
    124     private->cstowc_conv = conv;
    125 
    126     if (!(conv = _XlcOpenConverter(lcd,	XlcNCharSet, lcd, XlcNUtf8String)))
    127 	goto Open_Error;
    128     private->cstoutf8_conv = conv;
    129 
    130     if (!(conv = _XlcOpenConverter(lcd,	XlcNUcsChar, lcd, XlcNChar)))
    131 	goto Open_Error;
    132     private->ucstoc_conv = conv;
    133 
    134     if (!(conv = _XlcOpenConverter(lcd,	XlcNUcsChar, lcd, XlcNUtf8String)))
    135 	goto Open_Error;
    136     private->ucstoutf8_conv = conv;
    137 
    138     im->methods = &Xim_im_thai_methods;
    139     private->current_ic = (XIC)NULL;
    140 
    141     return(True);
    142 
    143 Open_Error :
    144     _XimThaiIMFree(im);
    145     return(False);
    146 }
    147 
    148 void
    149 _XimThaiIMFree(Xim im)
    150 {
    151     if(im->core.im_resources) {
    152 	Xfree(im->core.im_resources);
    153 	im->core.im_resources = NULL;
    154     }
    155     if(im->core.ic_resources) {
    156 	Xfree(im->core.ic_resources);
    157 	im->core.ic_resources = NULL;
    158     }
    159     if(im->core.im_values_list) {
    160 	Xfree(im->core.im_values_list);
    161 	im->core.im_values_list = NULL;
    162     }
    163     if(im->core.ic_values_list) {
    164 	Xfree(im->core.ic_values_list);
    165 	im->core.ic_values_list = NULL;
    166     }
    167     if(im->core.styles) {
    168 	Xfree(im->core.styles);
    169 	im->core.styles = NULL;
    170     }
    171     if(im->core.res_name) {
    172 	Xfree(im->core.res_name);
    173 	im->core.res_name = NULL;
    174     }
    175     if(im->core.res_class) {
    176 	Xfree(im->core.res_class);
    177 	im->core.res_class = NULL;
    178     }
    179     if(im->core.im_name) {
    180 	Xfree(im->core.im_name);
    181 	im->core.im_name = NULL;
    182     }
    183     if (im->private.local.ctom_conv) {
    184 	_XlcCloseConverter(im->private.local.ctom_conv);
    185 	im->private.local.ctom_conv = NULL;
    186     }
    187     if (im->private.local.ctow_conv) {
    188 	_XlcCloseConverter(im->private.local.ctow_conv);
    189 	im->private.local.ctow_conv = NULL;
    190     }
    191     if (im->private.local.ctoutf8_conv) {
    192 	_XlcCloseConverter(im->private.local.ctoutf8_conv);
    193 	im->private.local.ctoutf8_conv = NULL;
    194     }
    195     if (im->private.local.cstomb_conv) {
    196 	_XlcCloseConverter(im->private.local.cstomb_conv);
    197 	im->private.local.cstomb_conv = NULL;
    198     }
    199     if (im->private.local.cstowc_conv) {
    200 	_XlcCloseConverter(im->private.local.cstowc_conv);
    201 	im->private.local.cstowc_conv = NULL;
    202     }
    203     if (im->private.local.cstoutf8_conv) {
    204 	_XlcCloseConverter(im->private.local.cstoutf8_conv);
    205 	im->private.local.cstoutf8_conv = NULL;
    206     }
    207     if (im->private.local.ucstoc_conv) {
    208 	_XlcCloseConverter(im->private.local.ucstoc_conv);
    209 	im->private.local.ucstoc_conv = NULL;
    210     }
    211     if (im->private.local.ucstoutf8_conv) {
    212 	_XlcCloseConverter(im->private.local.ucstoutf8_conv);
    213 	im->private.local.ucstoutf8_conv = NULL;
    214     }
    215     return;
    216 }
    217 
    218 Status
    219 _XimThaiCloseIM(XIM xim)
    220 {
    221     Xim		im = (Xim)xim;
    222     XIC		ic;
    223     XIC		next;
    224 
    225     ic = im->core.ic_chain;
    226     im->core.ic_chain = NULL;
    227     while (ic) {
    228 	(*ic->methods->destroy) (ic);
    229 	next = ic->core.next;
    230 	Xfree (ic);
    231 	ic = next;
    232     }
    233     _XimThaiIMFree(im);
    234     return(True);
    235 }
    236