diff options
Diffstat (limited to 'Xi/getmmap.c')
-rw-r--r-- | Xi/getmmap.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/Xi/getmmap.c b/Xi/getmmap.c index 0ae2ccc52..ddf27a5f0 100644 --- a/Xi/getmmap.c +++ b/Xi/getmmap.c @@ -87,36 +87,34 @@ SProcXGetDeviceModifierMapping(ClientPtr client) int ProcXGetDeviceModifierMapping(ClientPtr client) { - CARD8 maxkeys; DeviceIntPtr dev; xGetDeviceModifierMappingReply rep; - KeyClassPtr kp; - int rc; + KeyCode *modkeymap = NULL; + int ret, max_keys_per_mod; REQUEST(xGetDeviceModifierMappingReq); REQUEST_SIZE_MATCH(xGetDeviceModifierMappingReq); - rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess); - if (rc != Success) - return rc; + ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess); + if (ret != Success) + return ret; - kp = dev->key; - if (kp == NULL) - return BadMatch; - - maxkeys = kp->maxKeysPerModifier; + ret = generate_modkeymap(client, dev, &modkeymap, &max_keys_per_mod); + if (ret != Success) + return ret; rep.repType = X_Reply; rep.RepType = X_GetDeviceModifierMapping; - rep.numKeyPerModifier = maxkeys; + rep.numKeyPerModifier = max_keys_per_mod; rep.sequenceNumber = client->sequence; /* length counts 4 byte quantities - there are 8 modifiers 1 byte big */ - rep.length = 2 * maxkeys; + rep.length = max_keys_per_mod << 1; WriteReplyToClient(client, sizeof(xGetDeviceModifierMappingReply), &rep); + WriteToClient(client, max_keys_per_mod * 8, (char *) modkeymap); + + xfree(modkeymap); - /* Reply with the (modified by DDX) map that SetModifierMapping passed in */ - WriteToClient(client, 8 * maxkeys, (char *)kp->modifierKeyMap); return Success; } |