[PATCH] XkbCopyKeymap: still more range fixes

Make sure we don't stomp preserve if it doesn't already exist, and fix a
couple of range-related thinkos in level name copying.
This commit is contained in:
Daniel Stone 2006-08-29 13:19:12 +03:00 committed by Daniel Stone
parent 7fa3383e3c
commit 0eb7299f44

View File

@ -1059,6 +1059,9 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
if (dst->map->types) { if (dst->map->types) {
tmp = xrealloc(dst->map->types, tmp = xrealloc(dst->map->types,
src->map->size_types * sizeof(XkbKeyTypeRec)); src->map->size_types * sizeof(XkbKeyTypeRec));
if (!tmp)
return FALSE;
dst->map->types = tmp;
bzero(dst->map->types + bzero(dst->map->types +
(dst->map->size_types * sizeof(XkbKeyTypeRec)), (dst->map->size_types * sizeof(XkbKeyTypeRec)),
(src->map->size_types - dst->map->size_types) * (src->map->size_types - dst->map->size_types) *
@ -1066,10 +1069,10 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
} }
else { else {
tmp = xcalloc(src->map->size_types, sizeof(XkbKeyTypeRec)); tmp = xcalloc(src->map->size_types, sizeof(XkbKeyTypeRec));
if (!tmp)
return FALSE;
dst->map->types = tmp;
} }
if (!tmp)
return FALSE;
dst->map->types = tmp;
} }
else if (src->map->size_types < dst->map->size_types) { else if (src->map->size_types < dst->map->size_types) {
if (dst->map->types) { if (dst->map->types) {
@ -1085,7 +1088,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
stype = src->map->types; stype = src->map->types;
dtype = dst->map->types; dtype = dst->map->types;
for (i = 0; i < dst->map->num_types; i++, dtype++, stype++) { for (i = 0; i < src->map->num_types; i++, dtype++, stype++) {
if (stype->num_levels != dtype->num_levels) { if (stype->num_levels != dtype->num_levels) {
if (dtype->level_names) if (dtype->level_names)
tmp = xrealloc(dtype->level_names, tmp = xrealloc(dtype->level_names,
@ -1105,41 +1108,69 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
dtype->name = stype->name; dtype->name = stype->name;
memcpy(&dtype->mods, &stype->mods, sizeof(XkbModsRec)); memcpy(&dtype->mods, &stype->mods, sizeof(XkbModsRec));
if (stype->map_count != dtype->map_count) { if (stype->map) {
if (dtype->map) if (dtype->map) {
tmp = xrealloc(dtype->map, if (stype->map_count != dtype->map_count) {
stype->map_count * tmp = xrealloc(dtype->map,
sizeof(XkbKTMapEntryRec)); stype->map_count *
else sizeof(XkbKTMapEntryRec));
if (!tmp)
return FALSE;
dtype->map = tmp;
}
}
else {
tmp = xalloc(stype->map_count * tmp = xalloc(stype->map_count *
sizeof(XkbKTMapEntryRec)); sizeof(XkbKTMapEntryRec));
if (!tmp) if (!tmp)
return FALSE; return FALSE;
dtype->map = tmp; dtype->map = tmp;
}
if (dtype->preserve) dtype->map_count = stype->map_count;
tmp = xrealloc(dtype->preserve, memcpy(dtype->map, stype->map, stype->map_count *
stype->map_count * sizeof(XkbModsRec));
else
tmp = xalloc(stype->map_count * sizeof(XkbModsRec));
if (!tmp)
return FALSE;
dtype->preserve = tmp;
}
dtype->map_count = stype->map_count;
memcpy(dtype->map, stype->map, stype->map_count *
sizeof(XkbKTMapEntryRec)); sizeof(XkbKTMapEntryRec));
memcpy(dtype->preserve, stype->preserve, stype->map_count * }
sizeof(XkbModsRec));
if (stype->preserve) {
if (dtype->preserve) {
if (stype->map_count != dtype->map_count) {
tmp = xrealloc(dtype->preserve,
stype->map_count *
sizeof(XkbModsRec));
if (!tmp)
return FALSE;
dtype->preserve = tmp;
}
}
else {
tmp = xalloc(stype->map_count * sizeof(XkbModsRec));
if (!tmp)
return FALSE;
dtype->preserve = tmp;
}
memcpy(dtype->preserve, stype->preserve,
stype->map_count * sizeof(XkbModsRec));
}
else {
if (dtype->preserve) {
xfree(dtype->preserve);
dtype->preserve = NULL;
}
}
} }
} }
else { else {
if (dst->map->types) { if (dst->map->types) {
for (i = 0, dtype = dst->map->types; i < dst->map->num_types; for (i = 0, dtype = dst->map->types; i < dst->map->num_types;
i++, dtype++) { i++, dtype++) {
xfree(dtype->level_names); if (dtype->level_names)
xfree(dtype->map); xfree(dtype->level_names);
xfree(dtype->preserve); if (dtype->map)
xfree(dtype->map);
if (dtype->preserve)
xfree(dtype->preserve);
} }
xfree(dst->map->types); xfree(dst->map->types);
dst->map->types = NULL; dst->map->types = NULL;
@ -1490,8 +1521,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
else { else {
/* send NewKeyboardNotify if the keycode range changed, else /* send NewKeyboardNotify if the keycode range changed, else
* just MapNotify. */ * just MapNotify. */
if (src->min_key_code != dst->min_key_code || if ((src->min_key_code != dst->min_key_code ||
src->max_key_code != dst->max_key_code && sendNotifies) { src->max_key_code != dst->max_key_code) && sendNotifies) {
nkn.oldMinKeyCode = dst->min_key_code; nkn.oldMinKeyCode = dst->min_key_code;
nkn.oldMaxKeyCode = dst->max_key_code; nkn.oldMaxKeyCode = dst->max_key_code;
nkn.deviceID = nkn.oldDeviceID = pDev->id; nkn.deviceID = nkn.oldDeviceID = pDev->id;