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:
		
							parent
							
								
									c14fd2a5cb
								
							
						
					
					
						commit
						a4202b898f
					
				| 
						 | 
				
			
			@ -138,6 +138,8 @@ static char *		XkbLayoutUsed=	NULL;
 | 
			
		|||
static char *		XkbVariantUsed=	NULL;
 | 
			
		||||
static char *		XkbOptionsUsed=	NULL;
 | 
			
		||||
 | 
			
		||||
static XkbDescPtr       xkb_cached_map = NULL;
 | 
			
		||||
 | 
			
		||||
_X_EXPORT Bool		noXkbExtension=		XKB_DFLT_DISABLED;
 | 
			
		||||
static Bool		XkbWantRulesProp=	XKB_DFLT_RULES_PROP;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -284,6 +286,9 @@ XkbSetRulesDflts(char *rulesFile,char *model,char *layout,
 | 
			
		|||
static Bool
 | 
			
		||||
XkbInitKeyTypes(XkbDescPtr xkb)
 | 
			
		||||
{
 | 
			
		||||
    if (xkb->defined & XkmTypesMask)
 | 
			
		||||
        return True;
 | 
			
		||||
 | 
			
		||||
    initTypeNames(NULL);
 | 
			
		||||
    if (XkbAllocClientMap(xkb,XkbKeyTypesMask,num_dflt_types)!=Success)
 | 
			
		||||
	return False;
 | 
			
		||||
| 
						 | 
				
			
			@ -310,6 +315,9 @@ XkbInitCompatStructs(XkbDescPtr xkb)
 | 
			
		|||
register int 	i;
 | 
			
		||||
XkbCompatMapPtr	compat;
 | 
			
		||||
 | 
			
		||||
    if (xkb->defined & XkmCompatMapMask)
 | 
			
		||||
        return True;
 | 
			
		||||
 | 
			
		||||
    if (XkbAllocCompatMap(xkb,XkbAllCompatMask,num_dfltSI)!=Success)
 | 
			
		||||
	return BadAlloc;
 | 
			
		||||
    compat = xkb->compat;
 | 
			
		||||
| 
						 | 
				
			
			@ -358,13 +366,16 @@ Atom		unknown;
 | 
			
		|||
    if (names->symbols==None)		names->symbols= unknown;
 | 
			
		||||
    if (names->types==None)		names->types= unknown;
 | 
			
		||||
    if (names->compat==None)		names->compat= unknown;
 | 
			
		||||
    if (!(xkb->defined & XkmVirtualModsMask)) {
 | 
			
		||||
        if (names->vmods[vmod_NumLock]==None)
 | 
			
		||||
            names->vmods[vmod_NumLock]= CREATE_ATOM("NumLock");
 | 
			
		||||
        if (names->vmods[vmod_Alt]==None)
 | 
			
		||||
            names->vmods[vmod_Alt]= CREATE_ATOM("Alt");
 | 
			
		||||
        if (names->vmods[vmod_AltGr]==None)
 | 
			
		||||
            names->vmods[vmod_AltGr]= CREATE_ATOM("ModeSwitch");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!(xkb->defined & XkmIndicatorsMask)) {
 | 
			
		||||
        initIndicatorNames(NULL,xkb);
 | 
			
		||||
        if (names->indicators[LED_CAPS-1]==None)
 | 
			
		||||
            names->indicators[LED_CAPS-1] = CREATE_ATOM("Caps Lock");
 | 
			
		||||
| 
						 | 
				
			
			@ -376,10 +387,12 @@ Atom		unknown;
 | 
			
		|||
        if (names->indicators[LED_COMPOSE-1]==None)
 | 
			
		||||
            names->indicators[LED_COMPOSE-1] = CREATE_ATOM("Compose");
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (xkb->geom!=NULL)
 | 
			
		||||
	 names->geometry= xkb->geom->name;
 | 
			
		||||
    else names->geometry= unknown;
 | 
			
		||||
 | 
			
		||||
    return Success;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -393,6 +406,8 @@ XkbSrvLedInfoPtr	sli;
 | 
			
		|||
    xkb= xkbi->desc;
 | 
			
		||||
    if (XkbAllocIndicatorMaps(xkb)!=Success)
 | 
			
		||||
	return BadAlloc;
 | 
			
		||||
 | 
			
		||||
    if (!(xkb->defined & XkmIndicatorsMask)) {
 | 
			
		||||
        map= xkb->indicators;
 | 
			
		||||
        map->phys_indicators = PHYS_LEDS;
 | 
			
		||||
        map->maps[LED_CAPS-1].flags= XkbIM_NoExplicit;
 | 
			
		||||
| 
						 | 
				
			
			@ -410,10 +425,12 @@ XkbSrvLedInfoPtr	sli;
 | 
			
		|||
        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);
 | 
			
		||||
    if (sli)
 | 
			
		||||
	XkbCheckIndicatorMaps(xkbi->device,sli,XkbAllIndicatorsMask);
 | 
			
		||||
 | 
			
		||||
    return Success;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -428,6 +445,7 @@ XkbControlsPtr	ctrls;
 | 
			
		|||
    if (XkbAllocControls(xkb,XkbAllControlsMask)!=Success)
 | 
			
		||||
	FatalError("Couldn't allocate keyboard controls\n");
 | 
			
		||||
    ctrls= xkb->ctrls;
 | 
			
		||||
    if (!(xkb->defined & XkmSymbolsMask))
 | 
			
		||||
        ctrls->num_groups = 1;
 | 
			
		||||
    ctrls->groups_wrap = XkbSetGroupInfo(1,XkbWrapIntoRange,0);
 | 
			
		||||
    ctrls->internal.mask = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -458,11 +476,18 @@ XkbEventCauseRec	cause;
 | 
			
		|||
    pXDev->key->xkbInfo= xkbi= _XkbTypedCalloc(1,XkbSrvInfoRec);
 | 
			
		||||
    if ( xkbi ) {
 | 
			
		||||
	XkbDescPtr	xkb;
 | 
			
		||||
 | 
			
		||||
        if (xkb_cached_map) {
 | 
			
		||||
            xkbi->desc = xkb_cached_map;
 | 
			
		||||
            xkb_cached_map = 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;
 | 
			
		||||
| 
						 | 
				
			
			@ -494,14 +519,23 @@ XkbEventCauseRec	cause;
 | 
			
		|||
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
	XkbDDXInitDevice(pXDev);
 | 
			
		||||
 | 
			
		||||
        XkbUpdateKeyTypesFromCore(pXDev,xkb->min_key_code,XkbNumKeys(xkb),
 | 
			
		||||
                                  &changes);
 | 
			
		||||
        if (xkb->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);
 | 
			
		||||
| 
						 | 
				
			
			@ -632,11 +666,15 @@ XkbDescPtr              xkb;
 | 
			
		|||
		pMods= tmpMods;
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
        /* Store the map here so we can pick it back up in XkbInitDevice.
 | 
			
		||||
         * Sigh. */
 | 
			
		||||
        xkb_cached_map = xkb;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
	LogMessage(X_WARNING, "Couldn't load XKB keymap, falling back to pre-XKB keymap\n");
 | 
			
		||||
    }
 | 
			
		||||
    ok= InitKeyboardDeviceStruct((DevicePtr)dev,pSyms,pMods,bellProc,ctrlProc);
 | 
			
		||||
    xkb_cached_map = NULL;
 | 
			
		||||
    if ((pSyms==&tmpSyms)&&(pSyms->map!=NULL)) {
 | 
			
		||||
	_XkbFree(pSyms->map);
 | 
			
		||||
	pSyms->map= NULL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue