static unsigned LoadXKM(unsigned want, unsigned need, const char *keymap, XkbDescPtr *xkbRtrn) { FILE *file; char fileName[PATH_MAX]; unsigned missing; file = XkbDDXOpenConfigFile(keymap, 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, xkbRtrn); if (*xkbRtrn == NULL) { LogMessage(X_ERROR, "Error loading keymap %s\n", fileName); fclose(file); (void) unlink(fileName); return 0; } else { DebugF("Loaded XKB keymap %s, defined=0x%x\n", fileName, (*xkbRtrn)->defined); } fclose(file); (void) unlink(fileName); return (need | want) & (~missing); }
unsigned XkbDDXLoadKeymapByNames(DeviceIntPtr keybd, XkbComponentNamesPtr names, unsigned want, unsigned need, XkbDescPtr *xkbRtrn, char *nameRtrn, int nameRtrnLen) { XkbDescPtr xkb; FILE *file; char fileName[PATH_MAX]; unsigned missing; *xkbRtrn = NULL; 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)) { LogMessage(X_ERROR, "XKB: No components provided for device %s\n", keybd->name ? keybd->name : "(unnamed keyboard)"); return 0; } else if (!XkbDDXCompileKeymapByNames(xkb, names, want, need, nameRtrn, nameRtrnLen)) { LogMessage(X_ERROR, "XKB: Couldn't compile keymap\n"); 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, xkbRtrn); if (*xkbRtrn == NULL) { LogMessage(X_ERROR, "Error loading keymap %s\n", fileName); fclose(file); (void) unlink(fileName); return 0; } else { DebugF("Loaded XKB keymap %s, defined=0x%x\n", fileName, (*xkbRtrn)->defined); } fclose(file); (void) unlink(fileName); return (need | want) & (~missing); }
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); }
void XkbInitDevice(DeviceIntPtr pXDev) { int i; XkbSrvInfoPtr xkbi; XkbChangesRec changes; SrvXkmInfo file; unsigned check; XkbEventCauseRec cause; file.dev= pXDev; file.file=NULL; bzero(&file.xkbinfo,sizeof(XkbFileInfo)); bzero(&changes,sizeof(XkbChangesRec)); if (XkbAutoLoad && (XkbInitialMap!=NULL)) { if ((file.file=XkbDDXOpenConfigFile(XkbInitialMap,NULL,0))!=NULL) { XkmReadFile(file.file,0,XkmKeymapLegal,&file.xkbinfo); if (file.xkbinfo.xkb==NULL) { LogMessage(X_ERROR, "Error loading keymap file %s (%s in %s)\n" "\treverting to defaults\n", XkbInitialMap, _XkbErrMessages[_XkbErrCode], (_XkbErrLocation?_XkbErrLocation:"unknown")); fclose(file.file); file.file= NULL; bzero(&file.xkbinfo,sizeof(XkbFileInfo)); } else { if (_XkbInitFileInfo!=NULL) { XkbDescPtr tmp; if ((tmp=_XkbInitFileInfo->xkb)!=NULL) { XkbFreeKeyboard(tmp,XkbAllComponentsMask,True); _XkbInitFileInfo->xkb= NULL; } } _XkbInitFileInfo= &file.xkbinfo; } } else { LogMessage(X_ERROR, "Error opening keymap file %s, reverting to defaults\n", XkbInitialMap); } } pXDev->key->xkbInfo= xkbi= _XkbTypedCalloc(1,XkbSrvInfoRec); if ( xkbi ) { XkbDescPtr xkb; if ((_XkbInitFileInfo!=NULL)&&(_XkbInitFileInfo->xkb!=NULL)) { file.xkbinfo= *_XkbInitFileInfo; xkbi->desc= _XkbInitFileInfo->xkb; _XkbInitFileInfo= NULL; } else { xkbi->desc= XkbAllocKeyboard(); if (!xkbi->desc) FatalError("Couldn't allocate keyboard description\n"); xkbi->desc->min_key_code = pXDev->key->curKeySyms.minKeyCode; xkbi->desc->max_key_code = pXDev->key->curKeySyms.maxKeyCode; } xkb= xkbi->desc; if (xkb->min_key_code == 0) xkb->min_key_code = pXDev->key->curKeySyms.minKeyCode; if (xkb->max_key_code == 0) xkb->max_key_code = pXDev->key->curKeySyms.maxKeyCode; if ((pXDev->key->curKeySyms.minKeyCode!=xkbi->desc->min_key_code)|| (pXDev->key->curKeySyms.maxKeyCode!=xkbi->desc->max_key_code)) { /* 12/9/95 (ef) -- XXX! Maybe we should try to fix up one or */ /* the other here, but for now just complain */ /* can't just update the core range without */ /* reallocating the KeySymsRec (pain) */ ErrorF("Internal Error!! XKB and core keymap have different range\n"); } if (XkbAllocClientMap(xkb,XkbAllClientInfoMask,0)!=Success) FatalError("Couldn't allocate client map in XkbInitDevice\n"); i= XkbNumKeys(xkb)/3+1; if (XkbAllocServerMap(xkb,XkbAllServerInfoMask,i)!=Success) FatalError("Couldn't allocate server map in XkbInitDevice\n"); xkbi->dfltPtrDelta=1; xkbi->device = pXDev; file.xkbinfo.xkb= xkb; XkbInitSemantics(xkb,&file); XkbInitNames(xkbi,&file); XkbInitRadioGroups(xkbi,&file); /* 12/31/94 (ef) -- XXX! Should check if state loaded from file */ bzero(&xkbi->state,sizeof(XkbStateRec)); XkbInitControls(pXDev,xkbi,&file); if (file.xkbinfo.defined&XkmSymbolsMask) memcpy(pXDev->key->modifierMap,xkb->map->modmap,xkb->max_key_code+1); else memcpy(xkb->map->modmap,pXDev->key->modifierMap,xkb->max_key_code+1); XkbInitIndicatorMap(xkbi,&file); XkbDDXInitDevice(pXDev); if (!(file.xkbinfo.defined&XkmSymbolsMask)) { XkbUpdateKeyTypesFromCore(pXDev,xkb->min_key_code,XkbNumKeys(xkb), &changes); } else { XkbUpdateCoreDescription(pXDev,True); } XkbSetCauseUnknown(&cause); XkbUpdateActions(pXDev,xkb->min_key_code, XkbNumKeys(xkb),&changes, &check,&cause); /* For sanity. The first time the connection * is opened, the client side min and max are set * using QueryMinMaxKeyCodes() which grabs them * from pXDev. */ pXDev->key->curKeySyms.minKeyCode = xkb->min_key_code; pXDev->key->curKeySyms.maxKeyCode = xkb->max_key_code; } if (file.file!=NULL) fclose(file.file); return; }