imThaiIc.c revision eb411b4b
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 45static 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 58static 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 84static 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 105static 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 118static char * 119_XimThaiMbReset( 120 XIC xic) 121{ 122 _XimThaiReset(xic); 123 return (char *)NULL; 124} 125 126static wchar_t * 127_XimThaiWcReset( 128 XIC xic) 129{ 130 _XimThaiReset(xic); 131 return (wchar_t *)NULL; 132} 133 134static 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 = Xcalloc(1, sizeof(XicRec))) == (Xic)NULL) { 161 return ((XIC)NULL); 162 } 163 164 ic->methods = &Thai_ic_methods; 165 ic->core.im = im; 166 ic->core.filter_events = KeyPressMask; 167 168 if (! (ic->private.local.base.tree = tree = (DefTree *)Xmalloc(sizeof(DefTree)*3)) ) 169 goto Set_Error; 170 if (! (ic->private.local.base.mb = (char *)Xmalloc(21)) ) 171 goto Set_Error; 172 if (! (ic->private.local.base.wc = (wchar_t*)Xmalloc(sizeof(wchar_t)*21)) ) 173 goto Set_Error; 174 if (! (ic->private.local.base.utf8 = (char *)Xmalloc(21)) ) 175 goto Set_Error; 176 ic->private.local.context = 1; 177 tree[1].mb = 1; 178 tree[1].wc = 1; 179 tree[1].utf8 = 1; 180 ic->private.local.composed = 2; 181 tree[2].mb = 11; 182 tree[2].wc = 11; 183 tree[2].utf8 = 11; 184 185 ic->private.local.thai.comp_state = 0; 186 ic->private.local.thai.keysym = 0; 187 ic->private.local.thai.input_mode = 0; 188 189 num = im->core.ic_num_resources; 190 len = sizeof(XIMResource) * num; 191 if((res = (XIMResourceList)Xmalloc(len)) == (XIMResourceList)NULL) { 192 goto Set_Error; 193 } 194 (void)memcpy((char *)res, (char *)im->core.ic_resources, len); 195 ic->private.local.ic_resources = res; 196 ic->private.local.ic_num_resources = num; 197 198 bzero((char *)&ic_values, sizeof(XimDefICValues)); 199 if(_XimCheckLocalInputStyle(ic, (XPointer)&ic_values, values, 200 im->core.styles, res, num) == False) { 201 goto Set_Error; 202 } 203 204 _XimSetICMode(res, num, ic_values.input_style); 205 206 if(_XimSetICValueData(ic, (XPointer)&ic_values, 207 ic->private.local.ic_resources, 208 ic->private.local.ic_num_resources, 209 values, XIM_CREATEIC, True)) { 210 goto Set_Error; 211 } 212 if(_XimSetICDefaults(ic, (XPointer)&ic_values, 213 XIM_SETICDEFAULTS, res, num) == False) { 214 goto Set_Error; 215 } 216 ic_values.filter_events = KeyPressMask; 217 _XimSetCurrentICValues(ic, &ic_values); 218 219 return ((XIC)ic); 220 221Set_Error : 222 if (ic->private.local.ic_resources) { 223 Xfree(ic->private.local.ic_resources); 224 } 225 Xfree(ic); 226 return((XIC)NULL); 227} 228