[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:
parent
7fa3383e3c
commit
0eb7299f44
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user