Revert xkb changes that broke XkbGetKeyboard()
This commit is contained in:
		
							parent
							
								
									79016d4036
								
							
						
					
					
						commit
						654619d76c
					
				| 
						 | 
					@ -30,8 +30,10 @@ DIX_SRCS = \
 | 
				
			||||||
XKBFILE_SRCS = \
 | 
					XKBFILE_SRCS = \
 | 
				
			||||||
        maprules.c \
 | 
					        maprules.c \
 | 
				
			||||||
        xkmread.c \
 | 
					        xkmread.c \
 | 
				
			||||||
 | 
					        xkbtext.c \
 | 
				
			||||||
        xkbfmisc.c \
 | 
					        xkbfmisc.c \
 | 
				
			||||||
        xkberrs.c
 | 
					        xkberrs.c \
 | 
				
			||||||
 | 
					        xkbout.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
X11_SRCS = \
 | 
					X11_SRCS = \
 | 
				
			||||||
        XKBMisc.c \
 | 
					        XKBMisc.c \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										429
									
								
								xkb/xkbfmisc.c
								
								
								
								
							
							
						
						
									
										429
									
								
								xkb/xkbfmisc.c
								
								
								
								
							| 
						 | 
					@ -48,16 +48,185 @@
 | 
				
			||||||
#include <X11/extensions/XKBgeom.h>
 | 
					#include <X11/extensions/XKBgeom.h>
 | 
				
			||||||
