ICWrap.c revision 1ab64890
11ab64890Smrg/*
21ab64890Smrg * $Xorg: ICWrap.c,v 1.4 2001/02/09 02:03:33 xorgcvs Exp $
31ab64890Smrg */
41ab64890Smrg
51ab64890Smrg/*
61ab64890Smrg * Copyright 1990, 1991 by OMRON Corporation, NTT Software Corporation,
71ab64890Smrg *                      and Nippon Telegraph and Telephone Corporation
81ab64890Smrg * Copyright 1991 by the Open Software Foundation
91ab64890Smrg * Copyright 1993 by the FUJITSU LIMITED
101ab64890Smrg *
111ab64890Smrg * Permission to use, copy, modify, distribute, and sell this software and its
121ab64890Smrg * documentation for any purpose is hereby granted without fee, provided that
131ab64890Smrg * the above copyright notice appear in all copies and that both that
141ab64890Smrg * copyright notice and this permission notice appear in supporting
151ab64890Smrg * documentation, and that the names of OMRON, NTT Software, NTT, and
161ab64890Smrg * Open Software Foundation not be used in advertising or publicity
171ab64890Smrg * pertaining to distribution of the software without specific,
181ab64890Smrg * written prior permission. OMRON, NTT Software, NTT, and Open Software
191ab64890Smrg * Foundation make no representations about the suitability of this
201ab64890Smrg * software for any purpose.  It is provided "as is" without express or
211ab64890Smrg * implied warranty.
221ab64890Smrg *
231ab64890Smrg * OMRON, NTT SOFTWARE, NTT, AND OPEN SOFTWARE FOUNDATION
241ab64890Smrg * DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
251ab64890Smrg * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
261ab64890Smrg * SHALL OMRON, NTT SOFTWARE, NTT, OR OPEN SOFTWARE FOUNDATION BE
271ab64890Smrg * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
281ab64890Smrg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
291ab64890Smrg * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
301ab64890Smrg * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
311ab64890Smrg *
321ab64890Smrg *	Authors: Li Yuhong		OMRON Corporation
331ab64890Smrg *		 Tatsuya Kato		NTT Software Corporation
341ab64890Smrg *		 Hiroshi Kuribayashi	OMRON Coproration
351ab64890Smrg *		 Muneiyoshi Suzuki	Nippon Telegraph and Telephone Co.
361ab64890Smrg *
371ab64890Smrg *		 M. Collins		OSF
381ab64890Smrg *		 Takashi Fujiwara	FUJITSU LIMITED
391ab64890Smrg */
401ab64890Smrg/*
411ab64890Smrg
421ab64890SmrgCopyright 1991, 1998  The Open Group
431ab64890Smrg
441ab64890SmrgPermission to use, copy, modify, distribute, and sell this software and its
451ab64890Smrgdocumentation for any purpose is hereby granted without fee, provided that
461ab64890Smrgthe above copyright notice appear in all copies and that both that
471ab64890Smrgcopyright notice and this permission notice appear in supporting
481ab64890Smrgdocumentation.
491ab64890Smrg
501ab64890SmrgThe above copyright notice and this permission notice shall be included
511ab64890Smrgin all copies or substantial portions of the Software.
521ab64890Smrg
531ab64890SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
541ab64890SmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
551ab64890SmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
561ab64890SmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
571ab64890SmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
581ab64890SmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
591ab64890SmrgOTHER DEALINGS IN THE SOFTWARE.
601ab64890Smrg
611ab64890SmrgExcept as contained in this notice, the name of The Open Group shall
621ab64890Smrgnot be used in advertising or otherwise to promote the sale, use or
631ab64890Smrgother dealings in this Software without prior written authorization
641ab64890Smrgfrom The Open Group.
651ab64890Smrg
661ab64890Smrg*/
671ab64890Smrg/* $XFree86: xc/lib/X11/ICWrap.c,v 1.10 2003/04/25 14:12:38 tsi Exp $ */
681ab64890Smrg
691ab64890Smrg#define NEED_EVENTS
701ab64890Smrg#ifdef HAVE_CONFIG_H
711ab64890Smrg#include <config.h>
721ab64890Smrg#endif
731ab64890Smrg#include "Xlibint.h"
741ab64890Smrg#include "Xlcint.h"
751ab64890Smrg
761ab64890Smrgstatic int
771ab64890Smrg_XIMNestedListToNestedList(
781ab64890Smrg    XIMArg *nlist,   /* This is the new list */
791ab64890Smrg    XIMArg *list)    /* The original list */
801ab64890Smrg{
811ab64890Smrg    register XIMArg *ptr = list;
821ab64890Smrg
831ab64890Smrg    while (ptr->name) {
841ab64890Smrg	if (!strcmp(ptr->name, XNVaNestedList)) {
851ab64890Smrg	    nlist += _XIMNestedListToNestedList(nlist, (XIMArg *)ptr->value);
861ab64890Smrg	} else {
871ab64890Smrg	    nlist->name = ptr->name;
881ab64890Smrg	    nlist->value = ptr->value;
891ab64890Smrg	    ptr++;
901ab64890Smrg	    nlist++;
911ab64890Smrg	}
921ab64890Smrg    }
931ab64890Smrg    return ptr - list;
941ab64890Smrg}
951ab64890Smrg
961ab64890Smrgstatic void
971ab64890Smrg_XIMCountNestedList(
981ab64890Smrg    XIMArg *args,
991ab64890Smrg    int *total_count)
1001ab64890Smrg{
1011ab64890Smrg    for (; args->name; args++) {
1021ab64890Smrg	if (!strcmp(args->name, XNVaNestedList))
1031ab64890Smrg	    _XIMCountNestedList((XIMArg *)args->value, total_count);
1041ab64890Smrg	else
1051ab64890Smrg	    ++(*total_count);
1061ab64890Smrg    }
1071ab64890Smrg}
1081ab64890Smrg
1091ab64890Smrgstatic void
1101ab64890Smrg_XIMCountVaList(va_list var, int *total_count)
1111ab64890Smrg{
1121ab64890Smrg    char *attr;
1131ab64890Smrg
1141ab64890Smrg    *total_count = 0;
1151ab64890Smrg
1161ab64890Smrg    for (attr = va_arg(var, char*); attr; attr = va_arg(var, char*)) {
1171ab64890Smrg	if (!strcmp(attr, XNVaNestedList)) {
1181ab64890Smrg	    _XIMCountNestedList(va_arg(var, XIMArg*), total_count);
1191ab64890Smrg	} else {
1201ab64890Smrg	    (void)va_arg(var, XIMArg*);
1211ab64890Smrg	    ++(*total_count);
1221ab64890Smrg	}
1231ab64890Smrg    }
1241ab64890Smrg}
1251ab64890Smrg
1261ab64890Smrgstatic void
1271ab64890Smrg_XIMVaToNestedList(va_list var, int max_count, XIMArg **args_return)
1281ab64890Smrg{
1291ab64890Smrg    XIMArg *args;
1301ab64890Smrg    char   *attr;
1311ab64890Smrg
1321ab64890Smrg    if (max_count <= 0) {
1331ab64890Smrg	*args_return = (XIMArg *)NULL;
1341ab64890Smrg	return;
1351ab64890Smrg    }
1361ab64890Smrg
1371ab64890Smrg    args = (XIMArg *)Xmalloc((unsigned)(max_count + 1) * sizeof(XIMArg));
1381ab64890Smrg    *args_return = args;
1391ab64890Smrg    if (!args) return;
1401ab64890Smrg
1411ab64890Smrg    for (attr = va_arg(var, char*); attr; attr = va_arg(var, char*)) {
1421ab64890Smrg	if (!strcmp(attr, XNVaNestedList)) {
1431ab64890Smrg	    args += _XIMNestedListToNestedList(args, va_arg(var, XIMArg*));
1441ab64890Smrg	} else {
1451ab64890Smrg	    args->name = attr;
1461ab64890Smrg	    args->value = va_arg(var, XPointer);
1471ab64890Smrg	    args++;
1481ab64890Smrg	}
1491ab64890Smrg    }
1501ab64890Smrg    args->name = (char*)NULL;
1511ab64890Smrg}
1521ab64890Smrg
1531ab64890Smrg/*ARGSUSED*/
1541ab64890SmrgXVaNestedList
1551ab64890SmrgXVaCreateNestedList(int dummy, ...)
1561ab64890Smrg{
1571ab64890Smrg    va_list		var;
1581ab64890Smrg    XIMArg		*args = NULL;
1591ab64890Smrg    int			total_count;
1601ab64890Smrg
1611ab64890Smrg    va_start(var, dummy);
1621ab64890Smrg    _XIMCountVaList(var, &total_count);
1631ab64890Smrg    va_end(var);
1641ab64890Smrg
1651ab64890Smrg    va_start(var, dummy);
1661ab64890Smrg    _XIMVaToNestedList(var, total_count, &args);
1671ab64890Smrg    va_end(var);
1681ab64890Smrg
1691ab64890Smrg    return (XVaNestedList)args;
1701ab64890Smrg}
1711ab64890Smrg
1721ab64890Smrgchar *
1731ab64890SmrgXSetIMValues(XIM im, ...)
1741ab64890Smrg{
1751ab64890Smrg    va_list var;
1761ab64890Smrg    int     total_count;
1771ab64890Smrg    XIMArg *args;
1781ab64890Smrg    char   *ret;
1791ab64890Smrg
1801ab64890Smrg    /*
1811ab64890Smrg     * so count the stuff dangling here
1821ab64890Smrg     */
1831ab64890Smrg    va_start(var, im);
1841ab64890Smrg    _XIMCountVaList(var, &total_count);
1851ab64890Smrg    va_end(var);
1861ab64890Smrg
1871ab64890Smrg    /*
1881ab64890Smrg     * now package it up so we can send it along
1891ab64890Smrg     */
1901ab64890Smrg    va_start(var, im);
1911ab64890Smrg    _XIMVaToNestedList(var, total_count, &args);
1921ab64890Smrg    va_end(var);
1931ab64890Smrg
1941ab64890Smrg    ret = (*im->methods->set_values) (im, args);
1951ab64890Smrg    if (args) Xfree((char *)args);
1961ab64890Smrg    return ret;
1971ab64890Smrg}
1981ab64890Smrg
1991ab64890Smrgchar *
2001ab64890SmrgXGetIMValues(XIM im, ...)
2011ab64890Smrg{
2021ab64890Smrg    va_list var;
2031ab64890Smrg    int     total_count;
2041ab64890Smrg    XIMArg *args;
2051ab64890Smrg    char   *ret;
2061ab64890Smrg
2071ab64890Smrg    /*
2081ab64890Smrg     * so count the stuff dangling here
2091ab64890Smrg     */
2101ab64890Smrg    va_start(var, im);
2111ab64890Smrg    _XIMCountVaList(var, &total_count);
2121ab64890Smrg    va_end(var);
2131ab64890Smrg
2141ab64890Smrg    /*
2151ab64890Smrg     * now package it up so we can send it along
2161ab64890Smrg     */
2171ab64890Smrg    va_start(var, im);
2181ab64890Smrg    _XIMVaToNestedList(var, total_count, &args);
2191ab64890Smrg    va_end(var);
2201ab64890Smrg
2211ab64890Smrg    ret = (*im->methods->get_values) (im, args);
2221ab64890Smrg    if (args) Xfree((char *)args);
2231ab64890Smrg    return ret;
2241ab64890Smrg}
2251ab64890Smrg
2261ab64890Smrg/*
2271ab64890Smrg * Create an input context within the input method,
2281ab64890Smrg * and return a pointer to the input context.
2291ab64890Smrg */
2301ab64890Smrg
2311ab64890SmrgXIC
2321ab64890SmrgXCreateIC(XIM im, ...)
2331ab64890Smrg{
2341ab64890Smrg    va_list var;
2351ab64890Smrg    int     total_count;
2361ab64890Smrg    XIMArg *args;
2371ab64890Smrg    XIC     ic;
2381ab64890Smrg
2391ab64890Smrg    /*
2401ab64890Smrg     * so count the stuff dangling here
2411ab64890Smrg     */
2421ab64890Smrg    va_start(var, im);
2431ab64890Smrg    _XIMCountVaList(var, &total_count);
2441ab64890Smrg    va_end(var);
2451ab64890Smrg
2461ab64890Smrg    /*
2471ab64890Smrg     * now package it up so we can send it along
2481ab64890Smrg     */
2491ab64890Smrg    va_start(var, im);
2501ab64890Smrg    _XIMVaToNestedList(var, total_count, &args);
2511ab64890Smrg    va_end(var);
2521ab64890Smrg
2531ab64890Smrg    ic = (XIC) (*im->methods->create_ic) (im, args);
2541ab64890Smrg    if (args) Xfree((char *)args);
2551ab64890Smrg    if (ic) {
2561ab64890Smrg	ic->core.next = im->core.ic_chain;
2571ab64890Smrg	im->core.ic_chain = ic;
2581ab64890Smrg    }
2591ab64890Smrg    return ic;
2601ab64890Smrg}
2611ab64890Smrg
2621ab64890Smrg/*
2631ab64890Smrg * Free the input context.
2641ab64890Smrg */
2651ab64890Smrgvoid
2661ab64890SmrgXDestroyIC(ic)
2671ab64890Smrg    XIC ic;
2681ab64890Smrg{
2691ab64890Smrg    XIM im = ic->core.im;
2701ab64890Smrg    XIC *prev;
2711ab64890Smrg
2721ab64890Smrg    (*ic->methods->destroy) (ic);
2731ab64890Smrg    if (im) {
2741ab64890Smrg	for (prev = &im->core.ic_chain; *prev; prev = &(*prev)->core.next) {
2751ab64890Smrg	    if (*prev == ic) {
2761ab64890Smrg		*prev = ic->core.next;
2771ab64890Smrg		break;
2781ab64890Smrg	    }
2791ab64890Smrg	}
2801ab64890Smrg    }
2811ab64890Smrg    Xfree ((char *) ic);
2821ab64890Smrg}
2831ab64890Smrg
2841ab64890Smrgchar *
2851ab64890SmrgXGetICValues(XIC ic, ...)
2861ab64890Smrg{
2871ab64890Smrg    va_list var;
2881ab64890Smrg    int     total_count;
2891ab64890Smrg    XIMArg *args;
2901ab64890Smrg    char   *ret;
2911ab64890Smrg
2921ab64890Smrg    if (!ic->core.im)
2931ab64890Smrg	return (char *) NULL;
2941ab64890Smrg
2951ab64890Smrg    /*
2961ab64890Smrg     * so count the stuff dangling here
2971ab64890Smrg     */
2981ab64890Smrg    va_start(var, ic);
2991ab64890Smrg    _XIMCountVaList(var, &total_count);
3001ab64890Smrg    va_end(var);
3011ab64890Smrg
3021ab64890Smrg    /*
3031ab64890Smrg     * now package it up so we can send it along
3041ab64890Smrg     */
3051ab64890Smrg    va_start(var, ic);
3061ab64890Smrg    _XIMVaToNestedList(var, total_count, &args);
3071ab64890Smrg    va_end(var);
3081ab64890Smrg
3091ab64890Smrg    ret = (*ic->methods->get_values) (ic, args);
3101ab64890Smrg    if (args) Xfree((char *)args);
3111ab64890Smrg    return ret;
3121ab64890Smrg}
3131ab64890Smrg
3141ab64890Smrgchar *
3151ab64890SmrgXSetICValues(XIC ic, ...)
3161ab64890Smrg{
3171ab64890Smrg    va_list var;
3181ab64890Smrg    int     total_count;
3191ab64890Smrg    XIMArg *args;
3201ab64890Smrg    char   *ret;
3211ab64890Smrg
3221ab64890Smrg    if (!ic->core.im)
3231ab64890Smrg	return (char *) NULL;
3241ab64890Smrg
3251ab64890Smrg    /*
3261ab64890Smrg     * so count the stuff dangling here
3271ab64890Smrg     */
3281ab64890Smrg    va_start(var, ic);
3291ab64890Smrg    _XIMCountVaList(var, &total_count);
3301ab64890Smrg    va_end(var);
3311ab64890Smrg
3321ab64890Smrg    /*
3331ab64890Smrg     * now package it up so we can send it along
3341ab64890Smrg     */
3351ab64890Smrg    va_start(var, ic);
3361ab64890Smrg    _XIMVaToNestedList(var, total_count, &args);
3371ab64890Smrg    va_end(var);
3381ab64890Smrg
3391ab64890Smrg    ret = (*ic->methods->set_values) (ic, args);
3401ab64890Smrg    if (args) Xfree((char *)args);
3411ab64890Smrg    return ret;
3421ab64890Smrg}
3431ab64890Smrg
3441ab64890Smrg/*
3451ab64890Smrg * Require the input manager to focus the focus window attached to the ic
3461ab64890Smrg * argument.
3471ab64890Smrg */
3481ab64890Smrgvoid
3491ab64890SmrgXSetICFocus(ic)
3501ab64890Smrg    XIC ic;
3511ab64890Smrg{
3521ab64890Smrg  if (ic && ic->core.im)
3531ab64890Smrg      (*ic->methods->set_focus) (ic);
3541ab64890Smrg}
3551ab64890Smrg
3561ab64890Smrg/*
3571ab64890Smrg * Require the input manager to unfocus the focus window attached to the ic
3581ab64890Smrg * argument.
3591ab64890Smrg */
3601ab64890Smrgvoid
3611ab64890SmrgXUnsetICFocus(ic)
3621ab64890Smrg    XIC ic;
3631ab64890Smrg{
3641ab64890Smrg  if (ic->core.im)
3651ab64890Smrg      (*ic->methods->unset_focus) (ic);
3661ab64890Smrg}
3671ab64890Smrg
3681ab64890Smrg/*
3691ab64890Smrg * Return the XIM associated with the input context.
3701ab64890Smrg */
3711ab64890SmrgXIM
3721ab64890SmrgXIMOfIC(ic)
3731ab64890Smrg    XIC ic;
3741ab64890Smrg{
3751ab64890Smrg    return ic->core.im;
3761ab64890Smrg}
3771ab64890Smrg
3781ab64890Smrgchar *
3791ab64890SmrgXmbResetIC(ic)
3801ab64890Smrg    XIC ic;
3811ab64890Smrg{
3821ab64890Smrg    if (ic->core.im)
3831ab64890Smrg	return (*ic->methods->mb_reset)(ic);
3841ab64890Smrg    return (char *)NULL;
3851ab64890Smrg}
3861ab64890Smrg
3871ab64890Smrgwchar_t *
3881ab64890SmrgXwcResetIC(ic)
3891ab64890Smrg    XIC ic;
3901ab64890Smrg{
3911ab64890Smrg    if (ic->core.im)
3921ab64890Smrg	return (*ic->methods->wc_reset)(ic);
3931ab64890Smrg    return (wchar_t *)NULL;
3941ab64890Smrg}
3951ab64890Smrg
3961ab64890Smrgchar *
3971ab64890SmrgXutf8ResetIC(ic)
3981ab64890Smrg    XIC ic;
3991ab64890Smrg{
4001ab64890Smrg    if (ic->core.im) {
4011ab64890Smrg	if (ic->methods->utf8_reset)
4021ab64890Smrg	    return (*ic->methods->utf8_reset)(ic);
4031ab64890Smrg	else if (ic->methods->mb_reset)
4041ab64890Smrg	    return (*ic->methods->mb_reset)(ic);
4051ab64890Smrg    }
4061ab64890Smrg    return (char *)NULL;
4071ab64890Smrg}
4081ab64890Smrg
4091ab64890Smrgint
4101ab64890SmrgXmbLookupString(ic, ev, buffer, nbytes, keysym, status)
4111ab64890Smrg    XIC ic;
4121ab64890Smrg    register XKeyEvent *ev;
4131ab64890Smrg    char *buffer;
4141ab64890Smrg    int nbytes;
4151ab64890Smrg    KeySym *keysym;
4161ab64890Smrg    Status *status;
4171ab64890Smrg{
4181ab64890Smrg    if (ic->core.im)
4191ab64890Smrg	return (*ic->methods->mb_lookup_string) (ic, ev, buffer, nbytes,
4201ab64890Smrg						 keysym, status);
4211ab64890Smrg    return XLookupNone;
4221ab64890Smrg}
4231ab64890Smrg
4241ab64890Smrgint
4251ab64890SmrgXwcLookupString(ic, ev, buffer, nchars, keysym, status)
4261ab64890Smrg    XIC ic;
4271ab64890Smrg    register XKeyEvent *ev;
4281ab64890Smrg    wchar_t *buffer;
4291ab64890Smrg    int nchars;
4301ab64890Smrg    KeySym *keysym;
4311ab64890Smrg    Status *status;
4321ab64890Smrg{
4331ab64890Smrg    if (ic->core.im)
4341ab64890Smrg	return (*ic->methods->wc_lookup_string) (ic, ev, buffer, nchars,
4351ab64890Smrg						 keysym, status);
4361ab64890Smrg    return XLookupNone;
4371ab64890Smrg}
4381ab64890Smrg
4391ab64890Smrgint
4401ab64890SmrgXutf8LookupString(ic, ev, buffer, nbytes, keysym, status)
4411ab64890Smrg    XIC ic;
4421ab64890Smrg    register XKeyEvent *ev;
4431ab64890Smrg    char *buffer;
4441ab64890Smrg    int nbytes;
4451ab64890Smrg    KeySym *keysym;
4461ab64890Smrg    Status *status;
4471ab64890Smrg{
4481ab64890Smrg    if (ic->core.im) {
4491ab64890Smrg	if (ic->methods->utf8_lookup_string)
4501ab64890Smrg	    return (*ic->methods->utf8_lookup_string) (ic, ev, buffer, nbytes,
4511ab64890Smrg						   	keysym, status);
4521ab64890Smrg	else if (ic->methods->mb_lookup_string)
4531ab64890Smrg	    return (*ic->methods->mb_lookup_string) (ic, ev, buffer, nbytes,
4541ab64890Smrg						   	keysym, status);
4551ab64890Smrg    }
4561ab64890Smrg    return XLookupNone;
4571ab64890Smrg}
458