xkb: ProcXkbSetNames should work on all attached SDs.

If called with XkbUseCoreKbd, run through all attached SDs and replicate the
call. This way, we keep the SDs in sync with the MD as long as core clients
control the MDs.
This commit is contained in:
Peter Hutterer 2008-08-01 16:41:08 +09:30
parent 7e45c80204
commit 5ba87c3327

204
xkb/xkb.c
View File

@ -3862,74 +3862,26 @@ char * str;
return True;
}
/* FIXME: Needs to set names on all core-sending devices. */
int
ProcXkbSetNames(ClientPtr client)
/**
* Check the device-dependent data in the request against the device. Returns
* Success, or the appropriate error code.
*/
static int
_XkbSetNamesCheck(ClientPtr client, DeviceIntPtr dev,
xkbSetNamesReq *stuff, CARD32 *data)
{
DeviceIntPtr dev;
XkbDescRec *xkb;
XkbNamesRec *names;
xkbNamesNotify nn;
CARD32 *tmp;
Atom bad;
REQUEST(xkbSetNamesReq);
REQUEST_AT_LEAST_SIZE(xkbSetNamesReq);
if (!(client->xkbClientFlags&_XkbClientInitialized))
return BadAccess;
CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
CHK_MASK_LEGAL(0x01,stuff->which,XkbAllNamesMask);
tmp = data;
xkb = dev->key->xkbInfo->desc;
names = xkb->names;
tmp = (CARD32 *)&stuff[1];
if (stuff->which&XkbKeycodesNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue = bad;
return BadAtom;
}
}
if (stuff->which&XkbGeometryNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue = bad;
return BadAtom;
}
}
if (stuff->which&XkbSymbolsNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue = bad;
return BadAtom;
}
}
if (stuff->which&XkbPhysSymbolsNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue= bad;
return BadAtom;
}
}
if (stuff->which&XkbTypesNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue = bad;
return BadAtom;
}
}
if (stuff->which&XkbCompatNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue = bad;
return BadAtom;
}
}
if (stuff->which&XkbKeyTypeNamesMask) {
register int i;
if (stuff->which & XkbKeyTypeNamesMask) {
int i;
CARD32 *old;
if ( stuff->nTypes<1 ) {
client->errorValue = _XkbErrCode2(0x02,stuff->nTypes);
@ -3957,7 +3909,7 @@ ProcXkbSetNames(ClientPtr client)
}
}
if (stuff->which&XkbKTLevelNamesMask) {
register unsigned i;
unsigned i;
XkbKeyTypePtr type;
CARD8 * width;
if ( stuff->nKTLevels<1 ) {
@ -4058,12 +4010,29 @@ ProcXkbSetNames(ClientPtr client)
client->errorValue = stuff->length;
return BadLength;
}
return Success;
}
static int
_XkbSetNames(ClientPtr client, DeviceIntPtr dev, xkbSetNamesReq *stuff)
{
XkbDescRec *xkb;
XkbNamesRec *names;
CARD32 *tmp;
xkbNamesNotify nn;
tmp = (CARD32 *)&stuff[1];
xkb = dev->key->xkbInfo->desc;
names = xkb->names;
if (XkbAllocNames(xkb,stuff->which,stuff->nRadioGroups,
stuff->nKeyAliases)!=Success) {
return BadAlloc;
}
/* everything is okay -- update names */
bzero(&nn,sizeof(xkbNamesNotify));
nn.changed= stuff->which;
tmp = (CARD32 *)&stuff[1];
@ -4199,6 +4168,119 @@ ProcXkbSetNames(ClientPtr client)
XkbSendExtensionDeviceNotify(dev,client,&edev);
}
}
return Success;
}
int
ProcXkbSetNames(ClientPtr client)
{
DeviceIntPtr dev;
CARD32 *tmp;
Atom bad;
int rc;
REQUEST(xkbSetNamesReq);
REQUEST_AT_LEAST_SIZE(xkbSetNamesReq);
if (!(client->xkbClientFlags&_XkbClientInitialized))
return BadAccess;
CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
CHK_MASK_LEGAL(0x01,stuff->which,XkbAllNamesMask);
/* check device-independent stuff */
tmp = (CARD32 *)&stuff[1];
if (stuff->which&XkbKeycodesNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue = bad;
return BadAtom;
}
}
if (stuff->which&XkbGeometryNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue = bad;
return BadAtom;
}
}
if (stuff->which&XkbSymbolsNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue = bad;
return BadAtom;
}
}
if (stuff->which&XkbPhysSymbolsNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue= bad;
return BadAtom;
}
}
if (stuff->which&XkbTypesNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue = bad;
return BadAtom;
}
}
if (stuff->which&XkbCompatNameMask) {
tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
if (!tmp) {
client->errorValue = bad;
return BadAtom;
}
}
/* start of device-dependent tests */
rc = _XkbSetNamesCheck(client, dev, stuff, tmp);
if (rc != Success)
return rc;
if (stuff->deviceSpec == XkbUseCoreKbd)
{
DeviceIntPtr other;
for (other = inputInfo.devices; other; other = other->next)
{
if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
{
rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
if (rc == Success)
{
rc = _XkbSetNamesCheck(client, other, stuff, tmp);
if (rc != Success)
return rc;
}
}
}
}
/* everything is okay -- update names */
rc = _XkbSetNames(client, dev, stuff);
if (rc != Success)
return rc;
if (stuff->deviceSpec == XkbUseCoreKbd)
{
DeviceIntPtr other;
for (other = inputInfo.devices; other; other = other->next)
{
if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
{
rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
if (rc == Success)
_XkbSetNames(client, other, stuff);
}
}
}
/* everything is okay -- update names */
return client->noClientException;
}