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