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:
parent
7e45c80204
commit
5ba87c3327
204
xkb/xkb.c
204
xkb/xkb.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue