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