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