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