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