imLcIc.c revision 1ab64890
1/* $Xorg: imLcIc.c,v 1.3 2000/08/17 19:45:13 cpqbld Exp $ */
2/******************************************************************
3
4                Copyright 1992,1993, 1994 by FUJITSU LIMITED
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
9that both that copyright notice and this permission notice appear
10in supporting documentation, and that the name of FUJITSU LIMITED
11not be used in advertising or publicity pertaining to distribution
12of the software without specific, written prior permission.
13FUJITSU LIMITED makes no representations about the suitability of
14this software for any purpose.
15It is provided "as is" without express or implied warranty.
16
17FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
18INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
19EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
20CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
21USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
22OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
23PERFORMANCE OF THIS SOFTWARE.
24
25  Author: Takashi Fujiwara     FUJITSU LIMITED
26                               fujiwara@a80.tech.yk.fujitsu.co.jp
27
28******************************************************************/
29/* $XFree86: xc/lib/X11/imLcIc.c,v 1.4 2001/01/17 19:41:52 dawes Exp $ */
30
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34#include <stdio.h>
35#include <X11/Xlib.h>
36#include <X11/Xmd.h>
37#include "Xlibint.h"
38#include "Xlcint.h"
39#include "Ximint.h"
40
41Private void
42_XimLocalUnSetFocus(
43    XIC	 xic)
44{
45    Xic  ic = (Xic)xic;
46    ((Xim)ic->core.im)->private.local.current_ic = (XIC)NULL;
47
48    if (ic->core.focus_window)
49	_XUnregisterFilter(ic->core.im->core.display,
50			ic->core.focus_window, _XimLocalFilter, (XPointer)ic);
51    return;
52}
53
54Private void
55_XimLocalDestroyIC(
56    XIC	 xic)
57{
58    Xic	 ic = (Xic)xic;
59
60    if(((Xim)ic->core.im)->private.local.current_ic == (XIC)ic) {
61	((Xim)ic->core.im)->private.local.current_ic = (XIC)NULL;
62    }
63    if (ic->core.focus_window)
64	_XUnregisterFilter(ic->core.im->core.display,
65			ic->core.focus_window, _XimLocalFilter, (XPointer)ic);
66    if(ic->private.local.ic_resources) {
67	Xfree(ic->private.local.ic_resources);
68	ic->private.local.ic_resources = NULL;
69    }
70    return;
71}
72
73Private void
74_XimLocalSetFocus(
75    XIC	 xic)
76{
77    Xic	 ic = (Xic)xic;
78    XIC	 current_ic = ((Xim)ic->core.im)->private.local.current_ic;
79
80    if (current_ic == (XIC)ic)
81	return;
82
83    if (current_ic != (XIC)NULL) {
84	_XimLocalUnSetFocus(current_ic);
85    }
86    ((Xim)ic->core.im)->private.local.current_ic = (XIC)ic;
87
88    if (ic->core.focus_window)
89	_XRegisterFilterByType(ic->core.im->core.display,
90			ic->core.focus_window, KeyPress, KeyRelease,
91			_XimLocalFilter, (XPointer)ic);
92    return;
93}
94
95Private void
96_XimLocalReset(
97    XIC	 xic)
98{
99    Xic	 ic = (Xic)xic;
100    ic->private.local.composed       = 0;
101    ic->private.local.context        = ((Xim)ic->core.im)->private.local.top;
102    ic->private.local.brl_pressed    = 0;
103    ic->private.local.brl_committing = 0;
104    ic->private.local.brl_committed  = 0;
105}
106
107Private char *
108_XimLocalMbReset(
109    XIC	 xic)
110{
111    _XimLocalReset(xic);
112    return (char *)NULL;
113}
114
115Private wchar_t *
116_XimLocalWcReset(
117    XIC	 xic)
118{
119    _XimLocalReset(xic);
120    return (wchar_t *)NULL;
121}
122
123Private XICMethodsRec Local_ic_methods = {
124    _XimLocalDestroyIC, 	/* destroy */
125    _XimLocalSetFocus,  	/* set_focus */
126    _XimLocalUnSetFocus,	/* unset_focus */
127    _XimLocalSetICValues,	/* set_values */
128    _XimLocalGetICValues,	/* get_values */
129    _XimLocalMbReset,		/* mb_reset */
130    _XimLocalWcReset,		/* wc_reset */
131    _XimLocalMbReset,		/* utf8_reset */
132    _XimLocalMbLookupString,	/* mb_lookup_string */
133    _XimLocalWcLookupString,	/* wc_lookup_string */
134    _XimLocalUtf8LookupString	/* utf8_lookup_string */
135};
136
137Public XIC
138_XimLocalCreateIC(
139    XIM			 im,
140    XIMArg		*values)
141{
142    Xic			 ic;
143    XimDefICValues	 ic_values;
144    XIMResourceList	 res;
145    unsigned int	 num;
146    int			 len;
147
148    if((ic = (Xic)Xmalloc(sizeof(XicRec))) == (Xic)NULL) {
149	return ((XIC)NULL);
150    }
151    bzero((char *)ic, sizeof(XicRec));
152
153    ic->methods = &Local_ic_methods;
154    ic->core.im = im;
155    ic->private.local.base           = ((Xim)im)->private.local.base;
156    ic->private.local.context        = ((Xim)im)->private.local.top;
157    ic->private.local.composed       = 0;
158    ic->private.local.brl_pressed    = 0;
159    ic->private.local.brl_committing = 0;
160    ic->private.local.brl_committed  = 0;
161
162    num = im->core.ic_num_resources;
163    len = sizeof(XIMResource) * num;
164    if((res = (XIMResourceList)Xmalloc(len)) == (XIMResourceList)NULL) {
165	goto Set_Error;
166    }
167    (void)memcpy((char *)res, (char *)im->core.ic_resources, len);
168    ic->private.local.ic_resources     = res;
169    ic->private.local.ic_num_resources = num;
170
171    bzero((char *)&ic_values, sizeof(XimDefICValues));
172    if(_XimCheckLocalInputStyle(ic, (XPointer)&ic_values, values,
173				 im->core.styles, res, num) == False) {
174	goto Set_Error;
175    }
176
177    _XimSetICMode(res, num, ic_values.input_style);
178
179    if(_XimSetICValueData(ic, (XPointer)&ic_values,
180			ic->private.local.ic_resources,
181			ic->private.local.ic_num_resources,
182			values, XIM_CREATEIC, True)) {
183	goto Set_Error;
184    }
185    ic_values.filter_events = KeyPressMask;
186    _XimSetCurrentICValues(ic, &ic_values);
187    if(_XimSetICDefaults(ic, (XPointer)&ic_values,
188				XIM_SETICDEFAULTS, res, num) == False) {
189	goto Set_Error;
190    }
191    _XimSetCurrentICValues(ic, &ic_values);
192
193    return((XIC)ic);
194
195Set_Error :
196    if (ic->private.local.ic_resources) {
197	Xfree(ic->private.local.ic_resources);
198	ic->private.local.ic_resources = NULL;
199    }
200    Xfree(ic);
201    return((XIC)NULL);
202}
203