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; }
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); }