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