imThaiIc.c revision 61b2299d
1/* $Xorg: imThaiIc.c,v 1.3 2000/08/17 19:45:15 cpqbld Exp $ */ 2/****************************************************************** 3 4 Copyright 1992, 1993, 1994 by FUJITSU LIMITED 5 Copyright 1993 by Digital Equipment Corporation 6 7Permission to use, copy, modify, distribute, and sell this software 8and its documentation for any purpose is hereby granted without fee, 9provided that the above copyright notice appear in all copies and that 10both that copyright notice and this permission notice appear in 11supporting documentation, and that the name of FUJITSU LIMITED and 12Digital Equipment Corporation not be used in advertising or publicity 13pertaining to distribution of the software without specific, written 14prior permission. FUJITSU LIMITED and Digital Equipment Corporation 15makes no representations about the suitability of this software for 16any purpose. It is provided "as is" without express or implied 17warranty. 18 19FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL 20WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED 21WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 22FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR 23ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 24WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER 25IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 26ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 27THIS SOFTWARE. 28 29 Author: Takashi Fujiwara FUJITSU LIMITED 30 fujiwara@a80.tech.yk.fujitsu.co.jp 31 Modifier: Franky Ling Digital Equipment Corporation 32 frankyling@hgrd01.enet.dec.com 33 34******************************************************************/ 35/* $XFree86: xc/lib/X11/imThaiIc.c,v 1.4 2001/01/17 19:41:52 dawes Exp $ */ 36 37#ifdef HAVE_CONFIG_H 38#include <config.h> 39#endif 40#include <stdio.h> 41#include <X11/Xlib.h> 42#include <X11/Xmd.h> 43#include "Xlibint.h" 44#include "Xlcint.h" 45#include "Ximint.h" 46 47Private void 48_XimThaiUnSetFocus( 49 XIC xic) 50{ 51 Xic ic = (Xic)xic; 52 ((Xim)ic->core.im)->private.local.current_ic = (XIC)NULL; 53 54 if (ic->core.focus_window) 55 _XUnregisterFilter(ic->core.im->core.display, ic->core.focus_window, 56 _XimThaiFilter, (XPointer)ic); 57 return; 58} 59 60Private void 61_XimThaiDestroyIC( 62 XIC xic) 63{ 64 Xic ic = (Xic)xic; 65 DefTreeBase *b = &ic->private.local.base; 66 67 if(((Xim)ic->core.im)->private.local.current_ic == (XIC)ic) { 68 _XimThaiUnSetFocus(xic); 69 } 70 if(ic->private.local.ic_resources) { 71 Xfree(ic->private.local.ic_resources); 72 ic->private.local.ic_resources = NULL; 73 } 74 75 if (b->tree) Xfree (b->tree); 76 if (b->mb) Xfree (b->mb); 77 if (b->wc) Xfree (b->wc); 78 if (b->utf8) Xfree (b->utf8); 79 b->tree = NULL; 80 b->mb = NULL; 81 b->wc = NULL; 82 b->utf8 = NULL; 83 return; 84} 85 86Private void 87_XimThaiSetFocus( 88 XIC xic) 89{ 90 Xic ic = (Xic)xic; 91 XIC current_ic = ((Xim)ic->core.im)->private.local.current_ic; 92 93 if (current_ic == (XIC)ic) 94 return; 95 96 if (current_ic != (XIC)NULL) { 97 _XimThaiUnSetFocus(current_ic); 98 } 99 ((Xim)ic->core.im)->private.local.current_ic = (XIC)ic; 100 101 if (ic->core.focus_window) 102 _XRegisterFilterByType(ic->core.im->core.display, ic->core.focus_window, 103 KeyPress, KeyPress, _XimThaiFilter, (XPointer)ic); 104 return; 105} 106 107Private void 108_XimThaiReset( 109 XIC xic) 110{ 111 Xic ic = (Xic)xic; 112 DefTreeBase *b = &ic->private.local.base; 113 ic->private.local.thai.comp_state = 0; 114 ic->private.local.thai.keysym = 0; 115 b->mb[b->tree[ic->private.local.composed].mb] = '\0'; 116 b->wc[b->tree[ic->private.local.composed].wc] = '\0'; 117 b->utf8[b->tree[ic->private.local.composed].utf8] = '\0'; 118} 119 120Private char * 121_XimThaiMbReset( 122 XIC xic) 123{ 124 _XimThaiReset(xic); 125 return (char *)NULL; 126} 127 128Private wchar_t * 129_XimThaiWcReset( 130 XIC xic) 131{ 132 _XimThaiReset(xic); 133 return (wchar_t *)NULL; 134} 135 136Private XICMethodsRec Thai_ic_methods = { 137 _XimThaiDestroyIC, /* destroy */ 138 _XimThaiSetFocus, /* set_focus */ 139 _XimThaiUnSetFocus, /* unset_focus */ 140 _XimLocalSetICValues, /* set_values */ 141 _XimLocalGetICValues, /* get_values */ 142 _XimThaiMbReset, /* mb_reset */ 143 _XimThaiWcReset, /* wc_reset */ 144 _XimThaiMbReset, /* utf8_reset */ 145 _XimLocalMbLookupString, /* mb_lookup_string */ 146 _XimLocalWcLookupString, /* wc_lookup_string */ 147 _XimLocalUtf8LookupString /* utf8_lookup_string */ 148}; 149 150XIC 151_XimThaiCreateIC( 152 XIM im, 153 XIMArg *values) 154{ 155 Xic ic; 156 XimDefICValues ic_values; 157 XIMResourceList res; 158 unsigned int num; 159 int len; 160 DefTree *tree; 161 162 if((ic = (Xic)Xmalloc(sizeof(XicRec))) == (Xic)NULL) { 163 return ((XIC)NULL); 164 } 165 bzero((char *)ic, sizeof(XicRec)); 166 167 ic->methods = &Thai_ic_methods; 168 ic->core.im = im; 169 ic->core.filter_events = KeyPressMask; 170 171 if (! (ic->private.local.base.tree = tree = (DefTree *)Xmalloc(sizeof(DefTree)*3)) ) 172 goto Set_Error; 173 if (! (ic->private.local.base.mb = (char *)Xmalloc(21)) ) 174 goto Set_Error; 175 if (! (ic->private.local.base.wc = (wchar_t*)Xmalloc(sizeof(wchar_t)*21)) ) 176 goto Set_Error; 177 if (! (ic->private.local.base.utf8 = (char *)Xmalloc(21)) ) 178 goto Set_Error; 179 ic->private.local.context = 1; 180 tree[1].mb = 1; 181 tree[1].wc = 1; 182 tree[1].utf8 = 1; 183 ic->private.local.composed = 2; 184 tree[2].mb = 11; 185 tree[2].wc = 11; 186 tree[2].utf8 = 11; 187 188 ic->private.local.thai.comp_state = 0; 189 ic->private.local.thai.keysym = 0; 190 ic->private.local.thai.input_mode = 0; 191 192 num = im->core.ic_num_resources; 193 len = sizeof(XIMResource) * num; 194 if((res = (XIMResourceList)Xmalloc(len)) == (XIMResourceList)NULL) { 195 goto Set_Error; 196 } 197 (void)memcpy((char *)res, (char *)im->core.ic_resources, len); 198 ic->private.local.ic_resources = res; 199 ic->private.local.ic_num_resources = num; 200 201 bzero((char *)&ic_values, sizeof(XimDefICValues)); 202 if(_XimCheckLocalInputStyle(ic, (XPointer)&ic_values, values, 203 im->core.styles, res, num) == False) { 204 goto Set_Error; 205 } 206 207 _XimSetICMode(res, num, ic_values.input_style); 208 209 if(_XimSetICValueData(ic, (XPointer)&ic_values, 210 ic->private.local.ic_resources, 211 ic->private.local.ic_num_resources, 212 values, XIM_CREATEIC, True)) { 213 goto Set_Error; 214 } 215 if(_XimSetICDefaults(ic, (XPointer)&ic_values, 216 XIM_SETICDEFAULTS, res, num) == False) { 217 goto Set_Error; 218 } 219 ic_values.filter_events = KeyPressMask; 220 _XimSetCurrentICValues(ic, &ic_values); 221 222 return ((XIC)ic); 223 224Set_Error : 225 if (ic->private.local.ic_resources) { 226 Xfree(ic->private.local.ic_resources); 227 } 228 Xfree(ic); 229 return((XIC)NULL); 230} 231