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