示例#1
0
static Status
_XkbGeomAlloc(	XPointer *		old,
		unsigned short *	num,
		unsigned short *	total,
		int			num_new,
		size_t			sz_elem)
{
    if (num_new<1)
	return Success;
    if ((*old)==NULL)
	*num= *total= 0;

    if ((*num)+num_new<=(*total))
	return Success;

    *total= (*num)+num_new;
    if ((*old)!=NULL)
	 (*old)= (XPointer)_XkbRealloc((*old),(*total)*sz_elem);
    else (*old)= (XPointer)_XkbCalloc((*total),sz_elem);
    if ((*old)==NULL) {
	*total= *num= 0;
	return BadAlloc;
    }

    if (*num>0) {
	char *tmp= (char *)(*old);
	bzero(&tmp[sz_elem*(*num)],(num_new*sz_elem));
    }
    return Success;
}
示例#2
0
文件: xkbInit.c 项目: narenas/nx-libs
static Status
XkbInitNames(XkbSrvInfoPtr xkbi,SrvXkmInfo *file)
{
XkbDescPtr	xkb;
XkbNamesPtr	names;
Status		rtrn;
Atom		unknown;

    xkb= xkbi->desc;
    if ((rtrn=XkbAllocNames(xkb,XkbAllNamesMask,0,0))!=Success)
	return rtrn;
    unknown= CREATE_ATOM("unknown");
    names = xkb->names;
    if (names->keycodes==None)		names->keycodes= unknown;
    if (names->geometry==None)		names->geometry= unknown;
    if (names->phys_symbols==None)	names->phys_symbols= unknown;
    if (names->symbols==None)		names->symbols= unknown;
    if (names->types==None)		names->types= unknown;
    if (names->compat==None)		names->compat= unknown;
    if ((file->xkbinfo.defined&XkmVirtualModsMask)==0) {
	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 (((file->xkbinfo.defined&XkmIndicatorsMask)==0)||
	((file->xkbinfo.defined&XkmGeometryMask)==0)) {
	initIndicatorNames(NULL,xkb);
	if (names->indicators[LED_CAPS-1]==None)
	    names->indicators[LED_CAPS-1] = CREATE_ATOM("Caps Lock");
	if (names->indicators[LED_NUM-1]==None)
	    names->indicators[LED_NUM-1] = CREATE_ATOM("Num Lock");
	if (names->indicators[LED_SCROLL-1]==None)
	    names->indicators[LED_SCROLL-1] = CREATE_ATOM("Scroll Lock");
#ifdef LED_COMPOSE
	if (names->indicators[LED_COMPOSE-1]==None)
	    names->indicators[LED_COMPOSE-1] = CREATE_ATOM("Compose");
#endif
    }
#ifdef DEBUG_RADIO_GROUPS
    if (names->num_rg<1) {
	names->radio_groups= (Atom *)_XkbCalloc(RG_COUNT, sizeof(Atom));
	if (names->radio_groups) {
	    names->num_rg = RG_COUNT;
	    names->radio_groups[RG_BOGUS_FUNCTION_GROUP]= CREATE_ATOM("BOGUS");
	}
    }
#endif
    if (xkb->geom!=NULL)
	 names->geometry= xkb->geom->name;
    else names->geometry= unknown;
    return Success;
}
示例#3
0
XkbDescPtr
XkbGetKeyboardByName(	Display *		dpy,
			unsigned		deviceSpec,
			XkbComponentNamesPtr	names,
			unsigned		want,
			unsigned		need,
			Bool			load)
{
    register xkbGetKbdByNameReq	*	req;
    xkbGetKbdByNameReply 		rep;
    int					len,extraLen;
    char *				str;
    XkbDescPtr				xkb;
    int					mapLen,codesLen,typesLen,compatLen;
    int					symsLen,geomLen;
    XkbInfoPtr 				xkbi;

    if ( (dpy==NULL) || (dpy->flags & XlibDisplayNoXkb) ||
	(!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)) )
	return NULL;

    xkbi= dpy->xkb_info;
    xkb = (XkbDescRec *)_XkbCalloc(1,sizeof(XkbDescRec));
    if (!xkb)
	return NULL;
    xkb->device_spec = deviceSpec;
    xkb->map = (XkbClientMapRec *)_XkbCalloc(1,sizeof(XkbClientMapRec));
    xkb->dpy = dpy;

    LockDisplay(dpy);
    GetReq(kbGetKbdByName, req);
    req->reqType = xkbi->codes->major_opcode;
    req->xkbReqType = X_kbGetKbdByName;
    req->deviceSpec = xkb->device_spec;
    req->want= want;
    req->need= need;
    req->load= load;

    mapLen= codesLen= typesLen= compatLen= symsLen= geomLen= 0;
    if (names) {
	if (names->keymap)
	    mapLen= (int)strlen(names->keymap);
	if (names->keycodes)
	    codesLen= (int)strlen(names->keycodes);
	if (names->types)
	    typesLen= (int)strlen(names->types);
	if (names->compat)
	    compatLen= (int)strlen(names->compat);
	if (names->symbols)
	    symsLen= (int)strlen(names->symbols);
	if (names->geometry)
	    geomLen= (int)strlen(names->geometry);
	if (mapLen>255)		mapLen= 255;
	if (codesLen>255)	codesLen= 255;
	if (typesLen>255)	typesLen= 255;
	if (compatLen>255)	compatLen= 255;
	if (symsLen>255)	symsLen= 255;
	if (geomLen>255)	geomLen= 255;
    }
    else mapLen= codesLen= typesLen= compatLen= symsLen= geomLen= 0;

    len= mapLen+codesLen+typesLen+compatLen+symsLen+geomLen+6;
    len= XkbPaddedSize(len);
    req->length+= len/4;
    BufAlloc(char *,str,len);
    *str++= mapLen;
    if (mapLen>0) {
	 memcpy(str,names->keymap,mapLen);
	 str+= mapLen;
    }
    *str++= codesLen;
    if (codesLen>0) {
	 memcpy(str,names->keycodes,codesLen);
	 str+= codesLen;
    }
    *str++= typesLen;
    if (typesLen>0) {
	 memcpy(str,names->types,typesLen);
	 str+= typesLen;
    }
    *str++= compatLen;
    if (compatLen>0) {
	 memcpy(str,names->compat,compatLen);
	 str+= compatLen;
    }
    *str++= symsLen;
    if (symsLen>0) {
	 memcpy(str,names->symbols,symsLen);
	 str+= symsLen;
    }
    *str++= geomLen;
    if (geomLen>0) {
	 memcpy(str,names->geometry,geomLen);
	 str+= geomLen;
    }
    if ((!_XReply(dpy, (xReply *)&rep, 0, xFalse))||(!rep.reported))
	goto BAILOUT;
    extraLen= (int)rep.length*4;

    xkb->device_spec= rep.deviceID;
    xkb->min_key_code = rep.minKeyCode;
    xkb->max_key_code = rep.maxKeyCode;
    if (rep.reported&(XkbGBN_SymbolsMask|XkbGBN_TypesMask)) {
	xkbGetMapReply 	mrep;
	Status		status;
	int		nread= 0;

	_XRead(dpy, (char *)&mrep, SIZEOF(xkbGetMapReply));
	extraLen-= SIZEOF(xkbGetMapReply);
	status= _XkbReadGetMapReply(dpy,&mrep,xkb,&nread);
	extraLen-= nread;
	if (status!=Success)
	    goto BAILOUT;
    }
    if (rep.reported&XkbGBN_CompatMapMask) {
	xkbGetCompatMapReply 	crep;
	Status			status;
	int			nread= 0;

	_XRead(dpy, (char *)&crep, SIZEOF(xkbGetCompatMapReply));
	extraLen-= SIZEOF(xkbGetCompatMapReply);
	status= _XkbReadGetCompatMapReply(dpy,&crep,xkb,&nread);
	extraLen-= nread;
	if (status!=Success)
	    goto BAILOUT;
    }
    if (rep.reported&XkbGBN_IndicatorMapMask) {
	xkbGetIndicatorMapReply irep;
	Status			status;
	int			nread= 0;

	_XRead(dpy, (char *)&irep, SIZEOF(xkbGetIndicatorMapReply));
	extraLen-= SIZEOF(xkbGetIndicatorMapReply);
	status= _XkbReadGetIndicatorMapReply(dpy,&irep,xkb,&nread);
	extraLen-= nread;
	if (status!=Success)
	    goto BAILOUT;
    }
    if (rep.reported&(XkbGBN_KeyNamesMask|XkbGBN_OtherNamesMask)) {
	xkbGetNamesReply	nrep;
	Status			status;
	int			nread= 0;

	_XRead(dpy, (char *)&nrep, SIZEOF(xkbGetNamesReply));
	extraLen-= SIZEOF(xkbGetNamesReply);
	status= _XkbReadGetNamesReply(dpy,&nrep,xkb,&nread);
	extraLen-= nread;
	if (status!=Success)
	    goto BAILOUT;
    }
    if (rep.reported&XkbGBN_GeometryMask) {
	xkbGetGeometryReply	grep;
	Status			status;
	int			nread= 0;

	_XRead(dpy, (char *)&grep, SIZEOF(xkbGetGeometryReply));
	extraLen-= SIZEOF(xkbGetGeometryReply);
	status= _XkbReadGetGeometryReply(dpy,&grep,xkb,&nread);
	extraLen-= nread;
	if (status!=Success)
	    goto BAILOUT;
    }
    UnlockDisplay(dpy);
    SyncHandle();
    return xkb;
BAILOUT:
    if (xkb!=NULL)
	XkbFreeKeyboard(xkb,XkbAllComponentsMask,xTrue);
    UnlockDisplay(dpy);
    SyncHandle();
    return NULL;
}