diff -u R6.1/xc/lib/X11/IMWrap.c.dist R6.1/xc/lib/X11/IMWrap.c --- R6.1/xc/lib/X11/IMWrap.c.dist Sat Nov 2 17:14:33 1996 +++ R6.1/xc/lib/X11/IMWrap.c Sun Nov 10 20:21:11 1996 @@ -127,10 +127,13 @@ char *res_class; { XLCd lcd = _XOpenLC( (char *)NULL ); + XIM im; if( !lcd ) return( (XIM)NULL ); - return (*lcd->methods->open_im) (lcd, display, rdb, res_name, res_class); + if ((im = (*lcd->methods->open_im) (lcd, display, rdb, res_name, res_class)) != NULL) + display->dk_info->client_i18n = 1; + return im; } /* diff -u R6.1/xc/lib/X11/KeyBind.c.dist R6.1/xc/lib/X11/KeyBind.c --- R6.1/xc/lib/X11/KeyBind.c.dist Fri Feb 2 14:10:00 1996 +++ R6.1/xc/lib/X11/KeyBind.c Sun Nov 10 12:39:09 1996 @@ -41,10 +41,11 @@ #define XK_XKB_KEYS #include #include - -#ifdef USE_OWN_COMPOSE -#include "imComp.h" -#endif +/* Quinot */ +#include "Ximint.h" +#include "XlcPublic.h" +#include "Xlcint.h" +/* /Quinot */ #ifdef XKB #define XKeycodeToKeysym _XKeycodeToKeysym @@ -519,7 +520,10 @@ buffer[0] = c; return 1; } - + +#define KEY_CODE_PROCESSED 0x1000 +#define KEY_CODE_COMPOSED 0x2000 + /*ARGSUSED*/ int XLookupString (event, buffer, nbytes, keysym, status) @@ -531,82 +535,113 @@ { unsigned int modifiers; KeySym symbol; + /* Quinot */ + Display *dpy = event->display; + DefTree *p; + XLCd lcd = _XlcCurrentLC(); + + if (!keysym) + keysym = &symbol; + + if (!dpy->dk_info->client_i18n) { + if (event->keycode & KEY_CODE_PROCESSED) { + *keysym = NoSymbol; + return 0; + } + if ((event->keycode & KEY_CODE_COMPOSED) && ((p = dpy->dk_info->composed) != NULL)) { + int len; + *keysym = p->ks; + if ( p->mb!='\0' ) { + len = strlen(p->mb); + if (len > nbytes - 1) len = nbytes - 1; + memcpy(buffer,p->mb,len); + buffer[len]= '\0'; + } else { + len = _XTranslateKeySym(dpy,*keysym,event->state, + buffer,nbytes, + NULL); + } + return len; + } + } + /* /Quinot */ if (! _XTranslateKey(event->display, event->keycode, event->state, - &modifiers, &symbol)) + &modifiers, keysym)) return 0; -#ifdef USE_OWN_COMPOSE - if ( status ) { - static int been_here= 0; - if ( !been_here ) { - XimCompInitTables(); - been_here = 1; - } - if ( !XimCompLegalStatus(status) ) { - status->compose_ptr = NULL; - status->chars_matched = 0; - } - if ( ((status->chars_matched>0)&&(status->compose_ptr!=NULL)) || - XimCompIsComposeKey(symbol,event->keycode,status) ) { - XimCompRtrn rtrn; - switch (XimCompProcessSym(status,symbol,&rtrn)) { - case XIM_COMP_IGNORE: - break; - case XIM_COMP_IN_PROGRESS: - if ( keysym!=NULL ) - *keysym = NoSymbol; - return 0; - case XIM_COMP_FAIL: - { - int n = 0, len= 0; - for (n=len=0;rtrn.sym[n]!=XK_VoidSymbol;n++) { - if ( nbytes-len > 0 ) { - len+= _XTranslateKeySym(event->display,rtrn.sym[n], - event->state, - buffer+len,nbytes-len); - } - } - if ( keysym!=NULL ) { - if ( n==1 ) *keysym = rtrn.sym[0]; - else *keysym = NoSymbol; - } - return len; - } - case XIM_COMP_SUCCEED: - { - int len,n = 0; - - symbol = rtrn.matchSym; - if ( keysym!=NULL ) *keysym = symbol; - if ( rtrn.str[0]!='\0' ) { - strncpy(buffer,rtrn.str,nbytes-1); - buffer[nbytes-1]= '\0'; - len = strlen(buffer); - } - else { - len = _XTranslateKeySym(event->display,symbol, - event->state, - buffer,nbytes); - } - for (n=0;rtrn.sym[n]!=XK_VoidSymbol;n++) { - if ( nbytes-len > 0 ) { - len+= _XTranslateKeySym(event->display,rtrn.sym[n], - event->state, - buffer+len,nbytes-len); - } - } - return len; - } - } - } + /* Quinot */ + /* Now we have are ready for return, and we are going to do some + post-processing to collapse several keysyms into a composed + string. */ + + if (!(dpy->dk_info->client_i18n || dpy->dk_info->top)) { + FILE *fp; + char *name; + + name = _XlcFileName(lcd, COMPOSE_FILE); + if (name == (char *)NULL) + goto dead_keys_failure; + fp = fopen(name, "r"); + if (fp == (FILE *)NULL) + goto dead_keys_failure; + (void)XimParseStringFile(fp, &dpy->dk_info->top); + fclose(fp); + dpy->dk_info->status = dpy->dk_info->top; + goto dead_keys_ok; + dead_keys_failure: + dpy->dk_info->client_i18n = 1; + dead_keys_ok: + if (name) + Xfree (name); + } + if ((dpy->dk_info->top == NULL) || (event->type != KeyPress) || + IsModifierKey(*keysym)) + goto no_compose_fallthrough; + + for(p = dpy->dk_info->status; p; p = p->next) { + if(((event->state & p->modifier_mask) == p->modifier) && + (*keysym == p->keysym)) { + break; + } + } + if(p) { /* Matched */ + if(p->succession) { /* Intermediate */ + dpy->dk_info->status = p->succession; + dpy->dk_info->composed = NULL; + *keysym = NoSymbol; + event->keycode |= KEY_CODE_PROCESSED; + return 0; + } else { /* Terminate (reached to leaf) */ + int len,n = 0; + + /* initialize internal state for next key sequence */ + dpy->dk_info->composed = p; + dpy->dk_info->status = dpy->dk_info->top; + event->keycode |= KEY_CODE_COMPOSED; + return _XLookupString (event, buffer, nbytes, keysym, status); + } + } else { /* Unmatched */ + dpy->dk_info->composed = NULL; + if(dpy->dk_info->status == dpy->dk_info->top) { + /* OK : not matched at top node */ + goto no_compose_fallthrough; + } else { + /* Error (Sequence Unmatch occured) */ + /* initialize internal state for next key sequence */ + dpy->dk_info->status = dpy->dk_info->top; + + /* XXX for now : eat up erroneous keysyms. */ + event->keycode |= KEY_CODE_PROCESSED; + *keysym = NoSymbol; + return 0; + } } -#endif - if (keysym) - *keysym = symbol; +no_compose_fallthrough: + /* /Quinot */ /* arguable whether to use (event->state & ~modifiers) here */ - return _XTranslateKeySym(event->display, symbol, event->state, + return _XTranslateKeySym(event->display, *keysym, event->state, buffer, nbytes); } diff -u R6.1/xc/lib/X11/OpenDis.c.dist R6.1/xc/lib/X11/OpenDis.c --- R6.1/xc/lib/X11/OpenDis.c.dist Sat Nov 2 17:14:34 1996 +++ R6.1/xc/lib/X11/OpenDis.c Sun Nov 10 12:39:46 1996 @@ -30,6 +30,7 @@ #define NEED_REPLIES #define NEED_EVENTS #include "Xlibint.h" +#include "Ximint.h" #include #include #include "bigreqstr.h" @@ -227,6 +228,14 @@ dpy->flushes = NULL; dpy->xcmisc_opcode = 0; dpy->xkb_info = NULL; + if ((dpy->dk_info = (struct _XDead_keys_info *)Xcalloc + (1,sizeof(struct _XDead_keys_info))) == NULL) { + Xfree(dpy); + return(NULL); + } + dpy->dk_info->client_i18n = 0; + dpy->dk_info->top = dpy->dk_info->status = + dpy->dk_info->composed = NULL; /* * Setup other information in this display structure. diff -u R6.1/xc/lib/X11/Xlibint.h.dist R6.1/xc/lib/X11/Xlibint.h --- R6.1/xc/lib/X11/Xlibint.h.dist Sat Nov 2 17:14:45 1996 +++ R6.1/xc/lib/X11/Xlibint.h Mon Nov 11 17:20:44 1996 @@ -67,6 +67,14 @@ XGCValues values; /* shadow structure of values */ }; +struct _DefTree; +struct _XDead_keys_info { + int client_i18n; + struct _DefTree *top, + *status, + *composed; +}; + struct _XDisplay { XExtData *ext_data; /* hook for extension to hang data */ @@ -171,6 +179,7 @@ int xcmisc_opcode; /* major opcode for XC-MISC */ struct _XkbInfoRec *xkb_info; /* XKB info */ struct _XtransConnInfo *trans_conn; /* transport connection object */ + struct _XDead_keys_info *dk_info; }; #define XAllocIDs(dpy,ids,n) (*(dpy)->idlist_alloc)(dpy,ids,n)