diff options
author | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2017-07-21 12:31:09 +0200 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2017-08-25 10:06:49 +0200 |
commit | c350873c7c977efe5210484f04160be45f84ba7e (patch) | |
tree | 717d33eb315f4def1307d65108d14715696cd5cf /nx-X11/lib/modules/im/ximcp/imInt.c | |
parent | 1472e7e37838f17b7ed948fa206e8c3434a9d346 (diff) | |
download | nx-libs-c350873c7c977efe5210484f04160be45f84ba7e.tar.gz nx-libs-c350873c7c977efe5210484f04160be45f84ba7e.tar.bz2 nx-libs-c350873c7c977efe5210484f04160be45f84ba7e.zip |
Convert nx-X11/lib/ build flow from imake to autotools.
Diffstat (limited to 'nx-X11/lib/modules/im/ximcp/imInt.c')
-rw-r--r-- | nx-X11/lib/modules/im/ximcp/imInt.c | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/nx-X11/lib/modules/im/ximcp/imInt.c b/nx-X11/lib/modules/im/ximcp/imInt.c new file mode 100644 index 000000000..05e04dac8 --- /dev/null +++ b/nx-X11/lib/modules/im/ximcp/imInt.c @@ -0,0 +1,260 @@ +/****************************************************************** + + Copyright 1992, 1993, 1994 by FUJITSU LIMITED + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of FUJITSU LIMITED +not be used in advertising or publicity pertaining to distribution +of the software without specific, written prior permission. +FUJITSU LIMITED makes no representations about the suitability of +this software for any purpose. +It is provided "as is" without express or implied warranty. + +FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF +USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + + Author: Takashi Fujiwara FUJITSU LIMITED + fujiwara@a80.tech.yk.fujitsu.co.jp + +******************************************************************/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <nx-X11/Xatom.h> +#include <nx-X11/Xlib.h> +#include <nx-X11/Xmd.h> +#include "Xlibint.h" +#include "Xlcint.h" +#include "Ximint.h" +#include "XimImSw.h" + +static Xim *_XimCurrentIMlist = (Xim *)NULL; +static int _XimCurrentIMcount = 0; + +static Bool +_XimSetIMStructureList( + Xim im) +{ + register int i; + Xim *xim; + + if(!(_XimCurrentIMlist)) { + if(!(_XimCurrentIMlist = Xmalloc(sizeof(Xim)))) + return False; + _XimCurrentIMlist[0] = im; + _XimCurrentIMcount = 1; + } + else { + for(i = 0; i < _XimCurrentIMcount; i++) { + if(!( _XimCurrentIMlist[i])) { + _XimCurrentIMlist[i] = im; + break; + } + } + if(i >= _XimCurrentIMcount) { + if(!(xim = Xrealloc(_XimCurrentIMlist, + ((i + 1) * sizeof(Xim))))) + return False; + _XimCurrentIMlist = xim; + _XimCurrentIMlist[_XimCurrentIMcount] = im; + _XimCurrentIMcount++; + } + } + return True; +} + +void +_XimDestroyIMStructureList(Xim im) +{ + register int i; + + for(i = 0; i < _XimCurrentIMcount; i++) { + if(_XimCurrentIMlist[i] == im) { + _XimCurrentIMlist[i] = NULL; + break; + } + } + return; +} + +void +_XimServerDestroy(Xim im_2_destroy) +{ + register int i; + Xim im; + XIC ic; + + for(i = 0; i < _XimCurrentIMcount; i++) { + if(!(im = _XimCurrentIMlist[i])) + continue; + /* + * Only continue if this im is the one to be destroyed. + */ + if (im != im_2_destroy) + continue; + + if (im->core.destroy_callback.callback) + (*im->core.destroy_callback.callback)((XIM)im, + im->core.destroy_callback.client_data, NULL); + for (ic = im->core.ic_chain; ic; ic = ic->core.next) { + if (ic->core.destroy_callback.callback) { + (*ic->core.destroy_callback.callback)(ic, + ic->core.destroy_callback.client_data, NULL); + } + } + _XimResetIMInstantiateCallback( im ); + (void)im->methods->close((XIM)im); + Xfree(im); + _XimCurrentIMlist[i] = NULL; + return; + } +} + +#ifdef XIM_CONNECTABLE +void +_XimServerReconectableDestroy(void) +{ + register int i; + Xim im; + XIC ic; + + for(i = 0; i < _XimCurrentIMcount; i++) { + if(!(im = _XimCurrentIMlist[i])) + continue; + + if (im->core.destroy_callback.callback) + (*im->core.destroy_callback.callback)(im, + im->core.destroy_callback.client_data, NULL); + for (ic = im->core.ic_chain; ic; ic = ic->core.next) { + if (ic->core.destroy_callback.callback) { + (*ic->core.destroy_callback.callback)(ic, + ic->core.destroy_callback.client_data, NULL); + } + } + _XimResetIMInstantiateCallback( im ); + (void)im->methods->close((XIM)im); + } + return; +} +#endif /* XIM_CONNECTABLE */ + +static const char * +_XimStrstr( + register const char *src, + register const char *dest) +{ + int len; + + len = strlen(dest); + while((src = strchr(src, *dest))) { + if(!strncmp(src, dest, len)) + return src; + src++; + } + return NULL; +} + +static char * +_XimMakeImName( + XLCd lcd) +{ + const char* begin = NULL; + const char* end = NULL; + char* ret = NULL; + const char* ximmodifier = XIMMODIFIER; + + if(lcd->core->modifiers != NULL && *lcd->core->modifiers != '\0') { + begin = _XimStrstr(lcd->core->modifiers, ximmodifier); + if (begin != NULL) { + end = begin += strlen(ximmodifier); + while (*end && *end != '@') + end++; + } + } + ret = Xmalloc(end - begin + 1); + if (ret != NULL) { + if (begin != NULL && end != NULL) { + (void)strncpy(ret, begin, end - begin); + ret[end - begin] = '\0'; + } else { + ret[0] = '\0'; + } + } + + return ret; +} + +XIM +_XimOpenIM( + XLCd lcd, + Display *dpy, + XrmDatabase rdb, + char *res_name, + char *res_class) +{ + Xim im; + register int i; + + if (!(im = Xcalloc(1, sizeof(XimRec)))) + return (XIM)NULL; + + im->core.lcd = lcd; + im->core.ic_chain = (XIC)NULL; + im->core.display = dpy; + im->core.rdb = rdb; + im->core.res_name = NULL; + im->core.res_class = NULL; + if((res_name != NULL) && (*res_name != '\0')){ + if(!(im->core.res_name = strdup(res_name))) + goto Error1; + } + if((res_class != NULL) && (*res_class != '\0')){ + if(!(im->core.res_class = strdup(res_class))) + goto Error2; + } + if(!(im->core.im_name = _XimMakeImName(lcd))) + goto Error3; + + for(i= 0; ; i++) { + if(_XimImSportRec[i].checkprocessing(im)) { + if(!(_XimImSportRec[i].im_open(im))) + goto Error4; + if(!_XimSetIMStructureList(im)) + goto Error4; + return (XIM)im; + } + } + +Error4 : + _XimImSportRec[i].im_free(im); + Xfree(im); + return NULL; +Error3 : + Xfree(im->core.im_name); +Error2: + Xfree(im->core.res_class); +Error1: + Xfree(im->core.res_name); + Xfree(im); + return NULL; +} + +Bool +_XInitIM(XLCd lcd) +{ + if(lcd == (XLCd)NULL) + return False; + lcd->methods->open_im = _XimOpenIM; + lcd->methods->register_callback = _XimRegisterIMInstantiateCallback; + lcd->methods->unregister_callback = _XimUnRegisterIMInstantiateCallback; + return True; +} |