XKB: Actually use the keymap we compile at startup

During XkbInitKeyboardDevice, we compiled a keymap and promptly threw it away;
brief inspection revealed the embarassingly simple problem.  Sorry.
This commit is contained in:
Daniel Stone 2008-02-22 18:22:58 +01:00
parent c14fd2a5cb
commit a4202b898f

View File

@ -138,6 +138,8 @@ static char * XkbLayoutUsed= NULL;
static char * XkbVariantUsed= NULL; static char * XkbVariantUsed= NULL;
static char * XkbOptionsUsed= NULL; static char * XkbOptionsUsed= NULL;
static XkbDescPtr xkb_cached_map = NULL;
_X_EXPORT Bool noXkbExtension= XKB_DFLT_DISABLED; _X_EXPORT Bool noXkbExtension= XKB_DFLT_DISABLED;
static Bool XkbWantRulesProp= XKB_DFLT_RULES_PROP; static Bool XkbWantRulesProp= XKB_DFLT_RULES_PROP;
@ -284,6 +286,9 @@ XkbSetRulesDflts(char *rulesFile,char *model,char *layout,
static Bool static Bool
XkbInitKeyTypes(XkbDescPtr xkb) XkbInitKeyTypes(XkbDescPtr xkb)
{ {
if (xkb->defined & XkmTypesMask)
return True;
initTypeNames(NULL); initTypeNames(NULL);
if (XkbAllocClientMap(xkb,XkbKeyTypesMask,num_dflt_types)!=Success) if (XkbAllocClientMap(xkb,XkbKeyTypesMask,num_dflt_types)!=Success)
return False; return False;
@ -310,6 +315,9 @@ XkbInitCompatStructs(XkbDescPtr xkb)
register int i; register int i;
XkbCompatMapPtr compat; XkbCompatMapPtr compat;
if (xkb->defined & XkmCompatMapMask)
return True;
if (XkbAllocCompatMap(xkb,XkbAllCompatMask,num_dfltSI)!=Success) if (XkbAllocCompatMap(xkb,XkbAllCompatMask,num_dfltSI)!=Success)
return BadAlloc; return BadAlloc;
compat = xkb->compat; compat = xkb->compat;
@ -358,28 +366,33 @@ Atom unknown;
if (names->symbols==None) names->symbols= unknown; if (names->symbols==None) names->symbols= unknown;
if (names->types==None) names->types= unknown; if (names->types==None) names->types= unknown;
if (names->compat==None) names->compat= unknown; if (names->compat==None) names->compat= unknown;
if (names->vmods[vmod_NumLock]==None) if (!(xkb->defined & XkmVirtualModsMask)) {
names->vmods[vmod_NumLock]= CREATE_ATOM("NumLock"); if (names->vmods[vmod_NumLock]==None)
if (names->vmods[vmod_Alt]==None) names->vmods[vmod_NumLock]= CREATE_ATOM("NumLock");
names->vmods[vmod_Alt]= CREATE_ATOM("Alt"); if (names->vmods[vmod_Alt]==None)
if (names->vmods[vmod_AltGr]==None) names->vmods[vmod_Alt]= CREATE_ATOM("Alt");
names->vmods[vmod_AltGr]= CREATE_ATOM("ModeSwitch"); if (names->vmods[vmod_AltGr]==None)
names->vmods[vmod_AltGr]= CREATE_ATOM("ModeSwitch");
}
initIndicatorNames(NULL,xkb); if (!(xkb->defined & XkmIndicatorsMask)) {
if (names->indicators[LED_CAPS-1]==None) initIndicatorNames(NULL,xkb);
names->indicators[LED_CAPS-1] = CREATE_ATOM("Caps Lock"); if (names->indicators[LED_CAPS-1]==None)
if (names->indicators[LED_NUM-1]==None) names->indicators[LED_CAPS-1] = CREATE_ATOM("Caps Lock");
names->indicators[LED_NUM-1] = CREATE_ATOM("Num Lock"); if (names->indicators[LED_NUM-1]==None)
if (names->indicators[LED_SCROLL-1]==None) names->indicators[LED_NUM-1] = CREATE_ATOM("Num Lock");
names->indicators[LED_SCROLL-1] = CREATE_ATOM("Scroll Lock"); if (names->indicators[LED_SCROLL-1]==None)
names->indicators[LED_SCROLL-1] = CREATE_ATOM("Scroll Lock");
#ifdef LED_COMPOSE #ifdef LED_COMPOSE
if (names->indicators[LED_COMPOSE-1]==None) if (names->indicators[LED_COMPOSE-1]==None)
names->indicators[LED_COMPOSE-1] = CREATE_ATOM("Compose"); names->indicators[LED_COMPOSE-1] = CREATE_ATOM("Compose");
#endif #endif
}
if (xkb->geom!=NULL) if (xkb->geom!=NULL)
names->geometry= xkb->geom->name; names->geometry= xkb->geom->name;
else names->geometry= unknown; else names->geometry= unknown;
return Success; return Success;
} }
@ -393,27 +406,31 @@ XkbSrvLedInfoPtr sli;
xkb= xkbi->desc; xkb= xkbi->desc;
if (XkbAllocIndicatorMaps(xkb)!=Success) if (XkbAllocIndicatorMaps(xkb)!=Success)
return BadAlloc; return BadAlloc;
map= xkb->indicators;
map->phys_indicators = PHYS_LEDS;
map->maps[LED_CAPS-1].flags= XkbIM_NoExplicit;
map->maps[LED_CAPS-1].which_mods= XkbIM_UseLocked;
map->maps[LED_CAPS-1].mods.mask= LockMask;
map->maps[LED_CAPS-1].mods.real_mods= LockMask;
map->maps[LED_NUM-1].flags= XkbIM_NoExplicit; if (!(xkb->defined & XkmIndicatorsMask)) {
map->maps[LED_NUM-1].which_mods= XkbIM_UseLocked; map= xkb->indicators;
map->maps[LED_NUM-1].mods.mask= 0; map->phys_indicators = PHYS_LEDS;
map->maps[LED_NUM-1].mods.real_mods= 0; map->maps[LED_CAPS-1].flags= XkbIM_NoExplicit;
map->maps[LED_NUM-1].mods.vmods= vmod_NumLockMask; map->maps[LED_CAPS-1].which_mods= XkbIM_UseLocked;
map->maps[LED_CAPS-1].mods.mask= LockMask;
map->maps[LED_CAPS-1].mods.real_mods= LockMask;
map->maps[LED_SCROLL-1].flags= XkbIM_NoExplicit; map->maps[LED_NUM-1].flags= XkbIM_NoExplicit;
map->maps[LED_SCROLL-1].which_mods= XkbIM_UseLocked; map->maps[LED_NUM-1].which_mods= XkbIM_UseLocked;
map->maps[LED_SCROLL-1].mods.mask= Mod3Mask; map->maps[LED_NUM-1].mods.mask= 0;
map->maps[LED_SCROLL-1].mods.real_mods= Mod3Mask; map->maps[LED_NUM-1].mods.real_mods= 0;
map->maps[LED_NUM-1].mods.vmods= vmod_NumLockMask;
map->maps[LED_SCROLL-1].flags= XkbIM_NoExplicit;
map->maps[LED_SCROLL-1].which_mods= XkbIM_UseLocked;
map->maps[LED_SCROLL-1].mods.mask= Mod3Mask;
map->maps[LED_SCROLL-1].mods.real_mods= Mod3Mask;
}
sli= XkbFindSrvLedInfo(xkbi->device,XkbDfltXIClass,XkbDfltXIId,0); sli= XkbFindSrvLedInfo(xkbi->device,XkbDfltXIClass,XkbDfltXIId,0);
if (sli) if (sli)
XkbCheckIndicatorMaps(xkbi->device,sli,XkbAllIndicatorsMask); XkbCheckIndicatorMaps(xkbi->device,sli,XkbAllIndicatorsMask);
return Success; return Success;
} }
@ -428,7 +445,8 @@ XkbControlsPtr ctrls;
if (XkbAllocControls(xkb,XkbAllControlsMask)!=Success) if (XkbAllocControls(xkb,XkbAllControlsMask)!=Success)
FatalError("Couldn't allocate keyboard controls\n"); FatalError("Couldn't allocate keyboard controls\n");
ctrls= xkb->ctrls; ctrls= xkb->ctrls;
ctrls->num_groups = 1; if (!(xkb->defined & XkmSymbolsMask))
ctrls->num_groups = 1;
ctrls->groups_wrap = XkbSetGroupInfo(1,XkbWrapIntoRange,0); ctrls->groups_wrap = XkbSetGroupInfo(1,XkbWrapIntoRange,0);
ctrls->internal.mask = 0; ctrls->internal.mask = 0;
ctrls->internal.real_mods = 0; ctrls->internal.real_mods = 0;
@ -458,11 +476,18 @@ XkbEventCauseRec cause;
pXDev->key->xkbInfo= xkbi= _XkbTypedCalloc(1,XkbSrvInfoRec); pXDev->key->xkbInfo= xkbi= _XkbTypedCalloc(1,XkbSrvInfoRec);
if ( xkbi ) { if ( xkbi ) {
XkbDescPtr xkb; XkbDescPtr xkb;
xkbi->desc= XkbAllocKeyboard();
if (!xkbi->desc) if (xkb_cached_map) {
FatalError("Couldn't allocate keyboard description\n"); xkbi->desc = xkb_cached_map;
xkbi->desc->min_key_code = pXDev->key->curKeySyms.minKeyCode; xkb_cached_map = NULL;
xkbi->desc->max_key_code = pXDev->key->curKeySyms.maxKeyCode; }
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; xkb= xkbi->desc;
if (xkb->min_key_code == 0) if (xkb->min_key_code == 0)
xkb->min_key_code = pXDev->key->curKeySyms.minKeyCode; xkb->min_key_code = pXDev->key->curKeySyms.minKeyCode;
@ -494,14 +519,23 @@ XkbEventCauseRec cause;
XkbInitControls(pXDev,xkbi); XkbInitControls(pXDev,xkbi);
memcpy(xkb->map->modmap,pXDev->key->modifierMap,xkb->max_key_code+1); if (xkb->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); XkbInitIndicatorMap(xkbi);
XkbDDXInitDevice(pXDev); XkbDDXInitDevice(pXDev);
XkbUpdateKeyTypesFromCore(pXDev,xkb->min_key_code,XkbNumKeys(xkb), if (xkb->defined & XkmSymbolsMask)
&changes); XkbUpdateKeyTypesFromCore(pXDev, xkb->min_key_code,
XkbNumKeys(xkb), &changes);
else
XkbUpdateCoreDescription(pXDev, True);
XkbSetCauseUnknown(&cause); XkbSetCauseUnknown(&cause);
XkbUpdateActions(pXDev,xkb->min_key_code, XkbNumKeys(xkb),&changes, XkbUpdateActions(pXDev,xkb->min_key_code, XkbNumKeys(xkb),&changes,
&check,&cause); &check,&cause);
@ -632,11 +666,15 @@ XkbDescPtr xkb;
pMods= tmpMods; pMods= tmpMods;
} }
} }
/* Store the map here so we can pick it back up in XkbInitDevice.
* Sigh. */
xkb_cached_map = xkb;
} }
else { else {
LogMessage(X_WARNING, "Couldn't load XKB keymap, falling back to pre-XKB keymap\n"); LogMessage(X_WARNING, "Couldn't load XKB keymap, falling back to pre-XKB keymap\n");
} }
ok= InitKeyboardDeviceStruct((DevicePtr)dev,pSyms,pMods,bellProc,ctrlProc); ok= InitKeyboardDeviceStruct((DevicePtr)dev,pSyms,pMods,bellProc,ctrlProc);
xkb_cached_map = NULL;
if ((pSyms==&tmpSyms)&&(pSyms->map!=NULL)) { if ((pSyms==&tmpSyms)&&(pSyms->map!=NULL)) {
_XkbFree(pSyms->map); _XkbFree(pSyms->map);
pSyms->map= NULL; pSyms->map= NULL;