xenocara/lib/libX11/modules/im/ximcp/imRm.c
2013-09-28 17:03:13 +00:00

3213 lines
78 KiB
C

/******************************************************************
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 <config.h>
#endif
#include <stdio.h>
#include <X11/Xlib.h>
#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;
}