#include "xkb.h"
 | 
					#include "xkb.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned
 | 
				
			||||||
 | 
					_XkbKSCheckCase(KeySym ks)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					unsigned	set,rtrn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    set= (ks & (~0xff)) >> 8;
 | 
				
			||||||
 | 
					    rtrn= 0;
 | 
				
			||||||
 | 
					    switch (set) {
 | 
				
			||||||
 | 
						case 0:		/* latin 1 */
 | 
				
			||||||
 | 
						    if (((ks>=XK_A)&&(ks<=XK_Z))||
 | 
				
			||||||
 | 
							((ks>=XK_Agrave)&&(ks<=XK_THORN)&&(ks!=XK_multiply))) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSUpper;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    if (((ks>=XK_a)&&(ks<=XK_z))||
 | 
				
			||||||
 | 
							((ks>=XK_agrave)&&(ks<=XK_ydiaeresis))) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSLower;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
						case 1:		/* latin 2 */
 | 
				
			||||||
 | 
						    if (((ks>=XK_Aogonek)&&(ks<=XK_Zabovedot)&&(ks!=XK_breve))||
 | 
				
			||||||
 | 
							((ks>=XK_Racute)&&(ks<=XK_Tcedilla))) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSUpper;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    if (((ks>=XK_aogonek)&&(ks<=XK_zabovedot)&&(ks!=XK_caron))||
 | 
				
			||||||
 | 
							((ks>=XK_racute)&&(ks<=XK_tcedilla))) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSLower;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
						case 2:		/* latin 3 */
 | 
				
			||||||
 | 
						    if (((ks>=XK_Hstroke)&&(ks<=XK_Jcircumflex))||
 | 
				
			||||||
 | 
							((ks>=XK_Cabovedot)&&(ks<=XK_Scircumflex))) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSUpper;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    if (((ks>=XK_hstroke)&&(ks<=XK_jcircumflex))||
 | 
				
			||||||
 | 
							((ks>=XK_cabovedot)&&(ks<=XK_scircumflex))) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSLower;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
						case 3:		/* latin 4 */
 | 
				
			||||||
 | 
						    if (((ks>=XK_Rcedilla)&&(ks<=XK_Tslash))||
 | 
				
			||||||
 | 
						        (ks==XK_ENG)||
 | 
				
			||||||
 | 
							((ks>=XK_Amacron)&&(ks<=XK_Umacron))) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSUpper;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    if (((ks>=XK_rcedilla)&&(ks<=XK_tslash))||
 | 
				
			||||||
 | 
						        (ks==XK_eng)||
 | 
				
			||||||
 | 
							((ks>=XK_amacron)&&(ks<=XK_umacron))) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSLower;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
						case 18:		/* latin 8 */
 | 
				
			||||||
 | 
						    if ((ks==XK_Babovedot)||
 | 
				
			||||||
 | 
					                ((ks>=XK_Dabovedot)&&(ks<=XK_Wacute))||
 | 
				
			||||||
 | 
							((ks>=XK_Ygrave)&&(ks<=XK_Fabovedot))||
 | 
				
			||||||
 | 
						        (ks==XK_Mabovedot)||
 | 
				
			||||||
 | 
						        (ks==XK_Pabovedot)||
 | 
				
			||||||
 | 
						        (ks==XK_Sabovedot)||
 | 
				
			||||||
 | 
						        (ks==XK_Wdiaeresis)||
 | 
				
			||||||
 | 
							((ks>=XK_Wcircumflex)&&(ks<=XK_Ycircumflex))) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSUpper;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    if ((ks==XK_babovedot)||
 | 
				
			||||||
 | 
						        (ks==XK_dabovedot)||
 | 
				
			||||||
 | 
						        (ks==XK_fabovedot)||
 | 
				
			||||||
 | 
						        (ks==XK_mabovedot)||
 | 
				
			||||||
 | 
					                ((ks>=XK_wgrave)&&(ks<=XK_wacute))||
 | 
				
			||||||
 | 
						        (ks==XK_ygrave)||
 | 
				
			||||||
 | 
							((ks>=XK_wdiaeresis)&&(ks<=XK_ycircumflex))) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSLower;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
						case 19:		/* latin 9 */
 | 
				
			||||||
 | 
						    if ((ks==XK_OE)||(ks==XK_Ydiaeresis)) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSUpper;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    if (ks==XK_oe) {
 | 
				
			||||||
 | 
							rtrn|= _XkbKSLower;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return rtrn;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***===================================================================***/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bool
 | 
				
			||||||
 | 
					XkbLookupGroupAndLevel(	XkbDescPtr 	xkb,
 | 
				
			||||||
 | 
								int 		key,
 | 
				
			||||||
 | 
								int *		mods_inout,
 | 
				
			||||||
 | 
								int *		grp_inout,
 | 
				
			||||||
 | 
								int *		lvl_rtrn)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					int		nG,eG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((!xkb)||(!XkbKeycodeInRange(xkb,key))||(!grp_inout))
 | 
				
			||||||
 | 
						return False;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    nG= XkbKeyNumGroups(xkb,key);
 | 
				
			||||||
 | 
					    eG= *grp_inout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ( nG==0 ) {
 | 
				
			||||||
 | 
						*grp_inout= 0;
 | 
				
			||||||
 | 
						if (lvl_rtrn!=NULL)
 | 
				
			||||||
 | 
						    *lvl_rtrn= 0;
 | 
				
			||||||
 | 
						return False;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if ( nG==1 ) {
 | 
				
			||||||
 | 
						eG= 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if ( eG>=nG ) {
 | 
				
			||||||
 | 
						unsigned gI= XkbKeyGroupInfo(xkb,key);
 | 
				
			||||||
 | 
						switch (XkbOutOfRangeGroupAction(gI)) {
 | 
				
			||||||
 | 
						    default:
 | 
				
			||||||
 | 
							eG %= nG;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						    case XkbClampIntoRange:
 | 
				
			||||||
 | 
							eG = nG-1;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						    case XkbRedirectIntoRange:
 | 
				
			||||||
 | 
							eG = XkbOutOfRangeGroupNumber(gI);
 | 
				
			||||||
 | 
							if (eG>=nG)
 | 
				
			||||||
 | 
							    eG= 0;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    *grp_inout= eG;
 | 
				
			||||||
 | 
					    if (mods_inout!=NULL) {
 | 
				
			||||||
 | 
						XkbKeyTypePtr	type;
 | 
				
			||||||
 | 
						int		preserve;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type = XkbKeyKeyType(xkb,key,eG);
 | 
				
			||||||
 | 
						if (lvl_rtrn!=NULL)
 | 
				
			||||||
 | 
						    *lvl_rtrn= 0;
 | 
				
			||||||
 | 
						preserve= 0;
 | 
				
			||||||
 | 
						if (type->map) { /* find the shift level */
 | 
				
			||||||
 | 
						    register int i;
 | 
				
			||||||
 | 
						    register XkbKTMapEntryPtr entry;
 | 
				
			||||||
 | 
						    for (i=0,entry=type->map;i<type->map_count;i++,entry++) {
 | 
				
			||||||
 | 
							if ((entry->active)&&
 | 
				
			||||||
 | 
								(((*mods_inout)&type->mods.mask)==entry->mods.mask)){
 | 
				
			||||||
 | 
							    if (lvl_rtrn!=NULL)
 | 
				
			||||||
 | 
								*lvl_rtrn= entry->level;
 | 
				
			||||||
 | 
							    if (type->preserve)
 | 
				
			||||||
 | 
								preserve= type->preserve[i].mask;
 | 
				
			||||||
 | 
							    break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						(*mods_inout)&= ~(type->mods.mask&(~preserve));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return True;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***===================================================================***/
 | 
					/***===================================================================***/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool
 | 
					static Bool
 | 
				
			||||||
XkbWriteSectionFromName(FILE *file,char *sectionName,char *name)
 | 
					XkbWriteSectionFromName(FILE *file,char *sectionName,char *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    fprintf(file,"    xkb_%-20s { include \"%s\" };\n",sectionName,name);
 | 
					    fprintf(file,"    xkb_%-20s { include \"%s\" };\n",sectionName,name);
 | 
				
			||||||
    ErrorF("    xkb_%-20s { include \"%s\" };\n",sectionName,name);
 | 
					 | 
				
			||||||
    return True;
 | 
					    return True;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	NEED_DESC(n) ((!n)||((n)[0]=='+')||((n)[0]=='|')||(strchr((n),'%')))
 | 
				
			||||||
 | 
					#define	COMPLETE(n)  ((n)&&(!NEED_DESC(n)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ARGSUSED */
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					_AddIncl(	FILE *		file,
 | 
				
			||||||
 | 
							XkbFileInfo *	result,
 | 
				
			||||||
 | 
							Bool 		topLevel,
 | 
				
			||||||
 | 
							Bool 		showImplicit,
 | 
				
			||||||
 | 
							int 		index,
 | 
				
			||||||
 | 
							void *		priv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if ((priv)&&(strcmp((char *)priv,"%")!=0))
 | 
				
			||||||
 | 
						fprintf(file,"    include \"%s\"\n",(char *)priv);
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bool
 | 
					Bool
 | 
				
			||||||
XkbWriteXKBKeymapForNames(	FILE *			file,
 | 
					XkbWriteXKBKeymapForNames(	FILE *			file,
 | 
				
			||||||
				XkbComponentNamesPtr	names,
 | 
									XkbComponentNamesPtr	names,
 | 
				
			||||||
| 
						 | 
					@ -66,29 +235,229 @@ XkbWriteXKBKeymapForNames(	FILE *			file,
 | 
				
			||||||
				unsigned		want,
 | 
									unsigned		want,
 | 
				
			||||||
				unsigned		need)
 | 
									unsigned		need)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (!names || (!names->keycodes && !names->types && !names->compat &&
 | 
					char *		name,*tmp;
 | 
				
			||||||
                   !names->symbols && !names->geometry))
 | 
					unsigned	complete;
 | 
				
			||||||
 | 
					XkbNamesPtr	old_names;
 | 
				
			||||||
 | 
					int		multi_section;
 | 
				
			||||||
 | 
					unsigned	wantNames,wantConfig,wantDflts;
 | 
				
			||||||
 | 
					XkbFileInfo	finfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bzero(&finfo,sizeof(XkbFileInfo));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    complete= 0;
 | 
				
			||||||
 | 
					    if ((name=names->keymap)==NULL)	name= "default";
 | 
				
			||||||
 | 
					    if (COMPLETE(names->keycodes))	complete|= XkmKeyNamesMask;
 | 
				
			||||||
 | 
					    if (COMPLETE(names->types))		complete|= XkmTypesMask;
 | 
				
			||||||
 | 
					    if (COMPLETE(names->compat))	complete|= XkmCompatMapMask;
 | 
				
			||||||
 | 
					    if (COMPLETE(names->symbols))	complete|= XkmSymbolsMask;
 | 
				
			||||||
 | 
					    if (COMPLETE(names->geometry))	complete|= XkmGeometryMask;
 | 
				
			||||||
 | 
					    want|= (complete|need);
 | 
				
			||||||
 | 
					    if (want&XkmSymbolsMask)
 | 
				
			||||||
 | 
						want|= XkmKeyNamesMask|XkmTypesMask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (want==0)
 | 
				
			||||||
	return False;
 | 
						return False;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fprintf(file, "xkb_keymap \"%s\" {\n", names->keymap ? names->keymap :
 | 
					    if (xkb!=NULL) {
 | 
				
			||||||
                                                           "default");
 | 
						 old_names= xkb->names;
 | 
				
			||||||
 | 
						 finfo.type= 0;
 | 
				
			||||||
 | 
						 finfo.defined= 0;
 | 
				
			||||||
 | 
						 finfo.xkb= xkb;
 | 
				
			||||||
 | 
						 if (!XkbDetermineFileType(&finfo,XkbXKBFile,NULL))
 | 
				
			||||||
 | 
						    return False;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else old_names= NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (names->keycodes)
 | 
					    wantConfig= want&(~complete);
 | 
				
			||||||
	XkbWriteSectionFromName(file, "keycodes", names->keycodes);
 | 
					    if (xkb!=NULL) {
 | 
				
			||||||
    if (names->types)
 | 
						if (wantConfig&XkmTypesMask) {
 | 
				
			||||||
	XkbWriteSectionFromName(file, "types", names->types);
 | 
						    if ((!xkb->map) || (xkb->map->num_types<XkbNumRequiredTypes))
 | 
				
			||||||
    if (names->compat)
 | 
							wantConfig&= ~XkmTypesMask;
 | 
				
			||||||
	XkbWriteSectionFromName(file, "compatibility", names->compat);
 | 
						}
 | 
				
			||||||
    if (names->symbols)
 | 
						if (wantConfig&XkmCompatMapMask) {
 | 
				
			||||||
	XkbWriteSectionFromName(file, "symbols", names->symbols);
 | 
						    if ((!xkb->compat) || (xkb->compat->num_si<1))
 | 
				
			||||||
    if (names->geometry)
 | 
							wantConfig&= ~XkmCompatMapMask;
 | 
				
			||||||
	XkbWriteSectionFromName(file, "geometry", names->geometry);
 | 
						}
 | 
				
			||||||
 | 
						if (wantConfig&XkmSymbolsMask) {
 | 
				
			||||||
 | 
						    if ((!xkb->map) || (!xkb->map->key_sym_map))
 | 
				
			||||||
 | 
							wantConfig&= ~XkmSymbolsMask;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (wantConfig&XkmIndicatorsMask) {
 | 
				
			||||||
 | 
						    if (!xkb->indicators)
 | 
				
			||||||
 | 
							wantConfig&= ~XkmIndicatorsMask;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (wantConfig&XkmKeyNamesMask) {
 | 
				
			||||||
 | 
						    if ((!xkb->names)||(!xkb->names->keys))
 | 
				
			||||||
 | 
							wantConfig&= ~XkmKeyNamesMask;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if ((wantConfig&XkmGeometryMask)&&(!xkb->geom))
 | 
				
			||||||
 | 
						    wantConfig&= ~XkmGeometryMask;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
						wantConfig= 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    complete|= wantConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wantDflts= 0;
 | 
				
			||||||
 | 
					    wantNames= want&(~complete);
 | 
				
			||||||
 | 
					    if ((xkb!=NULL) && (old_names!=NULL)) {
 | 
				
			||||||
 | 
						if (wantNames&XkmTypesMask) {
 | 
				
			||||||
 | 
						    if (old_names->types!=None) {
 | 
				
			||||||
 | 
							tmp= XkbAtomGetString(dpy,old_names->types);
 | 
				
			||||||
 | 
							names->types= _XkbDupString(tmp);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    else {
 | 
				
			||||||
 | 
							wantDflts|= XkmTypesMask;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    complete|= XkmTypesMask; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (wantNames&XkmCompatMapMask) {
 | 
				
			||||||
 | 
						    if (old_names->compat!=None) {
 | 
				
			||||||
 | 
							tmp= XkbAtomGetString(dpy,old_names->compat);
 | 
				
			||||||
 | 
							names->compat= _XkbDupString(tmp);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    else wantDflts|= XkmCompatMapMask;
 | 
				
			||||||
 | 
						    complete|= XkmCompatMapMask; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (wantNames&XkmSymbolsMask) {
 | 
				
			||||||
 | 
						    if (old_names->symbols==None)
 | 
				
			||||||
 | 
							return False;
 | 
				
			||||||
 | 
						    tmp= XkbAtomGetString(dpy,old_names->symbols);
 | 
				
			||||||
 | 
						    names->symbols= _XkbDupString(tmp);
 | 
				
			||||||
 | 
						    complete|= XkmSymbolsMask; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (wantNames&XkmKeyNamesMask) {
 | 
				
			||||||
 | 
						   if (old_names->keycodes!=None) {
 | 
				
			||||||
 | 
							tmp= XkbAtomGetString(dpy,old_names->keycodes);
 | 
				
			||||||
 | 
							names->keycodes= _XkbDupString(tmp);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						    else wantDflts|= XkmKeyNamesMask;
 | 
				
			||||||
 | 
						    complete|= XkmKeyNamesMask;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (wantNames&XkmGeometryMask) {
 | 
				
			||||||
 | 
						    if (old_names->geometry==None)
 | 
				
			||||||
 | 
							return False;
 | 
				
			||||||
 | 
						    tmp= XkbAtomGetString(dpy,old_names->geometry);
 | 
				
			||||||
 | 
						    names->geometry= _XkbDupString(tmp);
 | 
				
			||||||
 | 
						    complete|= XkmGeometryMask; 
 | 
				
			||||||
 | 
						    wantNames&= ~XkmGeometryMask;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (complete&XkmCompatMapMask)
 | 
				
			||||||
 | 
						complete|= XkmIndicatorsMask|XkmVirtualModsMask;
 | 
				
			||||||
 | 
					    else if (complete&(XkmSymbolsMask|XkmTypesMask))
 | 
				
			||||||
 | 
						complete|= XkmVirtualModsMask;
 | 
				
			||||||
 | 
					    if (need & (~complete))
 | 
				
			||||||
 | 
						return False;
 | 
				
			||||||
 | 
					    if ((complete&XkmSymbolsMask)&&((XkmKeyNamesMask|XkmTypesMask)&(~complete)))
 | 
				
			||||||
 | 
						return False;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    multi_section= 1;
 | 
				
			||||||
 | 
					    if (((complete&XkmKeymapRequired)==XkmKeymapRequired)&&
 | 
				
			||||||
 | 
						((complete&(~XkmKeymapLegal))==0)) {
 | 
				
			||||||
 | 
						fprintf(file,"xkb_keymap \"%s\" {\n",name);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (((complete&XkmSemanticsRequired)==XkmSemanticsRequired)&&
 | 
				
			||||||
 | 
						((complete&(~XkmSemanticsLegal))==0)) {
 | 
				
			||||||
 | 
						fprintf(file,"xkb_semantics \"%s\" {\n",name);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (((complete&XkmLayoutRequired)==XkmLayoutRequired)&&
 | 
				
			||||||
 | 
						((complete&(~XkmLayoutLegal))==0)) {
 | 
				
			||||||
 | 
						fprintf(file,"xkb_layout \"%s\" {\n",name);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (XkmSingleSection(complete&(~XkmVirtualModsMask))) {
 | 
				
			||||||
 | 
						multi_section= 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
						return False;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wantNames= complete&(~(wantConfig|wantDflts));
 | 
				
			||||||
 | 
					    name= names->keycodes;
 | 
				
			||||||
 | 
					    if (wantConfig&XkmKeyNamesMask)
 | 
				
			||||||
 | 
						XkbWriteXKBKeycodes(file,&finfo,False,False,_AddIncl,name);
 | 
				
			||||||
 | 
					    else if (wantDflts&XkmKeyNamesMask)
 | 
				
			||||||
 | 
						fprintf(stderr,"Default symbols not implemented yet!\n");
 | 
				
			||||||
 | 
					    else if (wantNames&XkmKeyNamesMask)
 | 
				
			||||||
 | 
						XkbWriteSectionFromName(file,"keycodes",name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    name= names->types;
 | 
				
			||||||
 | 
					    if (wantConfig&XkmTypesMask)
 | 
				
			||||||
 | 
						XkbWriteXKBKeyTypes(file,&finfo,False,False,_AddIncl,name);
 | 
				
			||||||
 | 
					    else if (wantDflts&XkmTypesMask)
 | 
				
			||||||
 | 
						fprintf(stderr,"Default types not implemented yet!\n");
 | 
				
			||||||
 | 
					    else if (wantNames&XkmTypesMask)
 | 
				
			||||||
 | 
						XkbWriteSectionFromName(file,"types",name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    name= names->compat;
 | 
				
			||||||
 | 
					    if (wantConfig&XkmCompatMapMask)
 | 
				
			||||||
 | 
						XkbWriteXKBCompatMap(file,&finfo,False,False,_AddIncl,name);
 | 
				
			||||||
 | 
					    else if (wantDflts&XkmCompatMapMask)
 | 
				
			||||||
 | 
						fprintf(stderr,"Default interps not implemented yet!\n");
 | 
				
			||||||
 | 
					    else if (wantNames&XkmCompatMapMask)
 | 
				
			||||||
 | 
						XkbWriteSectionFromName(file,"compatibility",name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    name= names->symbols;
 | 
				
			||||||
 | 
					    if (wantConfig&XkmSymbolsMask)
 | 
				
			||||||
 | 
						XkbWriteXKBSymbols(file,&finfo,False,False,_AddIncl,name);
 | 
				
			||||||
 | 
					    else if (wantNames&XkmSymbolsMask)
 | 
				
			||||||
 | 
						XkbWriteSectionFromName(file,"symbols",name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    name= names->geometry;
 | 
				
			||||||
 | 
					    if (wantConfig&XkmGeometryMask)
 | 
				
			||||||
 | 
						XkbWriteXKBGeometry(file,&finfo,False,False,_AddIncl,name);
 | 
				
			||||||
 | 
					    else if (wantNames&XkmGeometryMask)
 | 
				
			||||||
 | 
						XkbWriteSectionFromName(file,"geometry",name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (multi_section)
 | 
				
			||||||
	fprintf(file,"};\n");
 | 
						fprintf(file,"};\n");
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return True;
 | 
					    return True;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***====================================================================***/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*ARGSUSED*/
 | 
				
			||||||
 | 
					Status
 | 
				
			||||||
 | 
					XkbMergeFile(XkbDescPtr xkb,XkbFileInfo finfo)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return BadImplementation;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***====================================================================***/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					XkbFindKeycodeByName(XkbDescPtr xkb,char *name,Bool use_aliases)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					register int	i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((!xkb)||(!xkb->names)||(!xkb->names->keys))
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					    for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
 | 
				
			||||||
 | 
						if (strncmp(xkb->names->keys[i].name,name,XkbKeyNameLength)==0)
 | 
				
			||||||
 | 
						    return i;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!use_aliases)
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					    if (xkb->geom && xkb->geom->key_aliases) {
 | 
				
			||||||
 | 
						XkbKeyAliasPtr	a;
 | 
				
			||||||
 | 
						a= xkb->geom->key_aliases;
 | 
				
			||||||
 | 
						for (i=0;i<xkb->geom->num_key_aliases;i++,a++) {
 | 
				
			||||||
 | 
						    if (strncmp(name,a->alias,XkbKeyNameLength)==0)
 | 
				
			||||||
 | 
							return XkbFindKeycodeByName(xkb,a->real,False);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (xkb->names && xkb->names->key_aliases) {
 | 
				
			||||||
 | 
						XkbKeyAliasPtr	a;
 | 
				
			||||||
 | 
						a= xkb->names->key_aliases;
 | 
				
			||||||
 | 
						for (i=0;i<xkb->names->num_key_aliases;i++,a++) {
 | 
				
			||||||
 | 
						    if (strncmp(name,a->alias,XkbKeyNameLength)==0)
 | 
				
			||||||
 | 
							return XkbFindKeycodeByName(xkb,a->real,False);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned
 | 
					unsigned
 | 
				
			||||||
XkbConvertGetByNameComponents(Bool toXkm,unsigned orig)
 | 
					XkbConvertGetByNameComponents(Bool toXkm,unsigned orig)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -115,6 +484,34 @@ unsigned	rtrn;
 | 
				
			||||||
    return rtrn;
 | 
					    return rtrn;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned
 | 
				
			||||||
 | 
					XkbConvertXkbComponents(Bool toXkm,unsigned orig)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					unsigned	rtrn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rtrn= 0;
 | 
				
			||||||
 | 
					    if (toXkm) {
 | 
				
			||||||
 | 
						if (orig&XkbClientMapMask)	rtrn|= XkmTypesMask|XkmSymbolsMask;
 | 
				
			||||||
 | 
						if (orig&XkbServerMapMask)	rtrn|= XkmTypesMask|XkmSymbolsMask;
 | 
				
			||||||
 | 
						if (orig&XkbCompatMapMask)	rtrn|= XkmCompatMapMask;
 | 
				
			||||||
 | 
						if (orig&XkbIndicatorMapMask)	rtrn|= XkmIndicatorsMask;
 | 
				
			||||||
 | 
						if (orig&XkbNamesMask)		rtrn|= XkmKeyNamesMask;
 | 
				
			||||||
 | 
						if (orig&XkbGeometryMask)	rtrn|= XkmGeometryMask;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
						if (orig!=0)			rtrn|= XkbNamesMask;
 | 
				
			||||||
 | 
						if (orig&XkmTypesMask)		rtrn|= XkbClientMapMask;
 | 
				
			||||||
 | 
						if (orig&XkmCompatMapMask)
 | 
				
			||||||
 | 
							rtrn|= XkbCompatMapMask|XkbIndicatorMapMask;
 | 
				
			||||||
 | 
						if (orig&XkmSymbolsMask)	rtrn|=XkbClientMapMask|XkbServerMapMask;
 | 
				
			||||||
 | 
						if (orig&XkmIndicatorsMask)	rtrn|= XkbIndicatorMapMask;
 | 
				
			||||||
 | 
						if (orig&XkmKeyNamesMask)	
 | 
				
			||||||
 | 
							rtrn|= XkbNamesMask|XkbIndicatorMapMask;
 | 
				
			||||||
 | 
						if (orig&XkmGeometryMask)	rtrn|= XkbGeometryMask;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return rtrn;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bool
 | 
					Bool
 | 
				
			||||||
XkbDetermineFileType(XkbFileInfoPtr finfo,int format,int *opts_missing)
 | 
					XkbDetermineFileType(XkbFileInfoPtr finfo,int format,int *opts_missing)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -167,89 +167,6 @@ int	count,nRead=0;
 | 
				
			||||||
    return nRead;
 | 
					    return nRead;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned
 | 
					 | 
				
			||||||
_XkbKSCheckCase(KeySym ks)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
unsigned	set,rtrn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    set= (ks & (~0xff)) >> 8;
 | 
					 | 
				
			||||||
    rtrn= 0;
 | 
					 | 
				
			||||||
    switch (set) {
 | 
					 | 
				
			||||||
	case 0:		/* latin 1 */
 | 
					 | 
				
			||||||
	    if (((ks>=XK_A)&&(ks<=XK_Z))||
 | 
					 | 
				
			||||||
		((ks>=XK_Agrave)&&(ks<=XK_THORN)&&(ks!=XK_multiply))) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSUpper;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    if (((ks>=XK_a)&&(ks<=XK_z))||
 | 
					 | 
				
			||||||
		((ks>=XK_agrave)&&(ks<=XK_ydiaeresis))) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSLower;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    break;
 | 
					 | 
				
			||||||
	case 1:		/* latin 2 */
 | 
					 | 
				
			||||||
	    if (((ks>=XK_Aogonek)&&(ks<=XK_Zabovedot)&&(ks!=XK_breve))||
 | 
					 | 
				
			||||||
		((ks>=XK_Racute)&&(ks<=XK_Tcedilla))) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSUpper;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    if (((ks>=XK_aogonek)&&(ks<=XK_zabovedot)&&(ks!=XK_caron))||
 | 
					 | 
				
			||||||
		((ks>=XK_racute)&&(ks<=XK_tcedilla))) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSLower;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    break;
 | 
					 | 
				
			||||||
	case 2:		/* latin 3 */
 | 
					 | 
				
			||||||
	    if (((ks>=XK_Hstroke)&&(ks<=XK_Jcircumflex))||
 | 
					 | 
				
			||||||
		((ks>=XK_Cabovedot)&&(ks<=XK_Scircumflex))) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSUpper;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    if (((ks>=XK_hstroke)&&(ks<=XK_jcircumflex))||
 | 
					 | 
				
			||||||
		((ks>=XK_cabovedot)&&(ks<=XK_scircumflex))) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSLower;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    break;
 | 
					 | 
				
			||||||
	case 3:		/* latin 4 */
 | 
					 | 
				
			||||||
	    if (((ks>=XK_Rcedilla)&&(ks<=XK_Tslash))||
 | 
					 | 
				
			||||||
	        (ks==XK_ENG)||
 | 
					 | 
				
			||||||
		((ks>=XK_Amacron)&&(ks<=XK_Umacron))) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSUpper;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    if (((ks>=XK_rcedilla)&&(ks<=XK_tslash))||
 | 
					 | 
				
			||||||
	        (ks==XK_eng)||
 | 
					 | 
				
			||||||
		((ks>=XK_amacron)&&(ks<=XK_umacron))) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSLower;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    break;
 | 
					 | 
				
			||||||
	case 18:		/* latin 8 */
 | 
					 | 
				
			||||||
	    if ((ks==XK_Babovedot)||
 | 
					 | 
				
			||||||
                ((ks>=XK_Dabovedot)&&(ks<=XK_Wacute))||
 | 
					 | 
				
			||||||
		((ks>=XK_Ygrave)&&(ks<=XK_Fabovedot))||
 | 
					 | 
				
			||||||
	        (ks==XK_Mabovedot)||
 | 
					 | 
				
			||||||
	        (ks==XK_Pabovedot)||
 | 
					 | 
				
			||||||
	        (ks==XK_Sabovedot)||
 | 
					 | 
				
			||||||
	        (ks==XK_Wdiaeresis)||
 | 
					 | 
				
			||||||
		((ks>=XK_Wcircumflex)&&(ks<=XK_Ycircumflex))) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSUpper;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    if ((ks==XK_babovedot)||
 | 
					 | 
				
			||||||
	        (ks==XK_dabovedot)||
 | 
					 | 
				
			||||||
	        (ks==XK_fabovedot)||
 | 
					 | 
				
			||||||
	        (ks==XK_mabovedot)||
 | 
					 | 
				
			||||||
                ((ks>=XK_wgrave)&&(ks<=XK_wacute))||
 | 
					 | 
				
			||||||
	        (ks==XK_ygrave)||
 | 
					 | 
				
			||||||
		((ks>=XK_wdiaeresis)&&(ks<=XK_ycircumflex))) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSLower;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    break;
 | 
					 | 
				
			||||||
	case 19:		/* latin 9 */
 | 
					 | 
				
			||||||
	    if ((ks==XK_OE)||(ks==XK_Ydiaeresis)) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSUpper;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    if (ks==XK_oe) {
 | 
					 | 
				
			||||||
		rtrn|= _XkbKSLower;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return rtrn;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/***====================================================================***/
 | 
					/***====================================================================***/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
| 
						 | 
					@ -1251,10 +1168,14 @@ int			nRead;
 | 
				
			||||||
		*loaded_rtrn|= XkmGeometryMask;
 | 
							*loaded_rtrn|= XkmGeometryMask;
 | 
				
			||||||
	    break;
 | 
						    break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
 | 
						    _XkbLibError(_XkbErrBadImplementation,
 | 
				
			||||||
 | 
						    			XkbConfigText(tmpTOC.type,XkbMessage),0);
 | 
				
			||||||
	    nRead= 0;
 | 
						    nRead= 0;
 | 
				
			||||||
	    break;
 | 
						    break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (nRead!=tmpTOC.size) {
 | 
					    if (nRead!=tmpTOC.size) {
 | 
				
			||||||
 | 
						_XkbLibError(_XkbErrBadLength,XkbConfigText(tmpTOC.type,XkbMessage),
 | 
				
			||||||
 | 
											nRead-tmpTOC.size);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return (nRead>=0);
 | 
					    return (nRead>=0);
 | 
				
			||||||
| 
						 | 
					@ -1288,6 +1209,8 @@ char 		name[100];
 | 
				
			||||||
		return _XkbDupString(name);
 | 
							return _XkbDupString(name);
 | 
				
			||||||
	    break;
 | 
						    break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
 | 
						    _XkbLibError(_XkbErrBadImplementation,
 | 
				
			||||||
 | 
									XkbConfigText(tmpTOC.type,XkbMessage),0);
 | 
				
			||||||
	    break;
 | 
						    break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
| 
						 | 
					@ -1353,6 +1276,8 @@ unsigned		which= need|want;
 | 
				
			||||||
		tmp= ReadXkmGeometry(file,result);
 | 
							tmp= ReadXkmGeometry(file,result);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	    default:
 | 
						    default:
 | 
				
			||||||
 | 
							_XkbLibError(_XkbErrBadImplementation,
 | 
				
			||||||
 | 
									XkbConfigText(tmpTOC.type,XkbMessage),0);
 | 
				
			||||||
		tmp= 0;
 | 
							tmp= 0;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1362,7 +1287,8 @@ unsigned		which= need|want;
 | 
				
			||||||
	    result->defined|= (1<<toc[i].type);
 | 
						    result->defined|= (1<<toc[i].type);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (nRead!=tmpTOC.size) {
 | 
						if (nRead!=tmpTOC.size) {
 | 
				
			||||||
            return 0;
 | 
						    _XkbLibError(_XkbErrBadLength,XkbConfigText(tmpTOC.type,XkbMessage),
 | 
				
			||||||
 | 
						    						nRead-tmpTOC.size);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return which;
 | 
					    return which;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue