示例#1
0
Status
XkbResizeDeviceButtonActions(XkbDeviceInfoPtr devi, unsigned newTotal)
{
    XkbAction *prev_btn_acts;

    if ((!devi) || (newTotal > 255))
        return BadValue;
    if ((devi->btn_acts != NULL) && (newTotal == devi->num_btns))
        return Success;
    if (newTotal == 0) {
        if (devi->btn_acts != NULL) {
            _XkbFree(devi->btn_acts);
            devi->btn_acts = NULL;
        }
        devi->num_btns = 0;
        return Success;
    }
    prev_btn_acts = devi->btn_acts;
    devi->btn_acts = _XkbTypedRealloc(devi->btn_acts, newTotal, XkbAction);
    if (devi->btn_acts == NULL) {
        _XkbFree(prev_btn_acts);
        devi->num_btns = 0;
        return BadAlloc;
    }
    if (newTotal > devi->num_btns) {
        XkbAction *act;

        act = &devi->btn_acts[devi->num_btns];
        bzero((char *) act, (newTotal - devi->num_btns) * sizeof(XkbAction));
    }
    devi->num_btns = newTotal;
    return Success;
}
示例#2
0
XkbConfigUnboundModPtr
XkbCFAddModByName(	XkbConfigRtrnPtr	rtrn,
			int			what,
			char *			name,
			Bool			merge,
			XkbConfigUnboundModPtr	last)
{
    if (rtrn->num_unbound_mods>=rtrn->sz_unbound_mods) {
	rtrn->sz_unbound_mods+= 5;
	rtrn->unbound_mods= _XkbTypedRealloc(rtrn->unbound_mods,
						  rtrn->sz_unbound_mods,
						  XkbConfigUnboundModRec);
	if (rtrn->unbound_mods==NULL) {
	    rtrn->error= XkbCF_BadAlloc;
	    return False;
	}
    }
    if (last==NULL) {
	last= &rtrn->unbound_mods[rtrn->num_unbound_mods++];
	last->what= what;
	last->mods= 0;
	last->vmods= 0;
	last->merge= merge;
	last->name= NULL;
    }
    if (_XkbStrCaseCmp(name,"shift")==0)
	last->mods|= ShiftMask;
    else if (_XkbStrCaseCmp(name,"lock")==0)
	last->mods|= LockMask;
    else if ((_XkbStrCaseCmp(name,"control")==0)||
		(_XkbStrCaseCmp(name,"ctrl")==0))
	last->mods|= ControlMask;
    else if (_XkbStrCaseCmp(name,"mod1")==0)
	last->mods|= Mod1Mask;
    else if (_XkbStrCaseCmp(name,"mod2")==0)
	last->mods|= Mod2Mask;
    else if (_XkbStrCaseCmp(name,"mod3")==0)
	last->mods|= Mod3Mask;
    else if (_XkbStrCaseCmp(name,"mod4")==0)
	last->mods|= Mod4Mask;
    else if (_XkbStrCaseCmp(name,"mod5")==0)
	last->mods|= Mod5Mask;
    else {
	if (last->name!=NULL) {
	    last= &rtrn->unbound_mods[rtrn->num_unbound_mods++];
	    last->what= what;
	    last->mods= 0;
	    last->vmods= 0;
	    last->merge= merge;
	    last->name= NULL;
	}
	last->name= _XkbDupString(name);
    }
    return last;
}
示例#3
0
/*ARGSUSED*/
Status
XkbAllocCompatMap(XkbDescPtr xkb, unsigned which, unsigned nSI)
{
    XkbCompatMapPtr compat;
    XkbSymInterpretRec *prev_interpret;

    if (!xkb)
        return BadMatch;
    if (xkb->compat) {
        if (xkb->compat->size_si >= nSI)
            return Success;
        compat = xkb->compat;
        compat->size_si = nSI;
        if (compat->sym_interpret == NULL)
            compat->num_si = 0;
        prev_interpret = compat->sym_interpret;
        compat->sym_interpret = _XkbTypedRealloc(compat->sym_interpret,
                                                 nSI, XkbSymInterpretRec);
        if (compat->sym_interpret == NULL) {
            _XkbFree(prev_interpret);
            compat->size_si = compat->num_si = 0;
            return BadAlloc;
        }
        if (compat->num_si != 0) {
            _XkbClearElems(compat->sym_interpret, compat->num_si,
                           compat->size_si - 1, XkbSymInterpretRec);
        }
        return Success;
    }
    compat = _XkbTypedCalloc(1, XkbCompatMapRec);
    if (compat == NULL)
        return BadAlloc;
    if (nSI > 0) {
        compat->sym_interpret = _XkbTypedCalloc(nSI, XkbSymInterpretRec);
        if (!compat->sym_interpret) {
            _XkbFree(compat);
            return BadAlloc;
        }
    }
    compat->size_si = nSI;
    compat->num_si = 0;
    bzero((char *) &compat->groups[0], XkbNumKbdGroups * sizeof(XkbModsRec));
    xkb->compat = compat;
    return Success;
}
示例#4
0
static XkbRF_GroupPtr
XkbcRF_AddGroup(XkbRF_RulesPtr	rules)
{
    if (rules->sz_groups<1) {
	rules->sz_groups= 16;
	rules->num_groups= 0;
	rules->groups= _XkbTypedCalloc(rules->sz_groups,XkbRF_GroupRec);
    }
    else if (rules->num_groups >= rules->sz_groups) {
	rules->sz_groups *= 2;
	rules->groups= _XkbTypedRealloc(rules->groups,rules->sz_groups,
							XkbRF_GroupRec);
    }
    if (!rules->groups) {
	rules->sz_groups= rules->num_groups= 0;
	return NULL;
    }

    bzero((char *)&rules->groups[rules->num_groups],sizeof(XkbRF_GroupRec));
    return &rules->groups[rules->num_groups++];
}
示例#5
0
XkbRF_VarDescPtr
XkbRF_AddVarDesc(XkbRF_DescribeVarsPtr	vars)
{
    if (vars->sz_desc<1) {
	vars->sz_desc= 16;
	vars->num_desc= 0;
	vars->desc= _XkbTypedCalloc(vars->sz_desc,XkbRF_VarDescRec);
    }
    else if (vars->num_desc>=vars->sz_desc) {
	vars->sz_desc*= 2;
	vars->desc= _XkbTypedRealloc(vars->desc,vars->sz_desc,XkbRF_VarDescRec);
    }
    if (!vars->desc) {
	vars->sz_desc= vars->num_desc= 0;
	PR_DEBUG("Allocation failure in XkbRF_AddVarDesc\n");
	return NULL;
    }
    vars->desc[vars->num_desc].name= NULL;
    vars->desc[vars->num_desc].desc= NULL;
    return &vars->desc[vars->num_desc++];
}
示例#6
0
XkbDeviceLedInfoPtr
XkbAddDeviceLedInfo(XkbDeviceInfoPtr devi, unsigned ledClass, unsigned ledId)
{
    XkbDeviceLedInfoPtr devli;
    register int i;

    if ((!devi) || (!XkbSingleXIClass(ledClass)) || (!XkbSingleXIId(ledId)))
        return NULL;
    for (i = 0, devli = devi->leds; i < devi->num_leds; i++, devli++) {
        if ((devli->led_class == ledClass) && (devli->led_id == ledId))
            return devli;
    }
    if (devi->num_leds >= devi->sz_leds) {
        XkbDeviceLedInfoRec *prev_leds = devi->leds;

        if (devi->sz_leds > 0)
            devi->sz_leds *= 2;
        else
            devi->sz_leds = 1;
        devi->leds = _XkbTypedRealloc(devi->leds, devi->sz_leds,
                                      XkbDeviceLedInfoRec);
        if (!devi->leds) {
            _XkbFree(prev_leds);
            devi->sz_leds = devi->num_leds = 0;
            return NULL;
        }
        i = devi->num_leds;
        for (devli = &devi->leds[i]; i < devi->sz_leds; i++, devli++) {
            bzero(devli, sizeof(XkbDeviceLedInfoRec));
            devli->led_class = XkbXINone;
            devli->led_id = XkbXINone;
        }
    }
    devli = &devi->leds[devi->num_leds++];
    bzero(devli, sizeof(XkbDeviceLedInfoRec));
    devli->led_class = ledClass;
    devli->led_id = ledId;
    return devli;
}
示例#7
0
static XkbRF_RulePtr
XkbcRF_AddRule(XkbRF_RulesPtr	rules)
{
    if (rules->sz_rules<1) {
	rules->sz_rules= 16;
	rules->num_rules= 0;
	rules->rules= _XkbTypedCalloc(rules->sz_rules,XkbRF_RuleRec);
    }
    else if (rules->num_rules>=rules->sz_rules) {
	rules->sz_rules*= 2;
	rules->rules= _XkbTypedRealloc(rules->rules,rules->sz_rules,
							XkbRF_RuleRec);
    }
    if (!rules->rules) {
	rules->sz_rules= rules->num_rules= 0;
#ifdef DEBUG
	fprintf(stderr,"Allocation failure in XkbcRF_AddRule\n");
#endif
	return NULL;
    }
    bzero((char *)&rules->rules[rules->num_rules],sizeof(XkbRF_RuleRec));
    return &rules->rules[rules->num_rules++];
}
示例#8
0
Status
XkbAllocNames(XkbDescPtr xkb, unsigned which, int nTotalRG, int nTotalAliases)
{
    XkbNamesPtr names;

    if (xkb == NULL)
        return BadMatch;
    if (xkb->names == NULL) {
        xkb->names = _XkbTypedCalloc(1, XkbNamesRec);
        if (xkb->names == NULL)
            return BadAlloc;
    }
    names = xkb->names;
    if ((which & XkbKTLevelNamesMask) && (xkb->map != NULL) &&
        (xkb->map->types != NULL)) {
        register int i;
        XkbKeyTypePtr type = xkb->map->types;

        for (i = 0; i < xkb->map->num_types; i++, type++) {
            if (type->level_names == NULL) {
                type->level_names = _XkbTypedCalloc(type->num_levels, Atom);
                if (type->level_names == NULL)
                    return BadAlloc;
            }
        }
    }
    if ((which & XkbKeyNamesMask) && (names->keys == NULL)) {
        if ((!XkbIsLegalKeycode(xkb->min_key_code)) ||
            (!XkbIsLegalKeycode(xkb->max_key_code)) ||
            (xkb->max_key_code < xkb->min_key_code))
            return BadValue;
        names->keys = _XkbTypedCalloc((xkb->max_key_code + 1), XkbKeyNameRec);
        if (names->keys == NULL)
            return BadAlloc;
    }
    if ((which & XkbKeyAliasesMask) && (nTotalAliases > 0)) {
        if (names->key_aliases == NULL) {
            names->key_aliases = _XkbTypedCalloc(nTotalAliases, XkbKeyAliasRec);
        }
        else if (nTotalAliases > names->num_key_aliases) {
            XkbKeyAliasRec *prev_aliases = names->key_aliases;

            names->key_aliases = _XkbTypedRealloc(names->key_aliases,
                                                  nTotalAliases,
                                                  XkbKeyAliasRec);
            if (names->key_aliases != NULL) {
                _XkbClearElems(names->key_aliases, names->num_key_aliases,
                               nTotalAliases - 1, XkbKeyAliasRec);
            }
            else {
                _XkbFree(prev_aliases);
            }
        }
        if (names->key_aliases == NULL) {
            names->num_key_aliases = 0;
            return BadAlloc;
        }
        names->num_key_aliases = nTotalAliases;
    }
    if ((which & XkbRGNamesMask) && (nTotalRG > 0)) {
        if (names->radio_groups == NULL) {
            names->radio_groups = _XkbTypedCalloc(nTotalRG, Atom);
        }
        else if (nTotalRG > names->num_rg) {
            Atom *prev_radio_groups = names->radio_groups;

            names->radio_groups =
                _XkbTypedRealloc(names->radio_groups, nTotalRG, Atom);
            if (names->radio_groups != NULL) {
                _XkbClearElems(names->radio_groups, names->num_rg, nTotalRG - 1,
                               Atom);
            }
            else {
                _XkbFree(prev_radio_groups);
            }
        }
        if (names->radio_groups == NULL)
            return BadAlloc;
        names->num_rg = nTotalRG;
    }
    return Success;
}
示例#9
0
Status
XkbAllocClientMap(XkbDescPtr xkb,unsigned which,unsigned nTotalTypes)
{
register int	i;
XkbClientMapPtr map;

    if ((xkb==NULL)||((nTotalTypes>0)&&(nTotalTypes<XkbNumRequiredTypes)))
	return BadValue;
    if ((which&XkbKeySymsMask)&&
	((!XkbIsLegalKeycode(xkb->min_key_code))||
	 (!XkbIsLegalKeycode(xkb->max_key_code))||
	 (xkb->max_key_code<xkb->min_key_code))) {
#ifdef DEBUG
fprintf(stderr,"bad keycode (%d,%d) in XkbAllocClientMap\n",
				xkb->min_key_code,xkb->max_key_code);
#endif
	return BadValue;
    }

    if (xkb->map==NULL) {
	map= _XkbTypedCalloc(1,XkbClientMapRec);
	if (map==NULL)
	    return BadAlloc;
	xkb->map= map;
    }
    else map= xkb->map;

    if ((which&XkbKeyTypesMask)&&(nTotalTypes>0)) {
	if (map->types==NULL) {
	    map->types= _XkbTypedCalloc(nTotalTypes,XkbKeyTypeRec);
	    if (map->types==NULL)
		return BadAlloc;
	    map->num_types= 0;
	    map->size_types= nTotalTypes;
	}
	else if (map->size_types<nTotalTypes) {
	    XkbKeyTypeRec *prev_types = map->types;

	    map->types= _XkbTypedRealloc(map->types,nTotalTypes,XkbKeyTypeRec);
	    if (map->types==NULL) {
		_XkbFree(prev_types);
		map->num_types= map->size_types= 0;
		return BadAlloc;
	    }
	    map->size_types= nTotalTypes;
	    bzero(&map->types[map->num_types], 
		  ((map->size_types-map->num_types)*sizeof(XkbKeyTypeRec)));
	}
    }
    if (which&XkbKeySymsMask) {
	int nKeys= XkbNumKeys(xkb);
	if (map->syms==NULL) {
	    map->size_syms= (nKeys*15)/10;
	    map->syms= _XkbTypedCalloc(map->size_syms,KeySym);
	    if (!map->syms) {
		map->size_syms= 0;
		return BadAlloc;
	    }
	    map->num_syms= 1;
	    map->syms[0]= NoSymbol;
	}
	if (map->key_sym_map==NULL) {
	    i= xkb->max_key_code+1;
	    map->key_sym_map= _XkbTypedCalloc(i,XkbSymMapRec);
	    if (map->key_sym_map==NULL)
		return BadAlloc;
	}
    }
    if (which&XkbModifierMapMask) {
	if ((!XkbIsLegalKeycode(xkb->min_key_code))||
	    (!XkbIsLegalKeycode(xkb->max_key_code))||
	    (xkb->max_key_code<xkb->min_key_code))
	    return BadMatch;
	if (map->modmap==NULL) {
	    i= xkb->max_key_code+1;
	    map->modmap= _XkbTypedCalloc(i,unsigned char);
	    if (map->modmap==NULL)
		return BadAlloc;
	}
    }