Example #1
0
Bool
XkbWriteXKBKeymapForNames(	FILE *			file,
                            XkbComponentNamesPtr	names,
                            Display *		dpy,
                            XkbDescPtr		xkb,
                            unsigned		want,
                            unsigned		need)
{
    char *		name,*tmp;
    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;

    if (xkb!=NULL) {
        old_names= xkb->names;
        finfo.type= 0;
        finfo.defined= 0;
        finfo.xkb= xkb;
        if (!XkbDetermineFileType(&finfo,XkbXKBFile,NULL))
            return False;
    }
    else old_names= NULL;

    wantConfig= want&(~complete);
    if (xkb!=NULL) {
        if (wantConfig&XkmTypesMask) {
            if ((!xkb->map) || (xkb->map->num_types<XkbNumRequiredTypes))
                wantConfig&= ~XkmTypesMask;
        }
        if (wantConfig&XkmCompatMapMask) {
            if ((!xkb->compat) || (xkb->compat->num_si<1))
                wantConfig&= ~XkmCompatMapMask;
        }
        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= tmp;
            }
            else {
                wantDflts|= XkmTypesMask;
            }
            complete|= XkmTypesMask;
        }
        if (wantNames&XkmCompatMapMask) {
            if (old_names->compat!=None) {
                tmp= XkbAtomGetString(dpy,old_names->compat);
                names->compat= tmp;
            }
            else wantDflts|= XkmCompatMapMask;
            complete|= XkmCompatMapMask;
        }
        if (wantNames&XkmSymbolsMask) {
            if (old_names->symbols==None)
                return False;
            tmp= XkbAtomGetString(dpy,old_names->symbols);
            names->symbols= tmp;
            complete|= XkmSymbolsMask;
        }
        if (wantNames&XkmKeyNamesMask) {
            if (old_names->keycodes!=None) {
                tmp= XkbAtomGetString(dpy,old_names->keycodes);
                names->keycodes= tmp;
            }
            else wantDflts|= XkmKeyNamesMask;
            complete|= XkmKeyNamesMask;
        }
        if (wantNames&XkmGeometryMask) {
            if (old_names->geometry==None)
                return False;
            tmp= XkbAtomGetString(dpy,old_names->geometry);
            names->geometry= 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");
    return True;
}
Example #2
0
unsigned
XkbDDXLoadKeymapByNames(	DeviceIntPtr		keybd,
				XkbComponentNamesPtr	names,
				unsigned		want,
				unsigned		need,
				XkbFileInfo *		finfoRtrn,
				char *			nameRtrn,
				int 			nameRtrnLen)
{
XkbDescPtr	xkb;
FILE	*	file;
char		fileName[PATH_MAX];
unsigned	missing;

    bzero(finfoRtrn,sizeof(XkbFileInfo));
    if ((keybd==NULL)||(keybd->key==NULL)||(keybd->key->xkbInfo==NULL))
	 xkb= NULL;
    else xkb= keybd->key->xkbInfo->desc;
    if ((names->keycodes==NULL)&&(names->types==NULL)&&
	(names->compat==NULL)&&(names->symbols==NULL)&&
	(names->geometry==NULL)) {
	if (names->keymap==NULL) {
	    bzero(finfoRtrn,sizeof(XkbFileInfo));
	    if (xkb && XkbDetermineFileType(finfoRtrn,XkbXKMFile,NULL) &&
	   				((finfoRtrn->defined&need)==need) ) {
		finfoRtrn->xkb= xkb;
		nameRtrn[0]= '\0';
		return finfoRtrn->defined;
	    }
	    return 0;
	}
	else if (!XkbDDXCompileNamedKeymap(xkb,names,nameRtrn,nameRtrnLen)) {
#ifdef NOISY
	    ErrorF("Couldn't compile keymap file\n");
#endif
	    return 0;
	}
    }
    else if (!XkbDDXCompileKeymapByNames(xkb,names,want,need,
						nameRtrn,nameRtrnLen)){
#ifdef NOISY
	ErrorF("Couldn't compile keymap file\n");
#endif
	return 0;
    }
    file= XkbDDXOpenConfigFile(nameRtrn,fileName,PATH_MAX);
    if (file==NULL) {
	LogMessage(X_ERROR, "Couldn't open compiled keymap file %s\n",fileName);
	return 0;
    }
    missing= XkmReadFile(file,need,want,finfoRtrn);
    if (finfoRtrn->xkb==NULL) {
	LogMessage(X_ERROR, "Error loading keymap %s\n",fileName);
	fclose(file);
	(void) unlink (fileName);
	return 0;
    }
#ifdef DEBUG
    else if (xkbDebugFlags) {
	ErrorF("Loaded %s, defined=0x%x\n",fileName,finfoRtrn->defined);
    }
#endif
    fclose(file);
    (void) unlink (fileName);
    return (need|want)&(~missing);
}