Example #1
0
static char *
_WriteCountedString(char *wire,char *str)
{
CARD16	len,*pLen;

    len= (str?strlen(str):0);
    pLen= (CARD16 *)wire;
    *pLen= len;
    if (len && str)
	memcpy(&wire[2],str,len);
    wire+= XkbPaddedSize(len+2);
    return wire;
}
static Status
_AddListComponent(	XkbSrvListInfoPtr	list,
			int			what,
			unsigned		flags,
			char *			str,
			ClientPtr		client)
{
int		slen,wlen;
unsigned char *	wire8;
unsigned short *wire16;
char *		tmp;

    if (list->nTotal>=list->maxRtrn) {
	list->nTotal++;
	return Success;
    }
    tmp= strchr(str,')');
    if ((tmp==NULL)&&((tmp=strchr(str,'('))==NULL)) {
	slen= strlen(str);
	while ((slen>0) && isspace(str[slen-1])) {
	    slen--;
	}
    }
    else {
	slen= (tmp-str+1);
    }
    wlen= (((slen+1)/2)*2)+4;	/* four bytes for flags and length, pad to */
				/* 2-byte boundary */
    if ((list->szPool-list->nPool)<wlen) {
	if (wlen>1024)	list->szPool+= XkbPaddedSize(wlen*2);
	else		list->szPool+= 1024;
	list->pool= realloc(list->pool, list->szPool * sizeof(char));
	if (!list->pool)
	    return BadAlloc;
    }
    wire16= (unsigned short *)&list->pool[list->nPool];
    wire8= (unsigned char *)&wire16[2];
    wire16[0]= flags;
    wire16[1]= slen;
    memcpy(wire8,str,slen);
    if (client->swapped) {
	register int n;
	swaps(&wire16[0],n);
	swaps(&wire16[1],n);
    }
    list->nPool+= wlen;
    list->nFound[what]++;
    list->nTotal++;
    return Success;
}
Example #3
0
XkbComponentListPtr
XkbListComponents(	Display *		dpy,
			unsigned		deviceSpec,
			XkbComponentNamesPtr	ptrns,
			int *			max_inout)
{
register xkbListComponentsReq*	req;
xkbListComponentsReply 		rep;
XkbInfoPtr 			xkbi;
XkbComponentListPtr		list;
XkbReadBufferRec		buf;
int				left;
char *				str;
int extraLen,len,mapLen,codesLen,typesLen,compatLen,symsLen,geomLen;

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

    xkbi= dpy->xkb_info;
    LockDisplay(dpy);
    GetReq(kbListComponents, req);
    req->reqType = 	xkbi->codes->major_opcode;
    req->xkbReqType = 	X_kbListComponents;
    req->deviceSpec = 	deviceSpec;
    req->maxNames =	*max_inout;

    mapLen= codesLen= typesLen= compatLen= symsLen= geomLen= 0;
    if (ptrns->keymap)
	mapLen= (int)strlen(ptrns->keymap);
    if (ptrns->keycodes)
	codesLen= (int)strlen(ptrns->keycodes);
    if (ptrns->types)
	typesLen= (int)strlen(ptrns->types);
    if (ptrns->compat)
	compatLen= (int)strlen(ptrns->compat);
    if (ptrns->symbols)
	symsLen= (int)strlen(ptrns->symbols);
    if (ptrns->geometry)
	geomLen= (int)strlen(ptrns->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;

    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,ptrns->keymap,mapLen);
	 str+= mapLen;
    }
    *str++= codesLen;
    if (codesLen>0) {
	 memcpy(str,ptrns->keycodes,codesLen);
	 str+= codesLen;
    }
    *str++= typesLen;
    if (typesLen>0) {
	 memcpy(str,ptrns->types,typesLen);
	 str+= typesLen;
    }
    *str++= compatLen;
    if (compatLen>0) {
	 memcpy(str,ptrns->compat,compatLen);
	 str+= compatLen;
    }
    *str++= symsLen;
    if (symsLen>0) {
	 memcpy(str,ptrns->symbols,symsLen);
	 str+= symsLen;
    }
    *str++= geomLen;
    if (geomLen>0) {
	 memcpy(str,ptrns->geometry,geomLen);
	 str+= geomLen;
    }
    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse))
	goto BAILOUT;
    extraLen= (int)rep.length*4;
    *max_inout= rep.extra;
    if (extraLen==0) { /* no matches, but we don't want to report a failure */
	list= _XkbTypedCalloc(1,XkbComponentListRec);
	UnlockDisplay(dpy);
	SyncHandle();
	return list;
    }
    if (_XkbInitReadBuffer(dpy,&buf,extraLen)) {
	Status status;
	
	status= Success;
	list= _XkbTypedCalloc(1,XkbComponentListRec);
	if (!list) {
	    _XkbFreeReadBuffer(&buf);
	    goto BAILOUT;
	}
	list->num_keymaps= rep.nKeymaps;
	list->num_keycodes= rep.nKeycodes;
	list->num_types= rep.nTypes;
	list->num_compat= rep.nCompatMaps;
	list->num_symbols= rep.nSymbols;
	list->num_geometry= rep.nGeometries;
	if ((status==Success)&&(list->num_keymaps>0))
	    list->keymaps= _ReadListing(&buf,list->num_keymaps,&status);
	if ((status==Success)&&(list->num_keycodes>0))
	    list->keycodes= _ReadListing(&buf,list->num_keycodes,&status);
	if ((status==Success)&&(list->num_types>0))
	    list->types= _ReadListing(&buf,list->num_types,&status);
	if ((status==Success)&&(list->num_compat>0))
	    list->compat= _ReadListing(&buf,list->num_compat,&status);
	if ((status==Success)&&(list->num_symbols>0))
	    list->symbols= _ReadListing(&buf,list->num_symbols,&status);
	if ((status==Success)&&(list->num_geometry>0))
	    list->geometry= _ReadListing(&buf,list->num_geometry,&status);
	left= _XkbFreeReadBuffer(&buf);
	if ((status!=Success)||(buf.error)||(left>2)) {
	    XkbFreeComponentList(list);
	    goto BAILOUT;
	}
	UnlockDisplay(dpy);
	SyncHandle();
	return list;
    }
BAILOUT:
    UnlockDisplay(dpy);
    SyncHandle();
    return NULL;
}
Example #4
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;
}