aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/X11/XKBNames.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/lib/X11/XKBNames.c')
-rw-r--r--nx-X11/lib/X11/XKBNames.c879
1 files changed, 0 insertions, 879 deletions
diff --git a/nx-X11/lib/X11/XKBNames.c b/nx-X11/lib/X11/XKBNames.c
deleted file mode 100644
index 951fd1da8..000000000
--- a/nx-X11/lib/X11/XKBNames.c
+++ /dev/null
@@ -1,879 +0,0 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#define NEED_MAP_READERS
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "Xlibint.h"
-#include <nx-X11/extensions/XKBproto.h>
-#include "XKBlibint.h"
-
-
-static Status
-_XkbReadAtoms(XkbReadBufferPtr buf,
- Atom *atoms,
- int maxAtoms,
- CARD32 present)
-{
- register int i, bit;
-
- for (i = 0, bit = 1; (i < maxAtoms) && (present); i++, bit <<= 1) {
- if (present & bit) {
- if (!_XkbReadBufferCopy32(buf, (long *) &atoms[i], 1))
- return BadLength;
- present &= ~bit;
- }
- }
- return Success;
-}
-
-Status
-_XkbReadGetNamesReply(Display *dpy,
- xkbGetNamesReply *rep,
- XkbDescPtr xkb,
- int *nread_rtrn)
-{
- int i, len;
- XkbReadBufferRec buf;
- register XkbNamesPtr names;
-
- if (xkb->device_spec == XkbUseCoreKbd)
- xkb->device_spec = rep->deviceID;
-
- if ((xkb->names == NULL) &&
- (XkbAllocNames(xkb, rep->which,
- rep->nRadioGroups, rep->nKeyAliases) != Success)) {
- return BadAlloc;
- }
- names = xkb->names;
- if (rep->length == 0)
- return Success;
-
- if (!_XkbInitReadBuffer(dpy, &buf, (int) rep->length * 4))
- return BadAlloc;
- if (nread_rtrn)
- *nread_rtrn = (int) rep->length * 4;
-
- if ((rep->which & XkbKeycodesNameMask) &&
- (!_XkbReadBufferCopy32(&buf, (long *) &names->keycodes, 1)))
- goto BAILOUT;
- if ((rep->which & XkbGeometryNameMask) &&
- (!_XkbReadBufferCopy32(&buf, (long *) &names->geometry, 1)))
- goto BAILOUT;
- if ((rep->which & XkbSymbolsNameMask) &&
- (!_XkbReadBufferCopy32(&buf, (long *) &names->symbols, 1)))
- goto BAILOUT;
- if ((rep->which & XkbPhysSymbolsNameMask) &&
- (!_XkbReadBufferCopy32(&buf, (long *) &names->phys_symbols, 1)))
- goto BAILOUT;
- if ((rep->which & XkbTypesNameMask) &&
- (!_XkbReadBufferCopy32(&buf, (long *) &names->types, 1)))
- goto BAILOUT;
- if ((rep->which & XkbCompatNameMask) &&
- (!_XkbReadBufferCopy32(&buf, (long *) &names->compat, 1)))
- goto BAILOUT;
-
- if (rep->which & XkbKeyTypeNamesMask) {
- XkbClientMapPtr map = xkb->map;
- XkbKeyTypePtr type;
-
- len = rep->nTypes * 4;
- if (map != NULL) {
- type = map->types;
- for (i = 0; (i < map->num_types) && (i < rep->nTypes); i++, type++) {
- if (!_XkbReadBufferCopy32(&buf, (long *) &type->name, 1))
- goto BAILOUT;
- len -= 4;
- }
- }
- if ((len > 0) && (!_XkbSkipReadBufferData(&buf, len)))
- goto BAILOUT;
- }
- if (rep->which & XkbKTLevelNamesMask) {
- CARD8 *nLevels;
- XkbClientMapPtr map = xkb->map;
-
- nLevels =
- (CARD8 *) _XkbGetReadBufferPtr(&buf, XkbPaddedSize(rep->nTypes));
- if (nLevels == NULL)
- goto BAILOUT;
- if (map != NULL) {
- XkbKeyTypePtr type = map->types;
-
- for (i = 0; i < (int) rep->nTypes; i++, type++) {
- if (i >= map->num_types) {
- if (!_XkbSkipReadBufferData(&buf, nLevels[i] * 4))
- goto BAILOUT;
- continue;
- }
- if ((nLevels[i] > 0) && (nLevels[i] != type->num_levels)) {
- goto BAILOUT;
- }
-
- Xfree(type->level_names);
- if (nLevels[i] == 0) {
- type->level_names = NULL;
- continue;
- }
- type->level_names = _XkbTypedCalloc(nLevels[i], Atom);
- if (type->level_names != NULL) {
- if (!_XkbReadBufferCopy32(&buf, (long *) type->level_names,
- nLevels[i]))
- goto BAILOUT;
- }
- else {
- _XkbSkipReadBufferData(&buf, nLevels[i] * 4);
- }
- }
- }
- else {
- for (i = 0; i < (int) rep->nTypes; i++) {
- _XkbSkipReadBufferData(&buf, nLevels[i] * 4);
- }
- }
- }
- if (rep->which & XkbIndicatorNamesMask) {
- if (_XkbReadAtoms(&buf, names->indicators, XkbNumIndicators,
- rep->indicators) != Success)
- goto BAILOUT;
- }
- if (rep->which & XkbVirtualModNamesMask) {
- if (_XkbReadAtoms(&buf, names->vmods, XkbNumVirtualMods,
- (CARD32) rep->virtualMods) != Success)
- goto BAILOUT;
- }
- if (rep->which & XkbGroupNamesMask) {
- if (_XkbReadAtoms(&buf, names->groups, XkbNumKbdGroups,
- (CARD32) rep->groupNames) != Success)
- goto BAILOUT;
- }
- if (rep->which & XkbKeyNamesMask) {
- if (names->keys == NULL) {
- int nKeys;
-
- if (xkb->max_key_code == 0) {
- xkb->min_key_code = rep->minKeyCode;
- xkb->max_key_code = rep->maxKeyCode;
- }
- nKeys = xkb->max_key_code + 1;
- names->keys = _XkbTypedCalloc(nKeys, XkbKeyNameRec);
- }
- if (((int) rep->firstKey + rep->nKeys) > xkb->max_key_code + 1)
- goto BAILOUT;
- if (names->keys != NULL) {
- if (!_XkbCopyFromReadBuffer(&buf,
- (char *) &names->keys[rep->firstKey],
- rep->nKeys * XkbKeyNameLength))
- goto BAILOUT;
- }
- else
- _XkbSkipReadBufferData(&buf, rep->nKeys * XkbKeyNameLength);
- }
- if (rep->which & XkbKeyAliasesMask && (rep->nKeyAliases > 0)) {
- if (XkbAllocNames(xkb, XkbKeyAliasesMask, 0, rep->nKeyAliases) !=
- Success)
- goto BAILOUT;
- if (!_XkbCopyFromReadBuffer(&buf, (char *) names->key_aliases,
- rep->nKeyAliases * XkbKeyNameLength * 2))
- goto BAILOUT;
- }
- if (rep->which & XkbRGNamesMask) {
- if (rep->nRadioGroups > 0) {
- Atom *rgNames;
-
- if (names->radio_groups == NULL)
- names->radio_groups = _XkbTypedCalloc(rep->nRadioGroups, Atom);
- else if (names->num_rg < rep->nRadioGroups) {
- names->radio_groups = _XkbTypedRealloc(names->radio_groups,
- rep->nRadioGroups, Atom);
- }
- rgNames = names->radio_groups;
- if (!rgNames) {
- goto BAILOUT;
- }
- if (!_XkbReadBufferCopy32
- (&buf, (long *) rgNames, rep->nRadioGroups))
- goto BAILOUT;
- names->num_rg = rep->nRadioGroups;
- }
- else if (names->num_rg > 0) {
- names->num_rg = 0;
- Xfree(names->radio_groups);
- }
- }
- len = _XkbFreeReadBuffer(&buf);
- if (len != 0)
- return BadLength;
- else
- return Success;
- BAILOUT:
- _XkbFreeReadBuffer(&buf);
- return BadLength;
-}
-
-Status
-XkbGetNames(Display *dpy, unsigned which, XkbDescPtr xkb)
-{
- register xkbGetNamesReq *req;
- xkbGetNamesReply rep;
- Status status;
- XkbInfoPtr xkbi;
-
- if ((dpy->flags & XlibDisplayNoXkb) ||
- (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL)))
- return BadAccess;
- LockDisplay(dpy);
- xkbi = dpy->xkb_info;
- if (!xkb->names) {
- xkb->names = _XkbTypedCalloc(1, XkbNamesRec);
- if (!xkb->names) {
- UnlockDisplay(dpy);
- SyncHandle();
- return BadAlloc;
- }
- }
- GetReq(kbGetNames, req);
- req->reqType = xkbi->codes->major_opcode;
- req->xkbReqType = X_kbGetNames;
- req->deviceSpec = xkb->device_spec;
- req->which = which;
- if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return BadImplementation;
- }
-
- status = _XkbReadGetNamesReply(dpy, &rep, xkb, NULL);
- UnlockDisplay(dpy);
- SyncHandle();
- return status;
-}
-
-/***====================================================================***/
-
-static int
-_XkbCountBits(int nBitsMax, unsigned long mask)
-{
- register unsigned long y, nBits;
-
- y = (mask >> 1) & 033333333333;
- y = mask - y - ((y >> 1) & 033333333333);
- nBits = ((unsigned int) (((y + (y >> 3)) & 030707070707) % 077));
-
- /* nBitsMax really means max+1 */
- return (nBits < nBitsMax) ? nBits : (nBitsMax - 1);
-}
-
-static CARD32
-_XkbCountAtoms(Atom *atoms, int maxAtoms, int *count)
-{
- register unsigned int i, bit, nAtoms;
- register CARD32 atomsPresent;
-
- for (i = nAtoms = atomsPresent = 0, bit = 1; i < maxAtoms; i++, bit <<= 1) {
- if (atoms[i] != None) {
- atomsPresent |= bit;
- nAtoms++;
- }
- }
- if (count)
- *count = nAtoms;
- return atomsPresent;
-}
-
-static void
-_XkbCopyAtoms(Display *dpy, Atom *atoms, CARD32 mask, int maxAtoms)
-{
- register unsigned int i, bit;
-
- for (i = 0, bit = 1; i < maxAtoms; i++, bit <<= 1) {
- if (mask & bit)
- Data32(dpy, &atoms[i], 4);
- }
- return;
-}
-
-Bool
-XkbSetNames(Display *dpy,
- unsigned int which,
- unsigned int firstType,
- unsigned int nTypes,
- XkbDescPtr xkb)
-{
- register xkbSetNamesReq *req;
- int nLvlNames = 0;
- XkbInfoPtr xkbi;
- XkbNamesPtr names;
- unsigned firstLvlType, nLvlTypes;
- int nVMods, nLEDs, nRG, nKA, nGroups;
- int nKeys = 0, firstKey = 0, nAtoms;
- CARD32 leds, vmods, groups;
-
- if ((dpy->flags & XlibDisplayNoXkb) ||
- (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL)))
- return False;
- if ((!xkb) || (!xkb->names))
- return False;
- firstLvlType = firstType;
- nLvlTypes = nTypes;
- if (nTypes < 1)
- which &= ~(XkbKTLevelNamesMask | XkbKeyTypeNamesMask);
- else if (firstType <= XkbLastRequiredType) {
- int adjust;
-
- adjust = XkbLastRequiredType - firstType + 1;
- firstType += adjust;
- nTypes -= adjust;
- if (nTypes < 1)
- which &= ~XkbKeyTypeNamesMask;
- }
- names = xkb->names;
- if (which & (XkbKTLevelNamesMask | XkbKeyTypeNamesMask)) {
- register int i;
- XkbKeyTypePtr type;
-
- if ((xkb->map == NULL) || (xkb->map->types == NULL) || (nTypes == 0) ||
- (firstType + nTypes > xkb->map->num_types) ||
- (firstLvlType + nLvlTypes > xkb->map->num_types))
- return False;
- if (which & XkbKTLevelNamesMask) {
- type = &xkb->map->types[firstLvlType];
- for (i = nLvlNames = 0; i < nLvlTypes; i++, type++) {
- if (type->level_names != NULL)
- nLvlNames += type->num_levels;
- }
- }
- }
-
- nVMods = nLEDs = nRG = nKA = nAtoms = nGroups = 0;
- LockDisplay(dpy);
- xkbi = dpy->xkb_info;
- GetReq(kbSetNames, req);
- req->reqType = xkbi->codes->major_opcode;
- req->xkbReqType = X_kbSetNames;
- req->deviceSpec = xkb->device_spec;
- req->firstType = firstType;
- req->nTypes = nTypes;
- req->firstKey = xkb->min_key_code;
- req->nKeys = xkb->max_key_code - xkb->min_key_code + 1;
-
- if (which & XkbKeycodesNameMask)
- nAtoms++;
- if (which & XkbGeometryNameMask)
- nAtoms++;
- if (which & XkbSymbolsNameMask)
- nAtoms++;
- if (which & XkbPhysSymbolsNameMask)
- nAtoms++;
- if (which & XkbTypesNameMask)
- nAtoms++;
- if (which & XkbCompatNameMask)
- nAtoms++;
- if (which & XkbKeyTypeNamesMask)
- nAtoms += nTypes;
- if (which & XkbKTLevelNamesMask) {
- req->firstKTLevel = firstLvlType;
- req->nKTLevels = nLvlTypes;
- req->length += XkbPaddedSize(nLvlTypes) / 4; /* room for group widths */
- nAtoms += nLvlNames;
- }
- else
- req->firstKTLevel = req->nKTLevels = 0;
-
- if (which & XkbIndicatorNamesMask) {
- req->indicators = leds =
- _XkbCountAtoms(names->indicators, XkbNumIndicators, &nLEDs);
- if (nLEDs > 0)
- nAtoms += nLEDs;
- else
- which &= ~XkbIndicatorNamesMask;
- }
- else
- req->indicators = leds = 0;
-
- if (which & XkbVirtualModNamesMask) {
- vmods = req->virtualMods = (CARD16)
- _XkbCountAtoms(names->vmods, XkbNumVirtualMods, &nVMods);
- if (nVMods > 0)
- nAtoms += nVMods;
- else
- which &= ~XkbVirtualModNamesMask;
- }
- else
- vmods = req->virtualMods = 0;
-
- if (which & XkbGroupNamesMask) {
- groups = req->groupNames = (CARD8)
- _XkbCountAtoms(names->groups, XkbNumKbdGroups, &nGroups);
- if (nGroups > 0)
- nAtoms += nGroups;
- else
- which &= ~XkbGroupNamesMask;
- }
- else
- groups = req->groupNames = 0;
-
- if ((which & XkbKeyNamesMask) && (names->keys != NULL)) {
- firstKey = req->firstKey;
- nKeys = req->nKeys;
- nAtoms += nKeys; /* technically not atoms, but 4 bytes wide */
- }
- else
- which &= ~XkbKeyNamesMask;
-
- if (which & XkbKeyAliasesMask) {
- nKA = ((names->key_aliases != NULL) ? names->num_key_aliases : 0);
- if (nKA > 0) {
- req->nKeyAliases = nKA;
- nAtoms += nKA * 2; /* not atoms, but 8 bytes on the wire */
- }
- else {
- which &= ~XkbKeyAliasesMask;
- req->nKeyAliases = 0;
- }
- }
- else
- req->nKeyAliases = 0;
-
- if (which & XkbRGNamesMask) {
- nRG = names->num_rg;
- if (nRG > 0)
- nAtoms += nRG;
- else
- which &= ~XkbRGNamesMask;
- }
-
- req->which = which;
- req->nRadioGroups = nRG;
- req->length += (nAtoms * 4) / 4;
-
- if (which & XkbKeycodesNameMask)
- Data32(dpy, (long *) &names->keycodes, 4);
- if (which & XkbGeometryNameMask)
- Data32(dpy, (long *) &names->geometry, 4);
- if (which & XkbSymbolsNameMask)
- Data32(dpy, (long *) &names->symbols, 4);
- if (which & XkbPhysSymbolsNameMask)
- Data32(dpy, (long *) &names->phys_symbols, 4);
- if (which & XkbTypesNameMask)
- Data32(dpy, (long *) &names->types, 4);
- if (which & XkbCompatNameMask)
- Data32(dpy, (long *) &names->compat, 4);
- if (which & XkbKeyTypeNamesMask) {
- register int i;
- register XkbKeyTypePtr type;
-
- type = &xkb->map->types[firstType];
- for (i = 0; i < nTypes; i++, type++) {
- Data32(dpy, (long *) &type->name, 4);
- }
- }
- if (which & XkbKTLevelNamesMask) {
- XkbKeyTypePtr type;
- int i;
- char *tmp;
-
- BufAlloc(char *, tmp, XkbPaddedSize(nLvlTypes));
- type = &xkb->map->types[firstLvlType];
- for (i = 0; i < nLvlTypes; i++, type++) {
- *tmp++ = type->num_levels;
- }
- type = &xkb->map->types[firstLvlType];
- for (i = 0; i < nLvlTypes; i++, type++) {
- if (type->level_names != NULL)
- Data32(dpy, (long *) type->level_names, type->num_levels * 4);
- }
- }
- if (which & XkbIndicatorNamesMask)
- _XkbCopyAtoms(dpy, names->indicators, leds, XkbNumIndicators);
- if (which & XkbVirtualModNamesMask)
- _XkbCopyAtoms(dpy, names->vmods, vmods, XkbNumVirtualMods);
- if (which & XkbGroupNamesMask)
- _XkbCopyAtoms(dpy, names->groups, groups, XkbNumKbdGroups);
- if (which & XkbKeyNamesMask) {
- Data(dpy, (char *) &names->keys[firstKey], nKeys * XkbKeyNameLength);
- }
- if (which & XkbKeyAliasesMask) {
- Data(dpy, (char *) names->key_aliases, nKA * XkbKeyNameLength * 2);
- }
- if (which & XkbRGNamesMask) {
- Data32(dpy, (long *) names->radio_groups, nRG * 4);
- }
- UnlockDisplay(dpy);
- SyncHandle();
- return True;
-}
-
-Bool
-XkbChangeNames(Display *dpy, XkbDescPtr xkb, XkbNameChangesPtr changes)
-{
- register xkbSetNamesReq *req;
- int nLvlNames = 0;
- XkbInfoPtr xkbi;
- XkbNamesPtr names;
- unsigned which, firstType, nTypes;
- unsigned firstLvlType, nLvlTypes;
- int nVMods, nLEDs, nRG, nKA, nGroups;
- int nKeys = 0, firstKey = 0, nAtoms;
- CARD32 leds = 0, vmods = 0, groups = 0;
-
- if ((dpy->flags & XlibDisplayNoXkb) ||
- (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL)))
- return False;
- if ((!xkb) || (!xkb->names) || (!changes))
- return False;
- which = changes->changed;
- firstType = changes->first_type;
- nTypes = changes->num_types;
- firstLvlType = changes->first_lvl;
- nLvlTypes = changes->num_lvls;
- if (which & XkbKeyTypeNamesMask) {
- if (nTypes < 1)
- which &= ~XkbKeyTypeNamesMask;
- else if (firstType <= XkbLastRequiredType) {
- int adjust;
-
- adjust = XkbLastRequiredType - firstType + 1;
- firstType += adjust;
- nTypes -= adjust;
- if (nTypes < 1)
- which &= ~XkbKeyTypeNamesMask;
- }
- }
- else
- firstType = nTypes = 0;
-
- if (which & XkbKTLevelNamesMask) {
- if (nLvlTypes < 1)
- which &= ~XkbKTLevelNamesMask;
- }
- else
- firstLvlType = nLvlTypes = 0;
-
- names = xkb->names;
- if (which & (XkbKTLevelNamesMask | XkbKeyTypeNamesMask)) {
- register int i;
-
- if ((xkb->map == NULL) || (xkb->map->types == NULL) || (nTypes == 0) ||
- (firstType + nTypes > xkb->map->num_types) ||
- (firstLvlType + nLvlTypes > xkb->map->num_types))
- return False;
- if (which & XkbKTLevelNamesMask) {
- XkbKeyTypePtr type = &xkb->map->types[firstLvlType];
-
- for (i = nLvlNames = 0; i < nLvlTypes; i++, type++) {
- if (type->level_names != NULL)
- nLvlNames += type->num_levels;
- }
- }
- }
-
- if (changes->num_keys < 1)
- which &= ~XkbKeyNamesMask;
- if ((which & XkbKeyNamesMask) == 0)
- changes->first_key = changes->num_keys = 0;
- else if ((changes->first_key < xkb->min_key_code) ||
- (changes->first_key + changes->num_keys > xkb->max_key_code)) {
- return False;
- }
-
- if ((which & XkbVirtualModNamesMask) == 0)
- changes->changed_vmods = 0;
- else if (changes->changed_vmods == 0)
- which &= ~XkbVirtualModNamesMask;
-
- if ((which & XkbIndicatorNamesMask) == 0)
- changes->changed_indicators = 0;
- else if (changes->changed_indicators == 0)
- which &= ~XkbIndicatorNamesMask;
-
- if ((which & XkbGroupNamesMask) == 0)
- changes->changed_groups = 0;
- else if (changes->changed_groups == 0)
- which &= ~XkbGroupNamesMask;
-
- nVMods = nLEDs = nRG = nKA = nAtoms = nGroups = 0;
- LockDisplay(dpy);
- xkbi = dpy->xkb_info;
- GetReq(kbSetNames, req);
- req->reqType = xkbi->codes->major_opcode;
- req->xkbReqType = X_kbSetNames;
- req->deviceSpec = xkb->device_spec;
- req->firstType = firstType;
- req->nTypes = nTypes;
- req->firstKey = changes->first_key;
- req->nKeys = changes->num_keys;
-
- if (which & XkbKeycodesNameMask)
- nAtoms++;
- if (which & XkbGeometryNameMask)
- nAtoms++;
- if (which & XkbSymbolsNameMask)
- nAtoms++;
- if (which & XkbPhysSymbolsNameMask)
- nAtoms++;
- if (which & XkbTypesNameMask)
- nAtoms++;
- if (which & XkbCompatNameMask)
- nAtoms++;
- if (which & XkbKeyTypeNamesMask)
- nAtoms += nTypes;
- if (which & XkbKTLevelNamesMask) {
- req->firstKTLevel = firstLvlType;
- req->nKTLevels = nLvlTypes;
- req->length += XkbPaddedSize(nLvlTypes) / 4; /* room for group widths */
- nAtoms += nLvlNames;
- }
- else
- req->firstKTLevel = req->nKTLevels = 0;
-
- if (which & XkbIndicatorNamesMask) {
- leds = req->indicators = (CARD32) changes->changed_indicators;
- nLEDs = _XkbCountBits(XkbNumIndicators, changes->changed_indicators);
- if (nLEDs > 0)
- nAtoms += nLEDs;
- else
- which &= ~XkbIndicatorNamesMask;
- }
- else
- req->indicators = 0;
-
- if (which & XkbVirtualModNamesMask) {
- vmods = req->virtualMods = changes->changed_vmods;
- nVMods = _XkbCountBits(XkbNumVirtualMods,
- (unsigned long) changes->changed_vmods);
- if (nVMods > 0)
- nAtoms += nVMods;
- else
- which &= ~XkbVirtualModNamesMask;
- }
- else
- req->virtualMods = 0;
-
- if (which & XkbGroupNamesMask) {
- groups = req->groupNames = changes->changed_groups;
- nGroups = _XkbCountBits(XkbNumKbdGroups,
- (unsigned long) changes->changed_groups);
- if (nGroups > 0)
- nAtoms += nGroups;
- else
- which &= ~XkbGroupNamesMask;
- }
- else
- req->groupNames = 0;
-
- if ((which & XkbKeyNamesMask) && (names->keys != NULL)) {
- firstKey = req->firstKey;
- nKeys = req->nKeys;
- nAtoms += nKeys; /* technically not atoms, but 4 bytes wide */
- }
- else
- which &= ~XkbKeyNamesMask;
-
- if (which & XkbKeyAliasesMask) {
- nKA = ((names->key_aliases != NULL) ? names->num_key_aliases : 0);
- if (nKA > 0)
- nAtoms += nKA * 2; /* not atoms, but 8 bytes on the wire */
- else
- which &= ~XkbKeyAliasesMask;
- }
-
- if (which & XkbRGNamesMask) {
- nRG = names->num_rg;
- if (nRG > 0)
- nAtoms += nRG;
- else
- which &= ~XkbRGNamesMask;
- }
-
- req->which = which;
- req->nRadioGroups = nRG;
- req->length += (nAtoms * 4) / 4;
-
- if (which & XkbKeycodesNameMask)
- Data32(dpy, (long *) &names->keycodes, 4);
- if (which & XkbGeometryNameMask)
- Data32(dpy, (long *) &names->geometry, 4);
- if (which & XkbSymbolsNameMask)
- Data32(dpy, (long *) &names->symbols, 4);
- if (which & XkbPhysSymbolsNameMask)
- Data32(dpy, (long *) &names->phys_symbols, 4);
- if (which & XkbTypesNameMask)
- Data32(dpy, (long *) &names->types, 4);
- if (which & XkbCompatNameMask)
- Data32(dpy, (long *) &names->compat, 4);
- if (which & XkbKeyTypeNamesMask) {
- register int i;
- register XkbKeyTypePtr type;
-
- type = &xkb->map->types[firstType];
- for (i = 0; i < nTypes; i++, type++) {
- Data32(dpy, (long *) &type->name, 4);
- }
- }
- if (which & XkbKTLevelNamesMask) {
- XkbKeyTypePtr type;
- int i;
- char *tmp;
-
- BufAlloc(char *, tmp, XkbPaddedSize(nLvlTypes));
- type = &xkb->map->types[firstLvlType];
- for (i = 0; i < nLvlTypes; i++, type++) {
- *tmp++ = type->num_levels;
- }
- type = &xkb->map->types[firstLvlType];
- for (i = 0; i < nLvlTypes; i++, type++) {
- if (type->level_names != NULL)
- Data32(dpy, (long *) type->level_names, type->num_levels * 4);
- }
- }
- if (which & XkbIndicatorNamesMask)
- _XkbCopyAtoms(dpy, names->indicators, leds, XkbNumIndicators);
- if (which & XkbVirtualModNamesMask)
- _XkbCopyAtoms(dpy, names->vmods, vmods, XkbNumVirtualMods);
- if (which & XkbGroupNamesMask)
- _XkbCopyAtoms(dpy, names->groups, groups, XkbNumKbdGroups);
- if (which & XkbKeyNamesMask) {
- Data(dpy, (char *) &names->keys[firstKey], nKeys * XkbKeyNameLength);
- }
- if (which & XkbKeyAliasesMask) {
- Data(dpy, (char *) names->key_aliases, nKA * XkbKeyNameLength * 2);
- }
- if (which & XkbRGNamesMask) {
- Data32(dpy, (long *) names->radio_groups, nRG * 4);
- }
- UnlockDisplay(dpy);
- SyncHandle();
- return True;
-}
-
-void
-XkbNoteNameChanges(XkbNameChangesPtr old,
- XkbNamesNotifyEvent *new,
- unsigned int wanted)
-{
- int first, last, old_last, new_last;
-
- if ((old == NULL) || (new == NULL))
- return;
-
- wanted &= new->changed;
-
- if (wanted == 0)
- return;
-
- if (wanted & XkbKeyTypeNamesMask) {
- if (old->changed & XkbKeyTypeNamesMask) {
- new_last = (new->first_type + new->num_types - 1);
- old_last = (old->first_type + old->num_types - 1);
-
- if (new->first_type < old->first_type)
- first = new->first_type;
- else
- first = old->first_type;
-
- if (old_last > new_last)
- last = old_last;
- else
- last = new_last;
-
- old->first_type = first;
- old->num_types = (last - first) + 1;
- }
- else {
- old->first_type = new->first_type;
- old->num_types = new->num_types;
- }
- }
- if (wanted & XkbKTLevelNamesMask) {
- if (old->changed & XkbKTLevelNamesMask) {
- new_last = (new->first_lvl + new->num_lvls - 1);
- old_last = (old->first_lvl + old->num_lvls - 1);
-
- if (new->first_lvl < old->first_lvl)
- first = new->first_lvl;
- else
- first = old->first_lvl;
-
- if (old_last > new_last)
- last = old_last;
- else
- last = new_last;
-
- old->first_lvl = first;
- old->num_lvls = (last - first) + 1;
- }
- else {
- old->first_lvl = new->first_lvl;
- old->num_lvls = new->num_lvls;
- }
- }
- if (wanted & XkbIndicatorNamesMask) {
- if (old->changed & XkbIndicatorNamesMask)
- old->changed_indicators |= new->changed_indicators;
- else
- old->changed_indicators = new->changed_indicators;
- }
- if (wanted & XkbKeyNamesMask) {
- if (old->changed & XkbKeyNamesMask) {
- new_last = (new->first_key + new->num_keys - 1);
- old_last = (old->first_key + old->num_keys - 1);
-
- first = old->first_key;
-
- if (new->first_key < old->first_key)
- first = new->first_key;
- if (old_last > new_last)
- new_last = old_last;
-
- old->first_key = first;
- old->num_keys = (new_last - first) + 1;
- }
- else {
- old->first_key = new->first_key;
- old->num_keys = new->num_keys;
- }
- }
- if (wanted & XkbVirtualModNamesMask) {
- if (old->changed & XkbVirtualModNamesMask)
- old->changed_vmods |= new->changed_vmods;
- else
- old->changed_vmods = new->changed_vmods;
- }
- if (wanted & XkbGroupNamesMask) {
- if (old->changed & XkbGroupNamesMask)
- old->changed_groups |= new->changed_groups;
- else
- old->changed_groups = new->changed_groups;
- }
- if (wanted & XkbRGNamesMask)
- old->num_rg = new->num_radio_groups;
- if (wanted & XkbKeyAliasesMask)
- old->num_aliases = new->num_aliases;
- old->changed |= wanted;
- return;
-}