/****************************************************************** Copyright 1990, 1991, 1992,1993, 1994 by FUJITSU LIMITED Copyright 1994 by Sony Corporation Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of FUJITSU LIMITED and Sony Corporation not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. FUJITSU LIMITED and Sony Corporation make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. FUJITSU LIMITED AND SONY CORPORATION DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU LIMITED AND SONY CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Takashi Fujiwara FUJITSU LIMITED fujiwara@a80.tech.yk.fujitsu.co.jp Modifier: Makoto Wakamatsu Sony Corporation makoto@sm.sony.co.jp ******************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "Xlibint.h" #include "Xlcint.h" #include "Ximint.h" #include "Xresource.h" #define GET_NAME(x) name_table + x.name_offset typedef struct _XimValueOffsetInfo { unsigned short name_offset; XrmQuark quark; unsigned int offset; Bool (*defaults)( struct _XimValueOffsetInfo *, XPointer, XPointer, unsigned long ); Bool (*encode)( struct _XimValueOffsetInfo *, XPointer, XPointer ); Bool (*decode)( struct _XimValueOffsetInfo *, XPointer, XPointer ); } XimValueOffsetInfoRec, *XimValueOffsetInfo; #ifdef XIM_CONNECTABLE static Bool _XimCheckBool(str) char *str; { if(!strcmp(str, "True") || !strcmp(str, "true") || !strcmp(str, "Yes") || !strcmp(str, "yes") || !strcmp(str, "ON") || !strcmp(str, "on")) return True; return False; } void _XimSetProtoResource(im) Xim im; { char res_name_buf[256]; char* res_name; size_t res_name_len; char res_class_buf[256]; char* res_class; size_t res_class_len; char* str_type; XrmValue value; XIMStyle preedit_style = 0; XIMStyle status_style = 0; XIMStyles* imstyles; char* dotximdot = ".xim."; char* ximdot = "xim."; char* dotXimdot = ".Xim."; char* Ximdot = "Xim."; if (!im->core.rdb) return; res_name_len = strlen (im->core.res_name); if (res_name_len < 200) { res_name = res_name_buf; res_name_len = sizeof(res_name_buf); } else { res_name_len += 50; res_name = Xmalloc (res_name_len); } res_class_len = strlen (im->core.res_class); if (res_class_len < 200) { res_class = res_class_buf; res_class_len = sizeof(res_class_buf); } else { res_class_len += 50; res_class = Xmalloc (res_class_len); } /* pretend malloc always works */ (void) snprintf (res_name, res_name_len, "%s%s%s", im->core.res_name != NULL ? im->core.res_name : "*", im->core.res_name != NULL ? dotximdot : ximdot, "useAuth"); (void) snprintf (res_class, res_class_len, "%s%s%s", im->core.res_class != NULL ? im->core.res_class : "*", im->core.res_class != NULL ? dotXimdot : Ximdot, "UseAuth"); bzero(&value, sizeof(XrmValue)); if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) { if(_XimCheckBool(value.addr)) { MARK_USE_AUTHORIZATION_FUNC(im); } } (void) snprintf (res_name, res_name_len, "%s%s%s", im->core.res_name != NULL ? im->core.res_name : "*", im->core.res_name != NULL ? dotximdot : ximdot, "delaybinding"); (void) snprintf (res_class, res_class_len, "%s%s%s", im->core.res_class != NULL ? im->core.res_class : "*", im->core.res_class != NULL ? dotXimdot : Ximdot, "Delaybinding"); bzero(&value, sizeof(XrmValue)); if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) { if(_XimCheckBool(value.addr)) { MARK_DELAYBINDABLE(im); } } (void) snprintf (res_name, res_name_len, "%s%s%s", im->core.res_name != NULL ? im->core.res_name : "*", im->core.res_name != NULL ? dotximdot : ximdot, "reconnect"); (void) snprintf (res_class, res_class_len, "%s%s%s", im->core.res_class != NULL ? im->core.res_class : "*", im->core.res_class != NULL ? dotXimdot : Ximdot, "Reconnect"); bzero(&value, sizeof(XrmValue)); if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) { if(_XimCheckBool(value.addr)) { MARK_RECONNECTABLE(im); } } if(!IS_CONNECTABLE(im)) { if (res_name != res_name_buf) Xfree (res_name); if (res_class != res_class_buf) Xfree (res_class); return; } (void) snprintf (res_name, res_name_len, "%s%s%s", im->core.res_name != NULL ? im->core.res_name : "*", im->core.res_name != NULL ? dotximdot : ximdot, "preeditDefaultStyle"); (void) snprintf (res_class, res_class_len, "%s%s%s", im->core.res_class != NULL ? im->core.res_class : "*", im->core.res_class != NULL ? dotXimdot : Ximdot, "PreeditDefaultStyle"); if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) { if(!strcmp(value.addr, "XIMPreeditArea")) preedit_style = XIMPreeditArea; else if(!strcmp(value.addr, "XIMPreeditCallbacks")) preedit_style = XIMPreeditCallbacks; else if(!strcmp(value.addr, "XIMPreeditPosition")) preedit_style = XIMPreeditPosition; else if(!strcmp(value.addr, "XIMPreeditNothing")) preedit_style = XIMPreeditNothing; else if(!strcmp(value.addr, "XIMPreeditNone")) preedit_style = XIMPreeditNone; } if(!preedit_style) preedit_style = XIMPreeditNothing; (void) snprintf (res_name, res_name_len, "%s%s%s", im->core.res_name != NULL ? im->core.res_name : "*", im->core.res_name != NULL ? dotximdot : ximdot, "statusDefaultStyle"); (void) snprintf (res_class, res_class_len, "%s%s%s", im->core.res_class != NULL ? im->core.res_class : "*", im->core.res_class != NULL ? dotXimdot : Ximdot, "StatusDefaultStyle"); if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) { if(!strcmp(value.addr, "XIMStatusArea")) status_style = XIMStatusArea; else if(!strcmp(value.addr, "XIMStatusCallbacks")) status_style = XIMStatusCallbacks; else if(!strcmp(value.addr, "XIMStatusNothing")) status_style = XIMStatusNothing; else if(!strcmp(value.addr, "XIMStatusNone")) status_style = XIMStatusNone; } if(!status_style) status_style = XIMStatusNothing; if(!(imstyles = Xmalloc(sizeof(XIMStyles) + sizeof(XIMStyle)))){ if (res_name != res_name_buf) Xfree (res_name); if (res_class != res_class_buf) Xfree (res_class); return; } imstyles->count_styles = 1; imstyles->supported_styles = (XIMStyle *)((char *)imstyles + sizeof(XIMStyles)); imstyles->supported_styles[0] = preedit_style | status_style; im->private.proto.default_styles = imstyles; if (res_name != res_name_buf) Xfree (res_name); if (res_class != res_class_buf) Xfree (res_class); } #endif /* XIM_CONNECTABLE */ static const char name_table[] = /* 0 */ XNQueryInputStyle"\0" /* 16 */ XNClientWindow"\0" /* 29 */ XNInputStyle"\0" /* 40 */ XNFocusWindow"\0" /* 52 */ XNResourceName"\0" /* 65 */ XNResourceClass"\0" /* 79 */ XNGeometryCallback"\0" /* 96 */ XNDestroyCallback"\0" /* 112 */ XNFilterEvents"\0" /* 125 */ XNPreeditStartCallback"\0" /* 146 */ XNPreeditDoneCallback"\0" /* 166 */ XNPreeditDrawCallback"\0" /* 186 */ XNPreeditCaretCallback"\0" /* 207 */ XNPreeditStateNotifyCallback"\0" /* 234 */ XNPreeditAttributes"\0" /* 252 */ XNStatusStartCallback"\0" /* 272 */ XNStatusDoneCallback"\0" /* 291 */ XNStatusDrawCallback"\0" /* 310 */ XNStatusAttributes"\0" /* 327 */ XNArea"\0" /* 332 */ XNAreaNeeded"\0" /* 343 */ XNSpotLocation"\0" /* 356 */ XNColormap"\0" /* 365 */ XNStdColormap"\0" /* 377 */ XNForeground"\0" /* 388 */ XNBackground"\0" /* 399 */ XNBackgroundPixmap"\0" /* 416 */ XNFontSet"\0" /* 424 */ XNLineSpace"\0" /* 434 */ XNCursor"\0" /* 441 */ XNQueryIMValuesList"\0" /* 459 */ XNQueryICValuesList"\0" /* 477 */ XNVisiblePosition"\0" /* 493 */ XNStringConversionCallback"\0" /* 518 */ XNStringConversion"\0" /* 535 */ XNResetState"\0" /* 546 */ XNHotKey"\0" /* 553 */ XNHotKeyState"\0" /* 565 */ XNPreeditState ; #define OFFSET_XNQUERYINPUTSTYLE 0 #define OFFSET_XNCLIENTWINDOW 16 #define OFFSET_XNINPUTSTYLE 29 #define OFFSET_XNFOCUSWINDOW 40 #define OFFSET_XNRESOURCENAME 52 #define OFFSET_XNRESOURCECLASS 65 #define OFFSET_XNGEOMETRYCALLBACK 79 #define OFFSET_XNDESTROYCALLBACK 96 #define OFFSET_XNFILTEREVENTS 112 #define OFFSET_XNPREEDITSTARTCALLBACK 125 #define OFFSET_XNPREEDITDONECALLBACK 146 #define OFFSET_XNPREEDITDRAWCALLBACK 166 #define OFFSET_XNPREEDITCARETCALLBACK 186 #define OFFSET_XNPREEDITSTATENOTIFYCALLBACK 207 #define OFFSET_XNPREEDITATTRIBUTES 234 #define OFFSET_XNSTATUSSTARTCALLBACK 252 #define OFFSET_XNSTATUSDONECALLBACK 272 #define OFFSET_XNSTATUSDRAWCALLBACK 291 #define OFFSET_XNSTATUSATTRIBUTES 310 #define OFFSET_XNAREA 327 #define OFFSET_XNAREANEEDED 332 #define OFFSET_XNSPOTLOCATION 343 #define OFFSET_XNCOLORMAP 356 #define OFFSET_XNSTDCOLORMAP 365 #define OFFSET_XNFOREGROUND 377 #define OFFSET_XNBACKGROUND 388 #define OFFSET_XNBACKGROUNDPIXMAP 399 #define OFFSET_XNFONTSET 416 #define OFFSET_XNLINESPACE 424 #define OFFSET_XNCURSOR 434 #define OFFSET_XNQUERYIMVALUESLIST 441 #define OFFSET_XNQUERYICVALUESLIST 459 #define OFFSET_XNVISIBLEPOSITION 477 #define OFFSET_XNSTRINGCONVERSIONCALLBACK 493 #define OFFSET_XNSTRINGCONVERSION 518 #define OFFSET_XNRESETSTATE 535 #define OFFSET_XNHOTKEY 546 #define OFFSET_XNHOTKEYSTATE 553 #define OFFSET_XNPREEDITSTATE 565 /* offsets into name_table */ static const unsigned short supported_local_im_values_list[] = { OFFSET_XNQUERYINPUTSTYLE, OFFSET_XNRESOURCENAME, OFFSET_XNRESOURCECLASS, OFFSET_XNDESTROYCALLBACK, OFFSET_XNQUERYIMVALUESLIST, OFFSET_XNQUERYICVALUESLIST, OFFSET_XNVISIBLEPOSITION }; /* offsets into name_table */ static const unsigned short supported_local_ic_values_list[] = { OFFSET_XNINPUTSTYLE, OFFSET_XNCLIENTWINDOW, OFFSET_XNFOCUSWINDOW, OFFSET_XNRESOURCENAME, OFFSET_XNRESOURCECLASS, OFFSET_XNGEOMETRYCALLBACK, OFFSET_XNFILTEREVENTS, OFFSET_XNDESTROYCALLBACK, OFFSET_XNSTRINGCONVERSIONCALLBACK, OFFSET_XNSTRINGCONVERSIONCALLBACK, OFFSET_XNRESETSTATE, OFFSET_XNHOTKEY, OFFSET_XNHOTKEYSTATE, OFFSET_XNPREEDITATTRIBUTES, OFFSET_XNSTATUSATTRIBUTES, OFFSET_XNAREA, OFFSET_XNAREANEEDED, OFFSET_XNSPOTLOCATION, OFFSET_XNCOLORMAP, OFFSET_XNSTDCOLORMAP, OFFSET_XNFOREGROUND, OFFSET_XNBACKGROUND, OFFSET_XNBACKGROUNDPIXMAP, OFFSET_XNFONTSET, OFFSET_XNLINESPACE, OFFSET_XNCURSOR, OFFSET_XNPREEDITSTARTCALLBACK, OFFSET_XNPREEDITDONECALLBACK, OFFSET_XNPREEDITDRAWCALLBACK, OFFSET_XNPREEDITCARETCALLBACK, OFFSET_XNSTATUSSTARTCALLBACK, OFFSET_XNSTATUSDONECALLBACK, OFFSET_XNSTATUSDRAWCALLBACK, OFFSET_XNPREEDITSTATE, OFFSET_XNPREEDITSTATENOTIFYCALLBACK }; static XIMStyle const supported_local_styles[] = { XIMPreeditNone | XIMStatusNone, XIMPreeditNothing | XIMStatusNothing, 0 /* dummy */ }; static Bool _XimDefaultStyles( XimValueOffsetInfo info, XPointer top, XPointer parm, /* unused */ unsigned long mode) /* unused */ { XIMStyles *styles; XIMStyles **out; register int i; unsigned int n; int len; XPointer tmp; n = XIMNumber(supported_local_styles) - 1; len = sizeof(XIMStyles) + sizeof(XIMStyle) * n; if(!(tmp = Xcalloc(1, len))) { return False; } styles = (XIMStyles *)tmp; if (n > 0) { styles->count_styles = (unsigned short)n; styles->supported_styles = (XIMStyle *)((char *)tmp + sizeof(XIMStyles)); for(i = 0; i < n; i++) { styles->supported_styles[i] = supported_local_styles[i]; } } out = (XIMStyles **)((char *)top + info->offset); *out = styles; return True; } static Bool _XimDefaultIMValues( XimValueOffsetInfo info, XPointer top, XPointer parm, /* unused */ unsigned long mode) /* unused */ { XIMValuesList *values_list; XIMValuesList **out; register int i; unsigned int n; int len; XPointer tmp; n = XIMNumber(supported_local_im_values_list); len = sizeof(XIMValuesList) + sizeof(char **) * n; if(!(tmp = Xcalloc(1, len))) { return False; } values_list = (XIMValuesList *)tmp; if (n > 0) { values_list->count_values = (unsigned short)n; values_list->supported_values = (char **)((char *)tmp + sizeof(XIMValuesList)); for(i = 0; i < n; i++) { values_list->supported_values[i] = (char *)name_table + supported_local_im_values_list[i]; } } out = (XIMValuesList **)((char *)top + info->offset); *out = values_list; return True; } static Bool _XimDefaultICValues( XimValueOffsetInfo info, XPointer top, XPointer parm, /* unused */ unsigned long mode) /* unused */ { XIMValuesList *values_list; XIMValuesList **out; register int i; unsigned int n; int len; XPointer tmp; n = XIMNumber(supported_local_ic_values_list); len = sizeof(XIMValuesList) + sizeof(char **) * n; if(!(tmp = Xcalloc(1, len))) { return False; } values_list = (XIMValuesList *)tmp; if (n > 0) { values_list->count_values = (unsigned short)n; values_list->supported_values = (char **)((char *)tmp + sizeof(XIMValuesList)); for(i = 0; i < n; i++) { values_list->supported_values[i] = (char *)name_table + supported_local_ic_values_list[i]; } } out = (XIMValuesList **)((char *)top + info->offset); *out = values_list; return True; } static Bool _XimDefaultVisiblePos( XimValueOffsetInfo info, XPointer top, XPointer parm, /* unused */ unsigned long mode) /* unused */ { Bool *out; out = (Bool *)((char *)top + info->offset); *out = False; return True; } static Bool _XimDefaultFocusWindow( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Xic ic = (Xic)parm; Window *out; if(ic->core.client_window == (Window)NULL) { return True; } out = (Window *)((char *)top + info->offset); *out = ic->core.client_window; return True; } static Bool _XimDefaultResName( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Xic ic = (Xic)parm; Xim im = (Xim)ic->core.im; char **out; if(im->core.res_name == (char *)NULL) { return True; } out = (char **)((char *)top + info->offset); *out = im->core.res_name; return True; } static Bool _XimDefaultResClass( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Xic ic = (Xic)parm; Xim im = (Xim)ic->core.im; char **out; if(im->core.res_class == (char *)NULL) { return True; } out = (char **)((char *)top + info->offset); *out = im->core.res_class; return True; } static Bool _XimDefaultDestroyCB( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Xic ic = (Xic)parm; Xim im = (Xim)ic->core.im; XIMCallback *out; out = (XIMCallback *)((char *)top + info->offset); *out = im->core.destroy_callback; return True; } static Bool _XimDefaultResetState( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { XIMResetState *out; out = (XIMResetState *)((char *)top + info->offset); *out = XIMInitialState; return True; } static Bool _XimDefaultHotKeyState( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { XIMHotKeyState *out; out = (XIMHotKeyState *)((char *)top + info->offset); *out = XIMHotKeyStateOFF; return True; } static Bool _XimDefaultArea( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Xic ic = (Xic)parm; Xim im = (Xim)ic->core.im; Window root_return; int x_return, y_return; unsigned int width_return, height_return; unsigned int border_width_return; unsigned int depth_return; XRectangle area; XRectangle *out; if(ic->core.focus_window == (Window)NULL) { return True; } if(XGetGeometry(im->core.display, (Drawable)ic->core.focus_window, &root_return, &x_return, &y_return, &width_return, &height_return, &border_width_return, &depth_return) == (Status)Success) { return True; } area.x = 0; area.y = 0; area.width = width_return; area.height = height_return; out = (XRectangle *)((char *)top + info->offset); *out = area; return True; } static Bool _XimDefaultColormap( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Xic ic = (Xic)parm; Xim im = (Xim)ic->core.im; XWindowAttributes win_attr; Colormap *out; if(ic->core.client_window == (Window)NULL) { return True; } if(XGetWindowAttributes(im->core.display, ic->core.client_window, &win_attr) == (Status)Success) { return True; } out = (Colormap *)((char *)top + info->offset); *out = win_attr.colormap; return True; } static Bool _XimDefaultStdColormap( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Atom *out; out = (Atom *)((char *)top + info->offset); *out = (Atom)0; return True; } static Bool _XimDefaultFg( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Xic ic = (Xic)parm; Xim im = (Xim)ic->core.im; unsigned long fg; unsigned long *out; fg = WhitePixel(im->core.display, DefaultScreen(im->core.display)); out = (unsigned long *)((char *)top + info->offset); *out = fg; return True; } static Bool _XimDefaultBg( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Xic ic = (Xic)parm; Xim im = (Xim)ic->core.im; unsigned long bg; unsigned long *out; bg = BlackPixel(im->core.display, DefaultScreen(im->core.display)); out = (unsigned long *)((char *)top + info->offset); *out = bg; return True; } static Bool _XimDefaultBgPixmap( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Pixmap *out; out = (Pixmap *)((char *)top + info->offset); *out = (Pixmap)0; return True; } static Bool _XimDefaultFontSet( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { XFontSet *out; out = (XFontSet *)((char *)top + info->offset); *out = 0; return True; } static Bool _XimDefaultLineSpace( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Xic ic = (Xic)parm; XFontSet fontset; XFontSetExtents *fset_extents; int line_space = 0; int *out; if(mode & XIM_PREEDIT_ATTR) { fontset = ic->core.preedit_attr.fontset; } else if(mode & XIM_STATUS_ATTR) { fontset = ic->core.status_attr.fontset; } else { return True; } if (fontset) { fset_extents = XExtentsOfFontSet(fontset); line_space = fset_extents->max_logical_extent.height; } out = (int *)((char *)top + info->offset); *out = line_space; return True; } static Bool _XimDefaultCursor( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { Cursor *out; out = (Cursor *)((char *)top + info->offset); *out = (Cursor)0; return True; } static Bool _XimDefaultPreeditState( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { XIMPreeditState *out; out = (XIMPreeditState *)((char *)top + info->offset); *out = XIMPreeditDisable; return True; } static Bool _XimDefaultNest( XimValueOffsetInfo info, XPointer top, XPointer parm, unsigned long mode) { return True; } static Bool _XimEncodeCallback( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMCallback *out; out = (XIMCallback *)((char *)top + info->offset); *out = *((XIMCallback *)val); return True; } static Bool _XimEncodeString( XimValueOffsetInfo info, XPointer top, XPointer val) { char *string; char **out; if(val == (XPointer)NULL) { return False; } if (!(string = strdup((char *)val))) { return False; } out = (char **)((char *)top + info->offset); if(*out) { Xfree(*out); } *out = string; return True; } static Bool _XimEncodeStyle( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMStyle *out; out = (XIMStyle *)((char *)top + info->offset); *out = (XIMStyle)val; return True; } static Bool _XimEncodeWindow( XimValueOffsetInfo info, XPointer top, XPointer val) { Window *out; out = (Window *)((char *)top + info->offset); *out = (Window)val; return True; } static Bool _XimEncodeStringConv( XimValueOffsetInfo info, XPointer top, XPointer val) { /* * Not yet */ return True; } static Bool _XimEncodeResetState( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMResetState *out; out = (XIMResetState *)((char *)top + info->offset); *out = (XIMResetState)val; return True; } static Bool _XimEncodeHotKey( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMHotKeyTriggers *hotkey = (XIMHotKeyTriggers *)val; XIMHotKeyTriggers **out; XIMHotKeyTriggers *key_list; XIMHotKeyTrigger *key; XPointer tmp; int num; int len; register int i; if(hotkey == (XIMHotKeyTriggers *)NULL) { return True; } if((num = hotkey->num_hot_key) == 0) { return True; } len = sizeof(XIMHotKeyTriggers) + sizeof(XIMHotKeyTrigger) * num; if(!(tmp = Xmalloc(len))) { return False; } key_list = (XIMHotKeyTriggers *)tmp; key = (XIMHotKeyTrigger *)((char *)tmp + sizeof(XIMHotKeyTriggers)); for(i = 0; i < num; i++) { key[i] = hotkey->key[i]; } key_list->num_hot_key = num; key_list->key = key; out = (XIMHotKeyTriggers **)((char *)top + info->offset); *out = key_list; return True; } static Bool _XimEncodeHotKetState( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMHotKeyState *out; out = (XIMHotKeyState *)((char *)top + info->offset); *out = (XIMHotKeyState)val; return True; } static Bool _XimEncodeRectangle( XimValueOffsetInfo info, XPointer top, XPointer val) { XRectangle *out; out = (XRectangle *)((char *)top + info->offset); *out = *((XRectangle *)val); return True; } static Bool _XimEncodeSpot( XimValueOffsetInfo info, XPointer top, XPointer val) { XPoint *out; out = (XPoint *)((char *)top + info->offset); *out = *((XPoint *)val); return True; } static Bool _XimEncodeColormap( XimValueOffsetInfo info, XPointer top, XPointer val) { Colormap *out; out = (Colormap *)((char *)top + info->offset); *out = (Colormap)val; return True; } static Bool _XimEncodeStdColormap( XimValueOffsetInfo info, XPointer top, XPointer val) { Atom *out; out = (Atom *)((char *)top + info->offset); *out = (Atom)val; return True; } static Bool _XimEncodeLong( XimValueOffsetInfo info, XPointer top, XPointer val) { unsigned long *out; out = (unsigned long *)((char *)top + info->offset); *out = (unsigned long)val; return True; } static Bool _XimEncodeBgPixmap( XimValueOffsetInfo info, XPointer top, XPointer val) { Pixmap *out; out = (Pixmap *)((char *)top + info->offset); *out = (Pixmap)val; return True; } static Bool _XimEncodeFontSet( XimValueOffsetInfo info, XPointer top, XPointer val) { XFontSet *out; out = (XFontSet *)((char *)top + info->offset); *out = (XFontSet)val; return True; } static Bool _XimEncodeLineSpace( XimValueOffsetInfo info, XPointer top, XPointer val) { int *out; out = (int *)((char *)top + info->offset); *out = (long)val; return True; } static Bool _XimEncodeCursor( XimValueOffsetInfo info, XPointer top, XPointer val) { Cursor *out; out = (Cursor *)((char *)top + info->offset); *out = (Cursor)val; return True; } static Bool _XimEncodePreeditState( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMPreeditState *out; out = (XIMPreeditState *)((char *)top + info->offset); *out = (XIMPreeditState)val; return True; } static Bool _XimEncodeNest( XimValueOffsetInfo info, XPointer top, XPointer val) { return True; } static Bool _XimDecodeStyles( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMStyles *styles; XIMStyles *out; register int i; unsigned int num; int len; XPointer tmp; if(val == (XPointer)NULL) { return False; } styles = *((XIMStyles **)((char *)top + info->offset)); num = styles->count_styles; len = sizeof(XIMStyles) + sizeof(XIMStyle) * num; if(!(tmp = Xcalloc(1, len))) { return False; } out = (XIMStyles *)tmp; if(num >0) { out->count_styles = (unsigned short)num; out->supported_styles = (XIMStyle *)((char *)tmp + sizeof(XIMStyles)); for(i = 0; i < num; i++) { out->supported_styles[i] = styles->supported_styles[i]; } } *((XIMStyles **)val) = out; return True; } static Bool _XimDecodeValues( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMValuesList *values_list; XIMValuesList *out; register int i; unsigned int num; int len; XPointer tmp; if(val == (XPointer)NULL) { return False; } values_list = *((XIMValuesList **)((char *)top + info->offset)); num = values_list->count_values; len = sizeof(XIMValuesList) + sizeof(char **) * num; if(!(tmp = Xcalloc(1, len))) { return False; } out = (XIMValuesList *)tmp; if(num) { out->count_values = (unsigned short)num; out->supported_values = (char **)((char *)tmp + sizeof(XIMValuesList)); for(i = 0; i < num; i++) { out->supported_values[i] = values_list->supported_values[i]; } } *((XIMValuesList **)val) = out; return True; } static Bool _XimDecodeCallback( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMCallback *in; XIMCallback *callback; in = (XIMCallback *)((char *)top + info->offset); if(!(callback = Xmalloc(sizeof(XIMCallback)))) { return False; } callback->client_data = in->client_data; callback->callback = in->callback; *((XIMCallback **)val) = callback; return True; } static Bool _XimDecodeString( XimValueOffsetInfo info, XPointer top, XPointer val) { char *in; char *string; in = *((char **)((char *)top + info->offset)); if (in != NULL) { string = strdup(in); } else { string = Xcalloc(1, 1); /* strdup("") */ } if (string == NULL) { return False; } *((char **)val) = string; return True; } static Bool _XimDecodeBool( XimValueOffsetInfo info, XPointer top, XPointer val) { Bool *in; in = (Bool *)((char *)top + info->offset); *((Bool *)val) = *in; return True; } static Bool _XimDecodeStyle( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMStyle *in; in = (XIMStyle *)((char *)top + info->offset); *((XIMStyle *)val) = *in; return True; } static Bool _XimDecodeWindow( XimValueOffsetInfo info, XPointer top, XPointer val) { Window *in; in = (Window *)((char *)top + info->offset); *((Window *)val) = *in; return True; } static Bool _XimDecodeStringConv( XimValueOffsetInfo info, XPointer top, XPointer val) { /* * Not yet */ return True; } static Bool _XimDecodeResetState( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMResetState *in; in = (XIMResetState *)((char *)top + info->offset); *((XIMResetState *)val) = *in; return True; } static Bool _XimDecodeHotKey( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMHotKeyTriggers *in; XIMHotKeyTriggers *hotkey; XIMHotKeyTrigger *key; XPointer tmp; int num; int len; register int i; in = *((XIMHotKeyTriggers **)((char *)top + info->offset)); num = in->num_hot_key; len = sizeof(XIMHotKeyTriggers) + sizeof(XIMHotKeyTrigger) * num; if(!(tmp = Xmalloc(len))) { return False; } hotkey = (XIMHotKeyTriggers *)tmp; key = (XIMHotKeyTrigger *)((char *)tmp + sizeof(XIMHotKeyTriggers)); for(i = 0; i < num; i++) { key[i] = in->key[i]; } hotkey->num_hot_key = num; hotkey->key = key; *((XIMHotKeyTriggers **)val) = hotkey; return True; } static Bool _XimDecodeHotKetState( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMHotKeyState *in; in = (XIMHotKeyState *)((char *)top + info->offset); *((XIMHotKeyState *)val) = *in; return True; } static Bool _XimDecodeRectangle( XimValueOffsetInfo info, XPointer top, XPointer val) { XRectangle *in; XRectangle *rect; in = (XRectangle *)((char *)top + info->offset); if(!(rect = Xmalloc(sizeof(XRectangle)))) { return False; } *rect = *in; *((XRectangle **)val) = rect; return True; } static Bool _XimDecodeSpot( XimValueOffsetInfo info, XPointer top, XPointer val) { XPoint *in; XPoint *spot; in = (XPoint *)((char *)top + info->offset); if(!(spot = Xmalloc(sizeof(XPoint)))) { return False; } *spot = *in; *((XPoint **)val) = spot; return True; } static Bool _XimDecodeColormap( XimValueOffsetInfo info, XPointer top, XPointer val) { Colormap *in; in = (Colormap *)((char *)top + info->offset); *((Colormap *)val) = *in; return True; } static Bool _XimDecodeStdColormap( XimValueOffsetInfo info, XPointer top, XPointer val) { Atom *in; in = (Atom *)((char *)top + info->offset); *((Atom *)val) = *in; return True; } static Bool _XimDecodeLong( XimValueOffsetInfo info, XPointer top, XPointer val) { unsigned long *in; in = (unsigned long *)((char *)top + info->offset); *((unsigned long *)val) = *in; return True; } static Bool _XimDecodeBgPixmap( XimValueOffsetInfo info, XPointer top, XPointer val) { Pixmap *in; in = (Pixmap *)((char *)top + info->offset); *((Pixmap *)val) = *in; return True; } static Bool _XimDecodeFontSet( XimValueOffsetInfo info, XPointer top, XPointer val) { XFontSet *in; in = (XFontSet *)((char *)top + info->offset); *((XFontSet *)val) = *in; return True; } static Bool _XimDecodeLineSpace( XimValueOffsetInfo info, XPointer top, XPointer val) { int *in; in = (int *)((char *)top + info->offset); *((int *)val) = *in; return True; } static Bool _XimDecodeCursor( XimValueOffsetInfo info, XPointer top, XPointer val) { Cursor *in; in = (Cursor *)((char *)top + info->offset); *((Cursor *)val) = *in; return True; } static Bool _XimDecodePreeditState( XimValueOffsetInfo info, XPointer top, XPointer val) { XIMPreeditState *in; in = (XIMPreeditState *)((char *)top + info->offset); *((XIMPreeditState *)val) = *in; return True; } static Bool _XimDecodeNest( XimValueOffsetInfo info, XPointer top, XPointer val) { return True; } static XIMResource im_resources[] = { {XNQueryInputStyle, 0, XimType_XIMStyles, 0, 0, 0}, {XNDestroyCallback, 0, 0, 0, 0, 0}, {XNResourceName, 0, XimType_STRING8, 0, 0, 0}, {XNResourceClass, 0, XimType_STRING8, 0, 0, 0}, {XNQueryIMValuesList, 0, 0, 0, 0, 0}, {XNQueryICValuesList, 0, 0, 0, 0, 0}, {XNVisiblePosition, 0, 0, 0, 0, 0} }; static XIMResource im_inner_resources[] = { {XNDestroyCallback, 0, 0, 0, 0, 0}, {XNResourceName, 0, XimType_STRING8, 0, 0, 0}, {XNResourceClass, 0, XimType_STRING8, 0, 0, 0}, {XNQueryIMValuesList, 0, 0, 0, 0, 0}, {XNQueryICValuesList, 0, 0, 0, 0, 0}, {XNVisiblePosition, 0, 0, 0, 0, 0} }; static XIMResource ic_resources[] = { {XNInputStyle, 0, XimType_CARD32, 0, 0, 0}, {XNClientWindow, 0, XimType_Window, 0, 0, 0}, {XNFocusWindow, 0, XimType_Window, 0, 0, 0}, {XNResourceName, 0, XimType_STRING8, 0, 0, 0}, {XNResourceClass, 0, XimType_STRING8, 0, 0, 0}, {XNGeometryCallback, 0, 0, 0, 0, 0}, {XNFilterEvents, 0, XimType_CARD32, 0, 0, 0}, {XNDestroyCallback, 0, 0, 0, 0, 0}, {XNStringConversionCallback, 0, 0, 0, 0, 0}, {XNStringConversion, 0, XimType_XIMStringConversion,0, 0, 0}, {XNResetState, 0, 0, 0, 0, 0}, {XNHotKey, 0, XimType_XIMHotKeyTriggers,0, 0, 0}, {XNHotKeyState, 0, XimType_XIMHotKeyState, 0, 0, 0}, {XNPreeditAttributes, 0, XimType_NEST, 0, 0, 0}, {XNStatusAttributes, 0, XimType_NEST, 0, 0, 0}, {XNArea, 0, XimType_XRectangle, 0, 0, 0}, {XNAreaNeeded, 0, XimType_XRectangle, 0, 0, 0}, {XNSpotLocation, 0, XimType_XPoint, 0, 0, 0}, {XNColormap, 0, XimType_CARD32, 0, 0, 0}, {XNStdColormap, 0, XimType_CARD32, 0, 0, 0}, {XNForeground, 0, XimType_CARD32, 0, 0, 0}, {XNBackground, 0, XimType_CARD32, 0, 0, 0}, {XNBackgroundPixmap, 0, XimType_CARD32, 0, 0, 0}, {XNFontSet, 0, XimType_XFontSet, 0, 0, 0}, {XNLineSpace, 0, XimType_CARD32, 0, 0, 0}, {XNCursor, 0, XimType_CARD32, 0, 0, 0}, {XNPreeditStartCallback, 0, 0, 0, 0, 0}, {XNPreeditDoneCallback, 0, 0, 0, 0, 0}, {XNPreeditDrawCallback, 0, 0, 0, 0, 0}, {XNPreeditCaretCallback, 0, 0, 0, 0, 0}, {XNStatusStartCallback, 0, 0, 0, 0, 0}, {XNStatusDoneCallback, 0, 0, 0, 0, 0}, {XNStatusDrawCallback, 0, 0, 0, 0, 0}, {XNPreeditState, 0, 0, 0, 0, 0}, {XNPreeditStateNotifyCallback, 0, 0, 0, 0, 0}, }; static XIMResource ic_inner_resources[] = { {XNResourceName, 0, XimType_STRING8, 0, 0, 0}, {XNResourceClass, 0, XimType_STRING8, 0, 0, 0}, {XNGeometryCallback, 0, 0, 0, 0, 0}, {XNDestroyCallback, 0, 0, 0, 0, 0}, {XNStringConversionCallback, 0, 0, 0, 0, 0}, {XNPreeditStartCallback, 0, 0, 0, 0, 0}, {XNPreeditDoneCallback, 0, 0, 0, 0, 0}, {XNPreeditDrawCallback, 0, 0, 0, 0, 0}, {XNPreeditCaretCallback, 0, 0, 0, 0, 0}, {XNStatusStartCallback, 0, 0, 0, 0, 0}, {XNStatusDoneCallback, 0, 0, 0, 0, 0}, {XNStatusDrawCallback, 0, 0, 0, 0, 0}, {XNPreeditStateNotifyCallback, 0, 0, 0, 0, 0}, }; static XimValueOffsetInfoRec im_attr_info[] = { {OFFSET_XNQUERYINPUTSTYLE, 0, XOffsetOf(XimDefIMValues, styles), _XimDefaultStyles, NULL, _XimDecodeStyles}, {OFFSET_XNDESTROYCALLBACK, 0, XOffsetOf(XimDefIMValues, destroy_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, {OFFSET_XNRESOURCENAME, 0, XOffsetOf(XimDefIMValues, res_name), NULL, _XimEncodeString, _XimDecodeString}, {OFFSET_XNRESOURCECLASS, 0, XOffsetOf(XimDefIMValues, res_class), NULL, _XimEncodeString, _XimDecodeString}, {OFFSET_XNQUERYIMVALUESLIST, 0, XOffsetOf(XimDefIMValues, im_values_list), _XimDefaultIMValues, NULL, _XimDecodeValues}, {OFFSET_XNQUERYICVALUESLIST, 0, XOffsetOf(XimDefIMValues, ic_values_list), _XimDefaultICValues, NULL, _XimDecodeValues}, {OFFSET_XNVISIBLEPOSITION, 0, XOffsetOf(XimDefIMValues, visible_position), _XimDefaultVisiblePos, NULL, _XimDecodeBool} }; static XimValueOffsetInfoRec ic_attr_info[] = { {OFFSET_XNINPUTSTYLE, 0, XOffsetOf(XimDefICValues, input_style), NULL, _XimEncodeStyle, _XimDecodeStyle}, {OFFSET_XNCLIENTWINDOW, 0, XOffsetOf(XimDefICValues, client_window), NULL, _XimEncodeWindow, _XimDecodeWindow}, {OFFSET_XNFOCUSWINDOW, 0, XOffsetOf(XimDefICValues, focus_window), _XimDefaultFocusWindow, _XimEncodeWindow, _XimDecodeWindow}, {OFFSET_XNRESOURCENAME, 0, XOffsetOf(XimDefICValues, res_name), _XimDefaultResName, _XimEncodeString, _XimDecodeString}, {OFFSET_XNRESOURCECLASS, 0, XOffsetOf(XimDefICValues, res_class), _XimDefaultResClass, _XimEncodeString, _XimDecodeString}, {OFFSET_XNGEOMETRYCALLBACK, 0, XOffsetOf(XimDefICValues, geometry_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, {OFFSET_XNFILTEREVENTS, 0, XOffsetOf(XimDefICValues, filter_events), NULL, NULL, _XimDecodeLong}, {OFFSET_XNDESTROYCALLBACK, 0, XOffsetOf(XimDefICValues, destroy_callback), _XimDefaultDestroyCB, _XimEncodeCallback, _XimDecodeCallback}, {OFFSET_XNSTRINGCONVERSIONCALLBACK, 0, XOffsetOf(XimDefICValues, string_conversion_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, {OFFSET_XNSTRINGCONVERSION, 0, XOffsetOf(XimDefICValues, string_conversion), NULL, _XimEncodeStringConv, _XimDecodeStringConv}, {OFFSET_XNRESETSTATE, 0, XOffsetOf(XimDefICValues, reset_state), _XimDefaultResetState, _XimEncodeResetState, _XimDecodeResetState}, {OFFSET_XNHOTKEY, 0, XOffsetOf(XimDefICValues, hotkey), NULL, _XimEncodeHotKey, _XimDecodeHotKey}, {OFFSET_XNHOTKEYSTATE, 0, XOffsetOf(XimDefICValues, hotkey_state), _XimDefaultHotKeyState, _XimEncodeHotKetState, _XimDecodeHotKetState}, {OFFSET_XNPREEDITATTRIBUTES, 0, XOffsetOf(XimDefICValues, preedit_attr), _XimDefaultNest, _XimEncodeNest, _XimDecodeNest}, {OFFSET_XNSTATUSATTRIBUTES, 0, XOffsetOf(XimDefICValues, status_attr), _XimDefaultNest, _XimEncodeNest, _XimDecodeNest}, }; static XimValueOffsetInfoRec ic_pre_attr_info[] = { {OFFSET_XNAREA, 0, XOffsetOf(ICPreeditAttributes, area), _XimDefaultArea, _XimEncodeRectangle, _XimDecodeRectangle}, {OFFSET_XNAREANEEDED, 0, XOffsetOf(ICPreeditAttributes, area_needed), NULL, _XimEncodeRectangle, _XimDecodeRectangle}, {OFFSET_XNSPOTLOCATION, 0, XOffsetOf(ICPreeditAttributes, spot_location), NULL, _XimEncodeSpot, _XimDecodeSpot}, {OFFSET_XNCOLORMAP, 0, XOffsetOf(ICPreeditAttributes, colormap), _XimDefaultColormap, _XimEncodeColormap, _XimDecodeColormap}, {OFFSET_XNSTDCOLORMAP, 0, XOffsetOf(ICPreeditAttributes, std_colormap), _XimDefaultStdColormap, _XimEncodeStdColormap, _XimDecodeStdColormap}, {OFFSET_XNFOREGROUND, 0, XOffsetOf(ICPreeditAttributes, foreground), _XimDefaultFg, _XimEncodeLong, _XimDecodeLong}, {OFFSET_XNBACKGROUND, 0, XOffsetOf(ICPreeditAttributes, background), _XimDefaultBg, _XimEncodeLong, _XimDecodeLong}, {OFFSET_XNBACKGROUNDPIXMAP, 0, XOffsetOf(ICPreeditAttributes, background_pixmap), _XimDefaultBgPixmap, _XimEncodeBgPixmap, _XimDecodeBgPixmap}, {OFFSET_XNFONTSET, 0, XOffsetOf(ICPreeditAttributes, fontset), _XimDefaultFontSet, _XimEncodeFontSet, _XimDecodeFontSet}, {OFFSET_XNLINESPACE, 0, XOffsetOf(ICPreeditAttributes, line_spacing), _XimDefaultLineSpace, _XimEncodeLineSpace, _XimDecodeLineSpace}, {OFFSET_XNCURSOR, 0, XOffsetOf(ICPreeditAttributes, cursor), _XimDefaultCursor, _XimEncodeCursor, _XimDecodeCursor}, {OFFSET_XNPREEDITSTARTCALLBACK, 0, XOffsetOf(ICPreeditAttributes, start_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, {OFFSET_XNPREEDITDONECALLBACK, 0, XOffsetOf(ICPreeditAttributes, done_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, {OFFSET_XNPREEDITDRAWCALLBACK, 0, XOffsetOf(ICPreeditAttributes, draw_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, {OFFSET_XNPREEDITCARETCALLBACK, 0, XOffsetOf(ICPreeditAttributes, caret_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, {OFFSET_XNPREEDITSTATE, 0, XOffsetOf(ICPreeditAttributes, preedit_state), _XimDefaultPreeditState, _XimEncodePreeditState,_XimDecodePreeditState}, {OFFSET_XNPREEDITSTATENOTIFYCALLBACK, 0, XOffsetOf(ICPreeditAttributes, state_notify_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, }; static XimValueOffsetInfoRec ic_sts_attr_info[] = { {OFFSET_XNAREA, 0, XOffsetOf(ICStatusAttributes, area), _XimDefaultArea, _XimEncodeRectangle, _XimDecodeRectangle}, {OFFSET_XNAREANEEDED, 0, XOffsetOf(ICStatusAttributes, area_needed), NULL, _XimEncodeRectangle, _XimDecodeRectangle}, {OFFSET_XNCOLORMAP, 0, XOffsetOf(ICStatusAttributes, colormap), _XimDefaultColormap, _XimEncodeColormap, _XimDecodeColormap}, {OFFSET_XNSTDCOLORMAP, 0, XOffsetOf(ICStatusAttributes, std_colormap), _XimDefaultStdColormap, _XimEncodeStdColormap, _XimDecodeStdColormap}, {OFFSET_XNFOREGROUND, 0, XOffsetOf(ICStatusAttributes, foreground), _XimDefaultFg, _XimEncodeLong, _XimDecodeLong}, {OFFSET_XNBACKGROUND, 0, XOffsetOf(ICStatusAttributes, background), _XimDefaultBg, _XimEncodeLong, _XimDecodeLong}, {OFFSET_XNBACKGROUNDPIXMAP, 0, XOffsetOf(ICStatusAttributes, background_pixmap), _XimDefaultBgPixmap, _XimEncodeBgPixmap, _XimDecodeBgPixmap}, {OFFSET_XNFONTSET, 0, XOffsetOf(ICStatusAttributes, fontset), _XimDefaultFontSet, _XimEncodeFontSet, _XimDecodeFontSet}, {OFFSET_XNLINESPACE, 0, XOffsetOf(ICStatusAttributes, line_spacing), _XimDefaultLineSpace, _XimEncodeLineSpace, _XimDecodeLineSpace}, {OFFSET_XNCURSOR, 0, XOffsetOf(ICStatusAttributes, cursor), _XimDefaultCursor, _XimEncodeCursor, _XimDecodeCursor}, {OFFSET_XNSTATUSSTARTCALLBACK, 0, XOffsetOf(ICStatusAttributes, start_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, {OFFSET_XNSTATUSDONECALLBACK, 0, XOffsetOf(ICStatusAttributes, done_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, {OFFSET_XNSTATUSDRAWCALLBACK, 0, XOffsetOf(ICStatusAttributes, draw_callback), NULL, _XimEncodeCallback, _XimDecodeCallback} }; typedef struct _XimIMMode { unsigned short name_offset; unsigned short mode; } XimIMMode; static const XimIMMode im_mode[] = { {OFFSET_XNQUERYINPUTSTYLE, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}, {OFFSET_XNDESTROYCALLBACK, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)}, {OFFSET_XNRESOURCENAME, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)}, {OFFSET_XNRESOURCECLASS, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)}, {OFFSET_XNQUERYIMVALUESLIST, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}, {OFFSET_XNQUERYICVALUESLIST, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}, {OFFSET_XNVISIBLEPOSITION, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)} }; typedef struct _XimICMode { unsigned short name_offset; unsigned short preedit_callback_mode; unsigned short preedit_position_mode; unsigned short preedit_area_mode; unsigned short preedit_nothing_mode; unsigned short preedit_none_mode; unsigned short status_callback_mode; unsigned short status_area_mode; unsigned short status_nothing_mode; unsigned short status_none_mode; } XimICMode; static const XimICMode ic_mode[] = { {OFFSET_XNINPUTSTYLE, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET), (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET), (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET), (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET)}, {OFFSET_XNCLIENTWINDOW, (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), 0, (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET), (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET), (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET), 0}, {OFFSET_XNFOCUSWINDOW, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNRESOURCENAME, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNRESOURCECLASS, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNGEOMETRYCALLBACK, 0, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0, 0}, {OFFSET_XNFILTEREVENTS, XIM_MODE_PRE_GET, XIM_MODE_PRE_GET, XIM_MODE_PRE_GET, XIM_MODE_PRE_GET, 0, XIM_MODE_STS_GET, XIM_MODE_STS_GET, XIM_MODE_STS_GET, XIM_MODE_STS_GET}, {OFFSET_XNDESTROYCALLBACK, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0}, {OFFSET_XNSTRINGCONVERSIONCALLBACK, (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0}, {OFFSET_XNSTRINGCONVERSION, XIM_MODE_PRE_SET, XIM_MODE_PRE_SET, XIM_MODE_PRE_SET, XIM_MODE_PRE_SET, XIM_MODE_PRE_SET, 0, 0, 0, 0}, {OFFSET_XNRESETSTATE, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0, 0}, {OFFSET_XNHOTKEY, (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0, 0}, {OFFSET_XNHOTKEYSTATE, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0, 0}, {OFFSET_XNPREEDITATTRIBUTES, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0, 0}, {OFFSET_XNSTATUSATTRIBUTES, 0, 0, 0, 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNAREA, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0, 0}, {OFFSET_XNAREANEEDED, 0, 0, (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, (XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0, 0}, {OFFSET_XNSPOTLOCATION, 0, /*(XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),*/ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0}, {OFFSET_XNCOLORMAP, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNSTDCOLORMAP, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNFOREGROUND, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNBACKGROUND, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNBACKGROUNDPIXMAP, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNFONTSET, 0, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNLINESPACE, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNCURSOR, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, {OFFSET_XNPREEDITSTARTCALLBACK, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0, 0, 0, 0, 0}, {OFFSET_XNPREEDITDONECALLBACK, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0, 0, 0, 0, 0}, {OFFSET_XNPREEDITDRAWCALLBACK, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0, 0, 0, 0, 0}, {OFFSET_XNPREEDITCARETCALLBACK, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0, 0, 0, 0, 0}, {OFFSET_XNPREEDITSTATE, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0, 0}, {OFFSET_XNPREEDITSTATENOTIFYCALLBACK, (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, 0, 0, 0}, {OFFSET_XNSTATUSSTARTCALLBACK, 0, 0, 0, 0, 0, (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0, 0, 0}, {OFFSET_XNSTATUSDONECALLBACK, 0, 0, 0, 0, 0, (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0, 0, 0}, {OFFSET_XNSTATUSDRAWCALLBACK, 0, 0, 0, 0, 0, (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0, 0, 0} }; /* the quarks are separated from im_mode/ic_mode so those arrays * can be const. */ static XrmQuark im_mode_quark[sizeof(im_mode) / sizeof(im_mode[0])]; static XrmQuark ic_mode_quark[sizeof(ic_mode) / sizeof(ic_mode[0])]; static Bool _XimSetResourceList( XIMResourceList *res_list, unsigned int *list_num, XIMResourceList resource, unsigned int num_resource, unsigned short id) { register int i; int len; XIMResourceList res; len = sizeof(XIMResource) * num_resource; if(!(res = Xcalloc(1, len))) { return False; } for(i = 0; i < num_resource; i++, id++) { res[i] = resource[i]; res[i].id = id; } _XIMCompileResourceList(res, num_resource); *res_list = res; *list_num = num_resource; return True; } Bool _XimSetIMResourceList( XIMResourceList *res_list, unsigned int *list_num) { return _XimSetResourceList(res_list, list_num, im_resources, XIMNumber(im_resources), 100); } Bool _XimSetICResourceList( XIMResourceList *res_list, unsigned int *list_num) { return _XimSetResourceList(res_list, list_num, ic_resources, XIMNumber(ic_resources), 200); } Bool _XimSetInnerIMResourceList( XIMResourceList *res_list, unsigned int *list_num) { return _XimSetResourceList(res_list, list_num, im_inner_resources, XIMNumber(im_inner_resources), 100); } Bool _XimSetInnerICResourceList( XIMResourceList *res_list, unsigned int *list_num) { return _XimSetResourceList(res_list, list_num, ic_inner_resources, XIMNumber(ic_inner_resources), 200); } static XIMResourceList _XimGetResourceListRecByMode( XIMResourceList res_list, unsigned int list_num, unsigned short mode) { register int i; for(i = 0; i < list_num; i++) { if (res_list[i].mode & mode) { return (XIMResourceList)&res_list[i]; } } return (XIMResourceList)NULL; } Bool _XimCheckCreateICValues( XIMResourceList res_list, unsigned int list_num) { if (!_XimGetResourceListRecByMode(res_list, list_num, XIM_MODE_IC_CREATE)) { return True; } return False; } XIMResourceList _XimGetResourceListRecByQuark( XIMResourceList res_list, unsigned int list_num, XrmQuark quark) { register int i; for(i = 0; i < list_num; i++) { if (res_list[i].xrm_name == quark) { return (XIMResourceList)&res_list[i]; } } return (XIMResourceList)NULL; } XIMResourceList _XimGetResourceListRec( XIMResourceList res_list, unsigned int list_num, const char *name) { XrmQuark quark = XrmStringToQuark(name); return _XimGetResourceListRecByQuark(res_list, list_num, quark); } char * _XimSetIMValueData( Xim im, XPointer top, XIMArg *values, XIMResourceList res_list, unsigned int list_num) { register XIMArg *p; XIMResourceList res; int check; for(p = values; p->name != NULL; p++) { if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) { return p->name; } check = _XimCheckIMMode(res, XIM_SETIMVALUES); if(check == XIM_CHECK_INVALID) { continue; } else if (check == XIM_CHECK_ERROR) { return p->name; } if(!_XimEncodeLocalIMAttr(res, top, p->value)) { return p->name; } } return NULL; } char * _XimGetIMValueData( Xim im, XPointer top, XIMArg *values, XIMResourceList res_list, unsigned int list_num) { register XIMArg *p; XIMResourceList res; int check; for(p = values; p->name != NULL; p++) { if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) { return p->name; } check = _XimCheckIMMode(res, XIM_GETIMVALUES); if(check == XIM_CHECK_INVALID) { continue; } else if (check == XIM_CHECK_ERROR) { return p->name; } if(!_XimDecodeLocalIMAttr(res, top, p->value)) { return p->name; } } return NULL; } void _XimSetIMMode( XIMResourceList res_list, unsigned int list_num) { XIMResourceList res; unsigned int n = XIMNumber(im_mode); register int i; for(i = 0; i < n; i++) { if(!(res = _XimGetResourceListRecByQuark(res_list, list_num, im_mode_quark[i]))) { continue; } res->mode = im_mode[i].mode; } return; } static int _XimCheckSetIMDefaultsMode( XIMResourceList res) { if(res->mode & XIM_MODE_IM_DEFAULT) { return XIM_CHECK_VALID; } return XIM_CHECK_INVALID; } static int _XimCheckSetIMValuesMode( XIMResourceList res) { if(res->mode & XIM_MODE_IM_SET) { return XIM_CHECK_VALID; } return XIM_CHECK_INVALID; } static int _XimCheckGetIMValuesMode( XIMResourceList res) { if(res->mode & XIM_MODE_IM_GET) { return XIM_CHECK_VALID; } return XIM_CHECK_INVALID; } int _XimCheckIMMode( XIMResourceList res, unsigned long mode) { if(res->mode == 0) { return XIM_CHECK_INVALID; } if(mode & XIM_SETIMDEFAULTS) { return _XimCheckSetIMDefaultsMode(res); } else if (mode & XIM_SETIMVALUES) { return _XimCheckSetIMValuesMode(res); } else if (mode & XIM_GETIMVALUES) { return _XimCheckGetIMValuesMode(res); } else { return XIM_CHECK_ERROR; } } void _XimSetICMode(XIMResourceList res_list, unsigned int list_num, XIMStyle style) { XIMResourceList res; unsigned int n = XIMNumber(ic_mode); register int i; unsigned int pre_offset; unsigned int sts_offset; if(style & XIMPreeditArea) { pre_offset = XOffsetOf(XimICMode, preedit_area_mode); } else if(style & XIMPreeditCallbacks) { pre_offset = XOffsetOf(XimICMode, preedit_callback_mode); } else if(style & XIMPreeditPosition) { pre_offset = XOffsetOf(XimICMode, preedit_position_mode); } else if(style & XIMPreeditNothing) { pre_offset = XOffsetOf(XimICMode, preedit_nothing_mode); } else { pre_offset = XOffsetOf(XimICMode, preedit_none_mode); } if(style & XIMStatusArea) { sts_offset = XOffsetOf(XimICMode, status_area_mode); } else if(style & XIMStatusCallbacks) { sts_offset = XOffsetOf(XimICMode, status_callback_mode); } else if(style & XIMStatusNothing) { sts_offset = XOffsetOf(XimICMode, status_nothing_mode); } else { sts_offset = XOffsetOf(XimICMode, status_none_mode); } for(i = 0; i < n; i++) { if(!(res = _XimGetResourceListRecByQuark(res_list, list_num, ic_mode_quark[i]))) { continue; } res->mode = ( (*(const unsigned short *)((const char *)&ic_mode[i] + pre_offset)) | (*(const unsigned short *)((const char *)&ic_mode[i] + sts_offset))); } return; } static int _XimCheckSetICDefaultsMode( XIMResourceList res, unsigned long mode) { if(mode & XIM_PREEDIT_ATTR) { if(!(res->mode & XIM_MODE_PRE_MASK)) { return XIM_CHECK_INVALID; } if(res->mode & XIM_MODE_PRE_CREATE) { return XIM_CHECK_ERROR; } else if (!(res->mode & XIM_MODE_PRE_DEFAULT)) { return XIM_CHECK_INVALID; } } else if(mode & XIM_STATUS_ATTR) { if(!(res->mode & XIM_MODE_STS_MASK)) { return XIM_CHECK_INVALID; } if(res->mode & XIM_MODE_STS_CREATE) { return XIM_CHECK_ERROR; } if(!(res->mode & XIM_MODE_STS_DEFAULT)) { return XIM_CHECK_INVALID; } } else { if(!res->mode) { return XIM_CHECK_INVALID; } if(res->mode & XIM_MODE_IC_CREATE) { return XIM_CHECK_ERROR; } if(!(res->mode & XIM_MODE_IC_DEFAULT)) { return XIM_CHECK_INVALID; } } return XIM_CHECK_VALID; } static int _XimCheckCreateICMode( XIMResourceList res, unsigned long mode) { if(mode & XIM_PREEDIT_ATTR) { if(!(res->mode & XIM_MODE_PRE_MASK)) { return XIM_CHECK_INVALID; } if(res->mode & XIM_MODE_PRE_CREATE) { res->mode &= ~XIM_MODE_PRE_CREATE; } else if(res->mode & XIM_MODE_PRE_ONCE) { res->mode &= ~XIM_MODE_PRE_ONCE; } else if(res->mode & XIM_MODE_PRE_DEFAULT) { res->mode &= ~XIM_MODE_PRE_DEFAULT; } else if (!(res->mode & XIM_MODE_PRE_SET)) { return XIM_CHECK_ERROR; } } else if(mode & XIM_STATUS_ATTR) { if(!(res->mode & XIM_MODE_STS_MASK)) { return XIM_CHECK_INVALID; } if(res->mode & XIM_MODE_STS_CREATE) { res->mode &= ~XIM_MODE_STS_CREATE; } else if(res->mode & XIM_MODE_STS_ONCE) { res->mode &= ~XIM_MODE_STS_ONCE; } else if(res->mode & XIM_MODE_STS_DEFAULT) { res->mode &= ~XIM_MODE_STS_DEFAULT; } else if (!(res->mode & XIM_MODE_STS_SET)) { return XIM_CHECK_ERROR; } } else { if(!res->mode) { return XIM_CHECK_INVALID; } if(res->mode & XIM_MODE_IC_CREATE) { res->mode &= ~XIM_MODE_IC_CREATE; } else if(res->mode & XIM_MODE_IC_ONCE) { res->mode &= ~XIM_MODE_IC_ONCE; } else if(res->mode & XIM_MODE_IC_DEFAULT) { res->mode &= ~XIM_MODE_IC_DEFAULT; } else if (!(res->mode & XIM_MODE_IC_SET)) { return XIM_CHECK_ERROR; } } return XIM_CHECK_VALID; } static int _XimCheckSetICValuesMode( XIMResourceList res, unsigned long mode) { if(mode & XIM_PREEDIT_ATTR) { if(!(res->mode & XIM_MODE_PRE_MASK)) { return XIM_CHECK_INVALID; } if(res->mode & XIM_MODE_PRE_ONCE) { res->mode &= ~XIM_MODE_PRE_ONCE; } else if(!(res->mode & XIM_MODE_PRE_SET)) { return XIM_CHECK_ERROR; } } else if(mode & XIM_STATUS_ATTR) { if(!(res->mode & XIM_MODE_STS_MASK)) { return XIM_CHECK_INVALID; } if(res->mode & XIM_MODE_STS_ONCE) { res->mode &= ~XIM_MODE_STS_ONCE; } else if(!(res->mode & XIM_MODE_STS_SET)) { return XIM_CHECK_ERROR; } } else { if(!res->mode) { return XIM_CHECK_INVALID; } if(res->mode & XIM_MODE_IC_ONCE) { res->mode &= ~XIM_MODE_IC_ONCE; } else if(!(res->mode & XIM_MODE_IC_SET)) { return XIM_CHECK_ERROR; } } return XIM_CHECK_VALID; } static int _XimCheckGetICValuesMode( XIMResourceList res, unsigned long mode) { if(mode & XIM_PREEDIT_ATTR) { if(!(res->mode & XIM_MODE_PRE_MASK)) { return XIM_CHECK_INVALID; } if(!(res->mode & XIM_MODE_PRE_GET)) { return XIM_CHECK_ERROR; } } else if(mode & XIM_STATUS_ATTR) { if(!(res->mode & XIM_MODE_STS_MASK)) { return XIM_CHECK_INVALID; } if(!(res->mode & XIM_MODE_STS_GET)) { return XIM_CHECK_ERROR; } } else { if(!res->mode) { return XIM_CHECK_INVALID; } if(!(res->mode & XIM_MODE_IC_GET)) { return XIM_CHECK_ERROR; } } return XIM_CHECK_VALID; } int _XimCheckICMode( XIMResourceList res, unsigned long mode) { if(mode &XIM_SETICDEFAULTS) { return _XimCheckSetICDefaultsMode(res, mode); } else if (mode & XIM_CREATEIC) { return _XimCheckCreateICMode(res, mode); } else if (mode & XIM_SETICVALUES) { return _XimCheckSetICValuesMode(res, mode); } else if (mode & XIM_GETICVALUES) { return _XimCheckGetICValuesMode(res, mode); } else { return XIM_CHECK_ERROR; } } Bool _XimSetLocalIMDefaults( Xim im, XPointer top, XIMResourceList res_list, unsigned int list_num) { XimValueOffsetInfo info; unsigned int num; register int i; XIMResourceList res; int check; info = im_attr_info; num = XIMNumber(im_attr_info); for(i = 0; i < num; i++) { if((res = _XimGetResourceListRecByQuark( res_list, list_num, info[i].quark)) == (XIMResourceList)NULL) { return False; } check = _XimCheckIMMode(res, XIM_SETIMDEFAULTS); if(check == XIM_CHECK_INVALID) { continue; } else if (check == XIM_CHECK_ERROR) { return False; } if(!info[i].defaults) { continue; } if(!(info[i].defaults(&info[i], top, (XPointer)NULL, 0))) { return False; } } return True; } Bool _XimSetICDefaults( Xic ic, XPointer top, unsigned long mode, XIMResourceList res_list, unsigned int list_num) { unsigned int num; XimValueOffsetInfo info; register int i; XIMResourceList res; int check; XrmQuark pre_quark; XrmQuark sts_quark; pre_quark = XrmStringToQuark(XNPreeditAttributes); sts_quark = XrmStringToQuark(XNStatusAttributes); if(mode & XIM_PREEDIT_ATTR) { info = ic_pre_attr_info; num = XIMNumber(ic_pre_attr_info); } else if(mode & XIM_STATUS_ATTR) { info = ic_sts_attr_info; num = XIMNumber(ic_sts_attr_info); } else { info = ic_attr_info; num = XIMNumber(ic_attr_info); } for(i = 0; i < num; i++) { if(info[i].quark == pre_quark) { if(!_XimSetICDefaults(ic, (XPointer)((char *)top + info[i].offset), (mode | XIM_PREEDIT_ATTR), res_list, list_num)) { return False; } } else if (info[i].quark == sts_quark) { if(!_XimSetICDefaults(ic, (XPointer)((char *)top + info[i].offset), (mode | XIM_STATUS_ATTR), res_list, list_num)) { return False; } } else { if(!(res = _XimGetResourceListRecByQuark(res_list, list_num, info[i].quark))) { return False; } check = _XimCheckICMode(res, mode); if (check == XIM_CHECK_INVALID) { continue; } else if (check == XIM_CHECK_ERROR) { return False; } if (!info[i].defaults) { continue; } if (!(info[i].defaults(&info[i], top, (XPointer)ic, mode))) { return False; } } } return True; } static Bool _XimEncodeAttr( XimValueOffsetInfo info, unsigned int num, XIMResourceList res, XPointer top, XPointer val) { register int i; for(i = 0; i < num; i++ ) { if(info[i].quark == res->xrm_name) { if(!info[i].encode) { return False; } return (*info[i].encode)(&info[i], top, val); } } return False; } Bool _XimEncodeLocalIMAttr( XIMResourceList res, XPointer top, XPointer val) { return _XimEncodeAttr(im_attr_info, XIMNumber(im_attr_info), res, top, val); } Bool _XimEncodeLocalICAttr( Xic ic, XIMResourceList res, XPointer top, XIMArg *arg, unsigned long mode) { unsigned int num; XimValueOffsetInfo info; if(mode & XIM_PREEDIT_ATTR) { info = ic_pre_attr_info; num = XIMNumber(ic_pre_attr_info); } else if(mode & XIM_STATUS_ATTR) { info = ic_sts_attr_info; num = XIMNumber(ic_sts_attr_info); } else { info = ic_attr_info; num = XIMNumber(ic_attr_info); } return _XimEncodeAttr(info, num, res, top, arg->value); } static Bool _XimEncodeLocalTopValue( Xic ic, XIMResourceList res, XPointer val, Bool flag) { XIMArg *p = (XIMArg *)val; if (res->xrm_name == XrmStringToQuark(XNClientWindow)) { ic->core.client_window = (Window)p->value; if (ic->core.focus_window == (Window)0) ic->core.focus_window = ic->core.client_window; if (flag) { _XRegisterFilterByType(ic->core.im->core.display, ic->core.focus_window, KeyPress, KeyRelease, _XimLocalFilter, (XPointer)ic); } } else if (res->xrm_name == XrmStringToQuark(XNFocusWindow)) { if (ic->core.client_window) { if (flag) { _XUnregisterFilter(ic->core.im->core.display, ic->core.focus_window, _XimLocalFilter, (XPointer)ic); } ic->core.focus_window = (Window)p->value; if (flag) { _XRegisterFilterByType(ic->core.im->core.display, ic->core.focus_window, KeyPress, KeyRelease, _XimLocalFilter, (XPointer)ic); } } else ic->core.focus_window = (Window)p->value; } return True; } static Bool _XimEncodeLocalPreeditValue( Xic ic, XIMResourceList res, XPointer val) { XIMArg *p = (XIMArg *)val; if (res->xrm_name == XrmStringToQuark(XNStdColormap)) { XStandardColormap *colormap_ret; int count; if (!(XGetRGBColormaps(ic->core.im->core.display, ic->core.focus_window, &colormap_ret, &count, (Atom)p->value))) return False; Xfree(colormap_ret); } return True; } static Bool _XimEncodeLocalStatusValue( Xic ic, XIMResourceList res, XPointer val) { XIMArg *p = (XIMArg *)val; if (res->xrm_name == XrmStringToQuark(XNStdColormap)) { XStandardColormap *colormap_ret; int count; if (!(XGetRGBColormaps(ic->core.im->core.display, ic->core.focus_window, &colormap_ret, &count, (Atom)p->value))) return False; Xfree(colormap_ret); } return True; } char * _XimSetICValueData( Xic ic, XPointer top, XIMResourceList res_list, unsigned int list_num, XIMArg *values, unsigned long mode, Bool flag) { register XIMArg *p; XIMResourceList res; char *name; int check; XrmQuark pre_quark; XrmQuark sts_quark; pre_quark = XrmStringToQuark(XNPreeditAttributes); sts_quark = XrmStringToQuark(XNStatusAttributes); for(p = values; p->name != NULL; p++) { if((res = _XimGetResourceListRec(res_list, list_num, p->name)) == (XIMResourceList)NULL) { return p->name; } if(res->xrm_name == pre_quark) { if(((name = _XimSetICValueData(ic, (XPointer)(&((XimDefICValues *)top)->preedit_attr), res_list, list_num, (XIMArg *)p->value, (mode | XIM_PREEDIT_ATTR), flag)))) { return name; } } else if(res->xrm_name == sts_quark) { if(((name = _XimSetICValueData(ic, (XPointer)(&((XimDefICValues *)top)->status_attr), res_list, list_num, (XIMArg *)p->value, (mode | XIM_STATUS_ATTR), flag)))) { return name; } } else { check = _XimCheckICMode(res, mode); if(check == XIM_CHECK_INVALID) { continue; } else if(check == XIM_CHECK_ERROR) { return p->name; } if(mode & XIM_PREEDIT_ATTR) { if (!_XimEncodeLocalPreeditValue(ic, res, (XPointer)p)) return p->name; } else if(mode & XIM_STATUS_ATTR) { if (!_XimEncodeLocalStatusValue(ic, res, (XPointer)p)) return p->name; } else { if (!_XimEncodeLocalTopValue(ic, res, (XPointer)p, flag)) return p->name; } if(_XimEncodeLocalICAttr(ic, res, top, p, mode) == False) { return p->name; } } } return NULL; } static Bool _XimCheckInputStyle( XIMStyles *styles, XIMStyle style) { int num = styles->count_styles; register int i; for(i = 0; i < num; i++) { if(styles->supported_styles[i] == style) { return True; } } return False; } Bool _XimCheckLocalInputStyle( Xic ic, XPointer top, XIMArg *values, XIMStyles *styles, XIMResourceList res_list, unsigned int list_num) { XrmQuark quark = XrmStringToQuark(XNInputStyle); register XIMArg *p; XIMResourceList res; for(p = values; p && p->name != NULL; p++) { if(quark == XrmStringToQuark(p->name)) { if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) { return False; } if(!_XimEncodeLocalICAttr(ic, res, top, p, 0)) { return False; } if (_XimCheckInputStyle(styles, ((XimDefICValues *)top)->input_style)) { return True; } return False; } } return False; } static Bool _XimDecodeAttr( XimValueOffsetInfo info, unsigned int num, XIMResourceList res, XPointer top, XPointer val) { register int i; for(i = 0; i < num; i++ ) { if(info[i].quark == res->xrm_name) { if(!info[i].decode) { return False; } return (*info[i].decode)(&info[i], top, val); } } return False; } Bool _XimDecodeLocalIMAttr( XIMResourceList res, XPointer top, XPointer val) { return _XimDecodeAttr(im_attr_info, XIMNumber(im_attr_info), res, top, val); } Bool _XimDecodeLocalICAttr( XIMResourceList res, XPointer top, XPointer val, unsigned long mode) { unsigned int num; XimValueOffsetInfo info; if(mode & XIM_PREEDIT_ATTR) { info = ic_pre_attr_info; num = XIMNumber(ic_pre_attr_info); } else if(mode & XIM_STATUS_ATTR) { info = ic_sts_attr_info; num = XIMNumber(ic_sts_attr_info); } else { info = ic_attr_info; num = XIMNumber(ic_attr_info); } return _XimDecodeAttr(info, num, res, top, val); } char * _XimGetICValueData(Xic ic, XPointer top, XIMResourceList res_list, unsigned int list_num, XIMArg *values, unsigned long mode) { register XIMArg *p; XIMResourceList res; char *name; int check; XrmQuark pre_quark; XrmQuark sts_quark; pre_quark = XrmStringToQuark(XNPreeditAttributes); sts_quark = XrmStringToQuark(XNStatusAttributes); for(p = values; p->name != NULL; p++) { if((res = _XimGetResourceListRec(res_list, list_num, p->name)) == (XIMResourceList)NULL) { return p->name; } if(res->xrm_name == pre_quark) { if((name = _XimGetICValueData(ic, (XPointer)(&((XimDefICValues *)top)->preedit_attr), res_list, list_num, (XIMArg *)p->value, (mode | XIM_PREEDIT_ATTR)))) { return name; } } else if(res->xrm_name == sts_quark) { if((name = _XimGetICValueData(ic, (XPointer)(&((XimDefICValues *)top)->status_attr), res_list, list_num, (XIMArg *)p->value, (mode | XIM_STATUS_ATTR)))) { return name; } } else { check = _XimCheckICMode(res, mode); if(check == XIM_CHECK_INVALID) { continue; } else if(check == XIM_CHECK_ERROR) { return p->name; } if(_XimDecodeLocalICAttr(res, top, p->value, mode) == False) { return p->name; } } } return NULL; } void _XimGetCurrentIMValues(Xim im, XimDefIMValues *im_values) { bzero((char *)im_values, sizeof(XimDefIMValues)); im_values->styles = im->core.styles; im_values->im_values_list = im->core.im_values_list; im_values->ic_values_list = im->core.ic_values_list; im_values->destroy_callback = im->core.destroy_callback; im_values->res_name = im->core.res_name; im_values->res_class = im->core.res_class; im_values->visible_position = im->core.visible_position; } void _XimSetCurrentIMValues(Xim im, XimDefIMValues *im_values) { im->core.styles = im_values->styles; im->core.im_values_list = im_values->im_values_list; im->core.ic_values_list = im_values->ic_values_list; im->core.destroy_callback = im_values->destroy_callback; im->core.res_name = im_values->res_name; im->core.res_class = im_values->res_class; im->core.visible_position = im_values->visible_position; } void _XimGetCurrentICValues(Xic ic, XimDefICValues *ic_values) { bzero((char *)ic_values, sizeof(XimDefICValues)); ic_values->input_style = ic->core.input_style; ic_values->client_window = ic->core.client_window; ic_values->focus_window = ic->core.focus_window; ic_values->filter_events = ic->core.filter_events; ic_values->geometry_callback = ic->core.geometry_callback; ic_values->res_name = ic->core.res_name; ic_values->res_class = ic->core.res_class; ic_values->destroy_callback = ic->core.destroy_callback; ic_values->string_conversion_callback = ic->core.string_conversion_callback; ic_values->string_conversion = ic->core.string_conversion; ic_values->reset_state = ic->core.reset_state; ic_values->hotkey = ic->core.hotkey; ic_values->hotkey_state = ic->core.hotkey_state; ic_values->preedit_attr = ic->core.preedit_attr; ic_values->status_attr = ic->core.status_attr; } void _XimSetCurrentICValues( Xic ic, XimDefICValues *ic_values) { ic->core.input_style = ic_values->input_style; ic->core.client_window = ic_values->client_window; if (ic_values->focus_window) ic->core.focus_window = ic_values->focus_window; ic->core.filter_events = ic_values->filter_events; ic->core.geometry_callback = ic_values->geometry_callback; ic->core.res_name = ic_values->res_name; ic->core.res_class = ic_values->res_class; ic->core.destroy_callback = ic_values->destroy_callback; ic->core.string_conversion_callback = ic_values->string_conversion_callback; ic->core.string_conversion = ic_values->string_conversion; ic->core.reset_state = ic_values->reset_state; ic->core.hotkey = ic_values->hotkey; ic->core.hotkey_state = ic_values->hotkey_state; ic->core.preedit_attr = ic_values->preedit_attr; ic->core.status_attr = ic_values->status_attr; } static void _XimInitialIMOffsetInfo(void) { unsigned int n = XIMNumber(im_attr_info); register int i; for(i = 0; i < n; i++) { im_attr_info[i].quark = XrmStringToQuark(GET_NAME(im_attr_info[i])); } } static void _XimInitialICOffsetInfo(void) { unsigned int n; register int i; n = XIMNumber(ic_attr_info); for(i = 0; i < n; i++) { ic_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_attr_info[i])); } n = XIMNumber(ic_pre_attr_info); for(i = 0; i < n; i++) { ic_pre_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_pre_attr_info[i])); } n = XIMNumber(ic_sts_attr_info); for(i = 0; i < n; i++) { ic_sts_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_sts_attr_info[i])); } } static void _XimInitialIMMode(void) { unsigned int n = XIMNumber(im_mode); register int i; for(i = 0; i < n; i++) { im_mode_quark[i] = XrmStringToQuark(GET_NAME(im_mode[i])); } } static void _XimInitialICMode(void) { unsigned int n = XIMNumber(ic_mode); register int i; for(i = 0; i < n; i++) { ic_mode_quark[i] = XrmStringToQuark(GET_NAME(ic_mode[i])); } } void _XimInitialResourceInfo(void) { static Bool init_flag = False; if(init_flag == True) { return; } _XimInitialIMOffsetInfo(); _XimInitialICOffsetInfo(); _XimInitialIMMode(); _XimInitialICMode(); init_flag = True; }