#define NEED_EVENTS
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "Xlibint.h"
#include "Xlcint.h"
static int
_XIMNestedListToNestedList(
XIMArg *nlist,
XIMArg *list)
{
register XIMArg *ptr = list;
while (ptr->name) {
if (!strcmp(ptr->name, XNVaNestedList)) {
nlist += _XIMNestedListToNestedList(nlist, (XIMArg *)ptr->value);
} else {
nlist->name = ptr->name;
nlist->value = ptr->value;
ptr++;
nlist++;
}
}
return ptr - list;
}
static void
_XIMCountNestedList(
XIMArg *args,
int *total_count)
{
for (; args->name; args++) {
if (!strcmp(args->name, XNVaNestedList))
_XIMCountNestedList((XIMArg *)args->value, total_count);
else
++(*total_count);
}
}
static void
_XIMCountVaList(va_list var, int *total_count)
{
char *attr;
*total_count = 0;
for (attr = va_arg(var, char*); attr; attr = va_arg(var, char*)) {
if (!strcmp(attr, XNVaNestedList)) {
_XIMCountNestedList(va_arg(var, XIMArg*), total_count);
} else {
(void)va_arg(var, XIMArg*);
++(*total_count);
}
}
}
static void
_XIMVaToNestedList(va_list var, int max_count, XIMArg **args_return)
{
XIMArg *args;
char *attr;
if (max_count <= 0) {
*args_return = (XIMArg *)NULL;
return;
}
args = (XIMArg *)Xmalloc((unsigned)(max_count + 1) * sizeof(XIMArg));
*args_return = args;
if (!args) return;
for (attr = va_arg(var, char*); attr; attr = va_arg(var, char*)) {
if (!strcmp(attr, XNVaNestedList)) {
args += _XIMNestedListToNestedList(args, va_arg(var, XIMArg*));
} else {
args->name = attr;
args->value = va_arg(var, XPointer);
args++;
}
}
args->name = (char*)NULL;
}
XVaNestedList
XVaCreateNestedList(int dummy, ...)
{
va_list var;
XIMArg *args = NULL;
int total_count;
va_start(var, dummy);
_XIMCountVaList(var, &total_count);
va_end(var);
va_start(var, dummy);
_XIMVaToNestedList(var, total_count, &args);
va_end(var);
return (XVaNestedList)args;
}
char *
XSetIMValues(XIM im, ...)
{
va_list var;
int total_count;
XIMArg *args;
char *ret;
va_start(var, im);
_XIMCountVaList(var, &total_count);
va_end(var);
va_start(var, im);
_XIMVaToNestedList(var, total_count, &args);
va_end(var);
ret = (*im->methods->set_values) (im, args);
if (args) Xfree((char *)args);
return ret;
}
char *
XGetIMValues(XIM im, ...)
{
va_list var;
int total_count;
XIMArg *args;
char *ret;
va_start(var, im);
_XIMCountVaList(var, &total_count);
va_end(var);
va_start(var, im);
_XIMVaToNestedList(var, total_count, &args);
va_end(var);
ret = (*im->methods->get_values) (im, args);
if (args) Xfree((char *)args);
return ret;
}
XIC
XCreateIC(XIM im, ...)
{
va_list var;
int total_count;
XIMArg *args;
XIC ic;
va_start(var, im);
_XIMCountVaList(var, &total_count);
va_end(var);
va_start(var, im);
_XIMVaToNestedList(var, total_count, &args);
va_end(var);
ic = (XIC) (*im->methods->create_ic) (im, args);
if (args) Xfree((char *)args);
if (ic) {
ic->core.next = im->core.ic_chain;
im->core.ic_chain = ic;
}
return ic;
}
void
XDestroyIC(ic)
XIC ic;
{
XIM im = ic->core.im;
XIC *prev;
(*ic->methods->destroy) (ic);
if (im) {
for (prev = &im->core.ic_chain; *prev; prev = &(*prev)->core.next) {
if (*prev == ic) {
*prev = ic->core.next;
break;
}
}
}
Xfree ((char *) ic);
}
char *
XGetICValues(XIC ic, ...)
{
va_list var;
int total_count;
XIMArg *args;
char *ret;
if (!ic->core.im)
return (char *) NULL;
va_start(var, ic);
_XIMCountVaList(var, &total_count);
va_end(var);
va_start(var, ic);
_XIMVaToNestedList(var, total_count, &args);
va_end(var);
ret = (*ic->methods->get_values) (ic, args);
if (args) Xfree((char *)args);
return ret;
}
char *
XSetICValues(XIC ic, ...)
{
va_list var;
int total_count;
XIMArg *args;
char *ret;
if (!ic->core.im)
return (char *) NULL;
va_start(var, ic);
_XIMCountVaList(var, &total_count);
va_end(var);
va_start(var, ic);
_XIMVaToNestedList(var, total_count, &args);
va_end(var);
ret = (*ic->methods->set_values) (ic, args);
if (args) Xfree((char *)args);
return ret;
}
void
XSetICFocus(ic)
XIC ic;
{
if (ic && ic->core.im)
(*ic->methods->set_focus) (ic);
}
void
XUnsetICFocus(ic)
XIC ic;
{
if (ic->core.im)
(*ic->methods->unset_focus) (ic);
}
XIM
XIMOfIC(ic)
XIC ic;
{
return ic->core.im;
}
char *
XmbResetIC(ic)
XIC ic;
{
if (ic->core.im)
return (*ic->methods->mb_reset)(ic);
return (char *)NULL;
}
wchar_t *
XwcResetIC(ic)
XIC ic;
{
if (ic->core.im)
return (*ic->methods->wc_reset)(ic);
return (wchar_t *)NULL;
}
char *
Xutf8ResetIC(ic)
XIC ic;
{
if (ic->core.im) {
if (ic->methods->utf8_reset)
return (*ic->methods->utf8_reset)(ic);
else if (ic->methods->mb_reset)
return (*ic->methods->mb_reset)(ic);
}
return (char *)NULL;
}
int
XmbLookupString(ic, ev, buffer, nbytes, keysym, status)
XIC ic;
register XKeyEvent *ev;
char *buffer;
int nbytes;
KeySym *keysym;
Status *status;
{
if (ic->core.im)
return (*ic->methods->mb_lookup_string) (ic, ev, buffer, nbytes,
keysym, status);
return XLookupNone;
}
int
XwcLookupString(ic, ev, buffer, nchars, keysym, status)
XIC ic;
register XKeyEvent *ev;
wchar_t *buffer;
int nchars;
KeySym *keysym;
Status *status;
{
if (ic->core.im)
return (*ic->methods->wc_lookup_string) (ic, ev, buffer, nchars,
keysym, status);
return XLookupNone;
}
int
Xutf8LookupString(ic, ev, buffer, nbytes, keysym, status)
XIC ic;
register XKeyEvent *ev;
char *buffer;
int nbytes;
KeySym *keysym;
Status *status;
{
if (ic->core.im) {
if (ic->methods->utf8_lookup_string)
return (*ic->methods->utf8_lookup_string) (ic, ev, buffer, nbytes,
keysym, status);
else if (ic->methods->mb_lookup_string)
return (*ic->methods->mb_lookup_string) (ic, ev, buffer, nbytes,
keysym, status);
}
return XLookupNone;
}