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