xkb: Release XKB component names when compiling keymap.

Reviewed-by: Erkki Seppälä <erkki.seppala@vincit.fi>
Signed-off-by: Rami Ylimäki <rami.ylimaki@vincit.fi>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Rami Ylimäki 2011-03-11 14:30:49 +02:00 committed by Peter Hutterer
parent 6f46ae3c69
commit 5c47f8beac
4 changed files with 36 additions and 21 deletions

View File

@ -447,6 +447,11 @@ extern _X_EXPORT void XkbFreeKeyboard(
Bool /* freeDesc */ Bool /* freeDesc */
); );
extern _X_EXPORT void XkbFreeComponentNames(
XkbComponentNamesPtr /* names */,
Bool /* freeNames */
);
extern _X_EXPORT void XkbSetActionKeyMods( extern _X_EXPORT void XkbSetActionKeyMods(
XkbDescPtr /* xkb */, XkbDescPtr /* xkb */,
XkbAction * /* act */, XkbAction * /* act */,

View File

@ -333,3 +333,22 @@ XkbFreeKeyboard(XkbDescPtr xkb,unsigned which,Bool freeAll)
free(xkb); free(xkb);
return; return;
} }
/***====================================================================***/
void
XkbFreeComponentNames(XkbComponentNamesPtr names, Bool freeNames)
{
if (names)
{
free(names->keycodes);
free(names->types);
free(names->compat);
free(names->symbols);
free(names->geometry);
memset(names, 0, sizeof(XkbComponentNamesRec));
}
if (freeNames)
free(names);
}

View File

@ -447,23 +447,23 @@ XkbRMLVOtoKcCGST(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, XkbComponentNamesPtr kccg
static XkbDescPtr static XkbDescPtr
XkbCompileKeymapForDevice(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, int need) XkbCompileKeymapForDevice(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, int need)
{ {
XkbDescPtr xkb; XkbDescPtr xkb = NULL;
unsigned int provided; unsigned int provided;
XkbComponentNamesRec kccgst; XkbComponentNamesRec kccgst = {0};
char name[PATH_MAX]; char name[PATH_MAX];
if (!XkbRMLVOtoKcCGST(dev, rmlvo, &kccgst)) if (XkbRMLVOtoKcCGST(dev, rmlvo, &kccgst)) {
return NULL; provided = XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, need,
&xkb, name, PATH_MAX);
provided = XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, need, if ((need & provided) != need) {
&xkb, name, PATH_MAX); if (xkb) {
if ((need & provided) != need) { XkbFreeKeyboard(xkb, 0, TRUE);
if (xkb) { xkb = NULL;
XkbFreeKeyboard(xkb, 0, TRUE); }
xkb = NULL;
} }
} }
XkbFreeComponentNames(&kccgst, FALSE);
return xkb; return xkb;
} }

View File

@ -5895,16 +5895,7 @@ ProcXkbGetKbdByName(ClientPtr client)
XkbFreeKeyboard(new,XkbAllComponentsMask,TRUE); XkbFreeKeyboard(new,XkbAllComponentsMask,TRUE);
new= NULL; new= NULL;
} }
free(names.keycodes); XkbFreeComponentNames(&names, FALSE);
names.keycodes = NULL;
free(names.types);
names.types = NULL;
free(names.compat);
names.compat = NULL;
free(names.symbols);
names.symbols = NULL;
free(names.geometry);
names.geometry = NULL;
return Success; return Success;
} }