ICWrap.c revision 61b2299d
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
1661b2299dSmrg * Open Software Foundation not be used in advertising or publicity
1761b2299dSmrg * 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 *
2361b2299dSmrg * OMRON, NTT SOFTWARE, NTT, AND OPEN SOFTWARE FOUNDATION
2461b2299dSmrg * DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
2561b2299dSmrg * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
261ab64890Smrg * SHALL OMRON, NTT SOFTWARE, NTT, OR OPEN SOFTWARE FOUNDATION BE
2761b2299dSmrg * 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.
3161b2299dSmrg *
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.
3661b2299dSmrg *
3761b2299dSmrg *		 M. Collins		OSF
381ab64890Smrg *		 Takashi Fujiwara	FUJITSU LIMITED
3961b2299dSmrg */
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/*
22761b2299dSmrg * 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;
23861b2299dSmrg
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
26661b2299dSmrgXDestroyIC(XIC ic)
2671ab64890Smrg{
2681ab64890Smrg    XIM im = ic->core.im;
2691ab64890Smrg    XIC *prev;
2701ab64890Smrg
2711ab64890Smrg    (*ic->methods->destroy) (ic);
2721ab64890Smrg    if (im) {
2731ab64890Smrg	for (prev = &im->core.ic_chain; *prev; prev = &(*prev)->core.next) {
2741ab64890Smrg	    if (*prev == ic) {
2751ab64890Smrg		*prev = ic->core.next;
2761ab64890Smrg		break;
2771ab64890Smrg	    }
2781ab64890Smrg	}
2791ab64890Smrg    }
2801ab64890Smrg    Xfree ((char *) ic);
2811ab64890Smrg}
2821ab64890Smrg
2831ab64890Smrgchar *
2841ab64890SmrgXGetICValues(XIC ic, ...)
28561b2299dSmrg{
2861ab64890Smrg    va_list var;
2871ab64890Smrg    int     total_count;
2881ab64890Smrg    XIMArg *args;
2891ab64890Smrg    char   *ret;
2901ab64890Smrg
2911ab64890Smrg    if (!ic->core.im)
2921ab64890Smrg	return (char *) NULL;
2931ab64890Smrg
2941ab64890Smrg    /*
2951ab64890Smrg     * so count the stuff dangling here
2961ab64890Smrg     */
2971ab64890Smrg    va_start(var, ic);
2981ab64890Smrg    _XIMCountVaList(var, &total_count);
2991ab64890Smrg    va_end(var);
3001ab64890Smrg
3011ab64890Smrg    /*
3021ab64890Smrg     * now package it up so we can send it along
3031ab64890Smrg     */
3041ab64890Smrg    va_start(var, ic);
3051ab64890Smrg    _XIMVaToNestedList(var, total_count, &args);
3061ab64890Smrg    va_end(var);
3071ab64890Smrg
3081ab64890Smrg    ret = (*ic->methods->get_values) (ic, args);
3091ab64890Smrg    if (args) Xfree((char *)args);
3101ab64890Smrg    return ret;
3111ab64890Smrg}
3121ab64890Smrg
3131ab64890Smrgchar *
3141ab64890SmrgXSetICValues(XIC ic, ...)
3151ab64890Smrg{
3161ab64890Smrg    va_list var;
3171ab64890Smrg    int     total_count;
3181ab64890Smrg    XIMArg *args;
3191ab64890Smrg    char   *ret;
3201ab64890Smrg
3211ab64890Smrg    if (!ic->core.im)
3221ab64890Smrg	return (char *) NULL;
3231ab64890Smrg
3241ab64890Smrg    /*
3251ab64890Smrg     * so count the stuff dangling here
3261ab64890Smrg     */
3271ab64890Smrg    va_start(var, ic);
3281ab64890Smrg    _XIMCountVaList(var, &total_count);
3291ab64890Smrg    va_end(var);
3301ab64890Smrg
3311ab64890Smrg    /*
3321ab64890Smrg     * now package it up so we can send it along
3331ab64890Smrg     */
3341ab64890Smrg    va_start(var, ic);
3351ab64890Smrg    _XIMVaToNestedList(var, total_count, &args);
3361ab64890Smrg    va_end(var);
3371ab64890Smrg
3381ab64890Smrg    ret = (*ic->methods->set_values) (ic, args);
3391ab64890Smrg    if (args) Xfree((char *)args);
3401ab64890Smrg    return ret;
3411ab64890Smrg}
3421ab64890Smrg
3431ab64890Smrg/*
3441ab64890Smrg * Require the input manager to focus the focus window attached to the ic
3451ab64890Smrg * argument.
3461ab64890Smrg */
3471ab64890Smrgvoid
34861b2299dSmrgXSetICFocus(XIC ic)
3491ab64890Smrg{
3501ab64890Smrg  if (ic && ic->core.im)
3511ab64890Smrg      (*ic->methods->set_focus) (ic);
3521ab64890Smrg}
3531ab64890Smrg
3541ab64890Smrg/*
3551ab64890Smrg * Require the input manager to unfocus the focus window attached to the ic
3561ab64890Smrg * argument.
3571ab64890Smrg */
3581ab64890Smrgvoid
35961b2299dSmrgXUnsetICFocus(XIC ic)
3601ab64890Smrg{
3611ab64890Smrg  if (ic->core.im)
3621ab64890Smrg      (*ic->methods->unset_focus) (ic);
3631ab64890Smrg}
3641ab64890Smrg
3651ab64890Smrg/*
3661ab64890Smrg * Return the XIM associated with the input context.
3671ab64890Smrg */
3681ab64890SmrgXIM
36961b2299dSmrgXIMOfIC(XIC ic)
3701ab64890Smrg{
3711ab64890Smrg    return ic->core.im;
3721ab64890Smrg}
3731ab64890Smrg
3741ab64890Smrgchar *
37561b2299dSmrgXmbResetIC(XIC ic)
3761ab64890Smrg{
3771ab64890Smrg    if (ic->core.im)
3781ab64890Smrg	return (*ic->methods->mb_reset)(ic);
3791ab64890Smrg    return (char *)NULL;
3801ab64890Smrg}
3811ab64890Smrg
3821ab64890Smrgwchar_t *
38361b2299dSmrgXwcResetIC(XIC ic)
3841ab64890Smrg{
3851ab64890Smrg    if (ic->core.im)
3861ab64890Smrg	return (*ic->methods->wc_reset)(ic);
3871ab64890Smrg    return (wchar_t *)NULL;
3881ab64890Smrg}
3891ab64890Smrg
3901ab64890Smrgchar *
39161b2299dSmrgXutf8ResetIC(XIC ic)
3921ab64890Smrg{
3931ab64890Smrg    if (ic->core.im) {
3941ab64890Smrg	if (ic->methods->utf8_reset)
3951ab64890Smrg	    return (*ic->methods->utf8_reset)(ic);
3961ab64890Smrg	else if (ic->methods->mb_reset)
3971ab64890Smrg	    return (*ic->methods->mb_reset)(ic);
3981ab64890Smrg    }
3991ab64890Smrg    return (char *)NULL;
4001ab64890Smrg}
4011ab64890Smrg
4021ab64890Smrgint
40361b2299dSmrgXmbLookupString(XIC ic, XKeyEvent *ev, char *buffer, int nbytes,
40461b2299dSmrg		KeySym *keysym, Status *status)
4051ab64890Smrg{
4061ab64890Smrg    if (ic->core.im)
4071ab64890Smrg	return (*ic->methods->mb_lookup_string) (ic, ev, buffer, nbytes,
4081ab64890Smrg						 keysym, status);
4091ab64890Smrg    return XLookupNone;
4101ab64890Smrg}
4111ab64890Smrg
4121ab64890Smrgint
41361b2299dSmrgXwcLookupString(XIC ic, XKeyEvent *ev, wchar_t *buffer, int nchars,
41461b2299dSmrg		KeySym *keysym, Status *status)
4151ab64890Smrg{
4161ab64890Smrg    if (ic->core.im)
4171ab64890Smrg	return (*ic->methods->wc_lookup_string) (ic, ev, buffer, nchars,
4181ab64890Smrg						 keysym, status);
4191ab64890Smrg    return XLookupNone;
4201ab64890Smrg}
4211ab64890Smrg
4221ab64890Smrgint
42361b2299dSmrgXutf8LookupString(XIC ic, XKeyEvent *ev, char *buffer, int nbytes,
42461b2299dSmrg		  KeySym *keysym, Status *status)
4251ab64890Smrg{
4261ab64890Smrg    if (ic->core.im) {
4271ab64890Smrg	if (ic->methods->utf8_lookup_string)
4281ab64890Smrg	    return (*ic->methods->utf8_lookup_string) (ic, ev, buffer, nbytes,
4291ab64890Smrg						   	keysym, status);
4301ab64890Smrg	else if (ic->methods->mb_lookup_string)
4311ab64890Smrg	    return (*ic->methods->mb_lookup_string) (ic, ev, buffer, nbytes,
4321ab64890Smrg						   	keysym, status);
4331ab64890Smrg    }
4341ab64890Smrg    return XLookupNone;
4351ab64890Smrg}
436