Introduce xkb_keycode_t for keycodes
[platform/upstream/libxkbcommon.git] / src / xkbcomp / geometry.c
index 92717d6..7dde6f8 100644 (file)
@@ -25,6 +25,9 @@
  ********************************************************/
 
 #include "xkbcomp.h"
+#include "xkballoc.h"
+#include "xkbgeom.h"
+#include "xkbmisc.h"
 #include "tokens.h"
 #include "expr.h"
 #include "vmod.h"
@@ -34,8 +37,6 @@
 #include "keycodes.h"
 #include "alias.h"
 
-#include <X11/extensions/XKBgeomcommon.h>
-
 #define        DFLT_FONT       "helvetica"
 #define        DFLT_SLANT      "r"
 #define        DFLT_WEIGHT     "medium"
@@ -57,13 +58,13 @@ typedef struct _PropertyInfo
 typedef struct _ShapeInfo
 {
     CommonInfo defs;
-    Atom name;
+    uint32_t name;
     short index;
     unsigned short nOutlines;
     unsigned short szOutlines;
-    XkbOutlinePtr outlines;
-    XkbOutlinePtr approx;
-    XkbOutlinePtr primary;
+    struct xkb_outline * outlines;
+    struct xkb_outline * approx;
+    struct xkb_outline * primary;
     int dfltCornerRadius;
 } ShapeInfo;
 
@@ -96,7 +97,7 @@ typedef struct _ShapeInfo
 typedef struct _DoodadInfo
 {
     CommonInfo defs;
-    Atom name;
+    uint32_t name;
     unsigned char type;
     unsigned char priority;
     short top;
@@ -105,18 +106,18 @@ typedef struct _DoodadInfo
     unsigned short corner;
     unsigned short width;
     unsigned short height;
-    Atom shape;
-    Atom color;
-    Atom offColor;
-    Atom text;
-    Atom font;
-    Atom fontSlant;
-    Atom fontWeight;
-    Atom fontSetWidth;
-    Atom fontVariant;
+    uint32_t shape;
+    uint32_t color;
+    uint32_t offColor;
+    uint32_t text;
+    uint32_t font;
+    uint32_t fontSlant;
+    uint32_t fontWeight;
+    uint32_t fontSetWidth;
+    uint32_t fontVariant;
     unsigned short fontSize;
-    Atom fontEncoding;
-    Atom fontSpec;
+    uint32_t fontEncoding;
+    uint32_t fontSpec;
     char *logoName;
     struct _SectionInfo *section;
 } DoodadInfo;
@@ -136,8 +137,8 @@ typedef struct _KeyInfo
     char name[8];
     short gap;
     short index;
-    Atom shape;
-    Atom color;
+    uint32_t shape;
+    uint32_t color;
     struct _RowInfo *row;
 } KeyInfo;
 #define        keyText(k)      ((k)&&(k)->name[0]?(k)->name:"default")
@@ -174,7 +175,7 @@ typedef struct _OverlayKeyInfo
 typedef struct _OverlayInfo
 {
     CommonInfo defs;
-    Atom name;
+    uint32_t name;
     unsigned short nRows;
     unsigned short nKeys;
     OverlayKeyInfo *keys;
@@ -194,7 +195,7 @@ typedef struct _OverlayInfo
 typedef struct _SectionInfo
 {
     CommonInfo defs;
-    Atom name;
+    uint32_t name;
     unsigned short top;
     unsigned short left;
     unsigned short width;
@@ -232,23 +233,23 @@ typedef struct _GeometryInfo
     DoodadInfo *doodads;
     int widthMM;
     int heightMM;
-    Atom font;
-    Atom fontSlant;
-    Atom fontWeight;
-    Atom fontSetWidth;
-    Atom fontVariant;
+    uint32_t font;
+    uint32_t fontSlant;
+    uint32_t fontWeight;
+    uint32_t fontSetWidth;
+    uint32_t fontVariant;
     unsigned fontSize;
-    Atom fontEncoding;
-    Atom fontSpec;
-    Atom baseColor;
-    Atom labelColor;
+    uint32_t fontEncoding;
+    uint32_t fontSpec;
+    uint32_t baseColor;
+    uint32_t labelColor;
     int dfltCornerRadius;
     SectionInfo dfltSection;
     DoodadInfo *dfltDoodads;
     AliasInfo *aliases;
 } GeometryInfo;
 
-static char *
+static const char *
 ddText(DoodadInfo * di)
 {
     static char buf[64];
@@ -293,12 +294,12 @@ FreeProperties(PropertyInfo * pi, GeometryInfo * info)
     for (tmp = pi; tmp != NULL; tmp = next)
     {
         if (tmp->name)
-            uFree(tmp->name);
+            free(tmp->name);
         if (tmp->value)
-            uFree(tmp->value);
+            free(tmp->value);
         tmp->name = tmp->value = NULL;
         next = (PropertyInfo *) tmp->defs.next;
-        uFree(tmp);
+        free(tmp);
     }
     return;
 }
@@ -352,7 +353,7 @@ FreeKeys(KeyInfo * key, RowInfo * row, GeometryInfo * info)
     {
         ClearKeyInfo(tmp);
         next = (KeyInfo *) tmp->defs.next;
-        uFree(tmp);
+        free(tmp);
     }
     return;
 }
@@ -409,7 +410,7 @@ FreeRows(RowInfo * row, SectionInfo * section, GeometryInfo * info)
     {
         ClearRowInfo(tmp, info);
         next = (RowInfo *) tmp->defs.next;
-        uFree(tmp);
+        free(tmp);
     }
     return;
 }
@@ -427,7 +428,7 @@ FindDoodadByType(DoodadInfo * di, unsigned type)
 }
 
 static DoodadInfo *
-FindDoodadByName(DoodadInfo * di, Atom name)
+FindDoodadByName(DoodadInfo * di, uint32_t name)
 {
     while (di)
     {
@@ -528,7 +529,7 @@ FreeDoodads(DoodadInfo * di, SectionInfo * si, GeometryInfo * info)
     {
         next = (DoodadInfo *) tmp->defs.next;
         ClearDoodadInfo(tmp);
-        uFree(tmp);
+        free(tmp);
     }
     return;
 }
@@ -540,7 +541,7 @@ InitSectionInfo(SectionInfo * si, GeometryInfo * info)
     {
         *si = info->dfltSection;
         si->defs.defined &= ~_GS_Default;
-        si->name = XkbcInternAtom("unknown", False);
+        si->name = xkb_intern_atom("unknown");
         si->priority = info->nextPriority++;
         if (info->nextPriority > XkbGeomMaxPriority)
             info->nextPriority = XkbGeomMaxPriority;
@@ -552,7 +553,7 @@ InitSectionInfo(SectionInfo * si, GeometryInfo * info)
         si->defs.merge = info->merge;
         si->defs.next = NULL;
         si->geometry = info;
-        si->name = XkbcInternAtom("default", False);
+        si->name = xkb_intern_atom("default");
         InitRowInfo(&si->dfltRow, si, info);
     }
     return;
@@ -584,7 +585,7 @@ ClearSectionInfo(SectionInfo * si, GeometryInfo * info)
 {
 
     si->defs.defined &= ~_GS_Default;
-    si->name = XkbcInternAtom("default", False);
+    si->name = xkb_intern_atom("default");
     si->top = si->left = 0;
     si->width = si->height = 0;
     si->angle = 0;
@@ -618,7 +619,7 @@ FreeSections(SectionInfo * si, GeometryInfo * info)
     {
         ClearSectionInfo(tmp, info);
         next = (SectionInfo *) tmp->defs.next;
-        uFree(tmp);
+        free(tmp);
     }
     return;
 }
@@ -643,19 +644,19 @@ FreeShapes(ShapeInfo * si, GeometryInfo * info)
             {
                 if (tmp->outlines[i].points != NULL)
                 {
-                    uFree(tmp->outlines[i].points);
+                    free(tmp->outlines[i].points);
                     tmp->outlines[i].num_points = 0;
                     tmp->outlines[i].points = NULL;
                 }
             }
-            uFree(tmp->outlines);
+            free(tmp->outlines);
             tmp->szOutlines = 0;
             tmp->nOutlines = 0;
             tmp->outlines = NULL;
             tmp->primary = tmp->approx = NULL;
         }
         next = (ShapeInfo *) tmp->defs.next;
-        uFree(tmp);
+        free(tmp);
     }
     return;
 }
@@ -677,7 +678,7 @@ static void
 ClearGeometryInfo(GeometryInfo * info)
 {
     if (info->name)
-        uFree(info->name);
+        free(info->name);
     info->name = NULL;
     if (info->props)
         FreeProperties(info->props, info);
@@ -751,7 +752,7 @@ AddProperty(GeometryInfo * info, PropertyInfo * new)
                         new->value);
             }
             if (old->value)
-                uFree(old->value);
+                free(old->value);
             old->value = _XkbDupString(new->value);
             return True;
         }
@@ -793,7 +794,7 @@ NextShape(GeometryInfo * info)
 }
 
 static ShapeInfo *
-FindShape(GeometryInfo * info, Atom name, const char *type, const char *which)
+FindShape(GeometryInfo * info, uint32_t name, const char *type, const char *which)
 {
     ShapeInfo *old;
 
@@ -968,7 +969,7 @@ AddDoodad(SectionInfo * si, GeometryInfo * info, DoodadInfo * new)
 static DoodadInfo *
 FindDfltDoodadByTypeName(char *name, SectionInfo * si, GeometryInfo * info)
 {
-    DoodadInfo *dflt;
+    DoodadInfo *dflt = NULL;
     unsigned type;
 
     if (uStrCaseCmp(name, "outline") == 0)
@@ -985,8 +986,6 @@ FindDfltDoodadByTypeName(char *name, SectionInfo * si, GeometryInfo * info)
         return NULL;
     if ((si) && (si->dfltDoodads))
         dflt = FindDoodadByType(si->dfltDoodads, type);
-    else
-        dflt = NULL;
     if ((!dflt) && (info->dfltDoodads))
         dflt = FindDoodadByType(info->dfltDoodads, type);
     if (dflt == NULL)
@@ -1318,13 +1317,13 @@ MergeIncludedGeometry(GeometryInfo * into, GeometryInfo * from,
 }
 
 typedef void (*FileHandler) (XkbFile * /* file */ ,
-                             XkbcDescPtr /* xkb */ ,
+                             struct xkb_desc * /* xkb */ ,
                              unsigned /* merge */ ,
                              GeometryInfo *     /* info */
     );
 
 static Bool
-HandleIncludeGeometry(IncludeStmt * stmt, XkbcDescPtr xkb, GeometryInfo * info,
+HandleIncludeGeometry(IncludeStmt * stmt, struct xkb_desc * xkb, GeometryInfo * info,
                       FileHandler hndlr)
 {
     unsigned newMerge;
@@ -1349,7 +1348,7 @@ HandleIncludeGeometry(IncludeStmt * stmt, XkbcDescPtr xkb, GeometryInfo * info,
         if (stmt->stmt != NULL)
         {
             if (included.name != NULL)
-                uFree(included.name);
+                free(included.name);
             included.name = stmt->stmt;
             stmt->stmt = NULL;
         }
@@ -1403,7 +1402,7 @@ HandleIncludeGeometry(IncludeStmt * stmt, XkbcDescPtr xkb, GeometryInfo * info,
 
 static int
 SetShapeField(ShapeInfo * si,
-              char *field,
+              const char *field,
               ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info)
 {
     ExprResult tmp;
@@ -1488,7 +1487,7 @@ SetShapeDoodadField(DoodadInfo * di,
             info->errorCount++;
             return ReportBadType(typeName, field, ddText(di), "string");
         }
-        di->shape = XkbcInternAtom(tmp.str, False);
+        di->shape = xkb_intern_atom(tmp.str);
         di->defs.defined |= _GD_Shape;
         return True;
     }
@@ -1511,7 +1510,7 @@ SetTextDoodadField(DoodadInfo * di,
     char *typeName = "text doodad";
     union
     {
-        Atom *str;
+        uint32_t *str;
         short *ival;
         unsigned short *uval;
     } pField;
@@ -1621,7 +1620,7 @@ SetTextDoodadField(DoodadInfo * di,
             return ReportBadType(typeName, field, ddText(di), "string");
         }
         di->defs.defined |= def;
-        *pField.str = XkbcInternAtom(tmp.str, False);
+        *pField.str = xkb_intern_atom(tmp.str);
     }
     else
     {
@@ -1672,17 +1671,17 @@ SetIndicatorDoodadField(DoodadInfo * di,
         if (uStrCaseCmp(field, "oncolor") == 0)
         {
             di->defs.defined |= _GD_Color;
-            di->color = XkbcInternAtom(tmp.str, False);
+            di->color = xkb_intern_atom(tmp.str);
         }
         else if (uStrCaseCmp(field, "offcolor") == 0)
         {
             di->defs.defined |= _GD_OffColor;
-            di->offColor = XkbcInternAtom(tmp.str, False);
+            di->offColor = xkb_intern_atom(tmp.str);
         }
         else if (uStrCaseCmp(field, "shape") == 0)
         {
             di->defs.defined |= _GD_Shape;
-            di->shape = XkbcInternAtom(tmp.str, False);
+            di->shape = xkb_intern_atom(tmp.str);
         }
         return True;
     }
@@ -1743,7 +1742,7 @@ SetLogoDoodadField(DoodadInfo * di,
             info->errorCount++;
             return ReportBadType(typeName, field, ddText(di), "string");
         }
-        di->shape = XkbcInternAtom(tmp.str, False);
+        di->shape = xkb_intern_atom(tmp.str);
         di->defs.defined |= _GD_Shape;
         return True;
     }
@@ -1844,7 +1843,8 @@ SetDoodadField(DoodadInfo * di,
             return ReportBadType("doodad", field, ddText(di), "string");
         }
         di->defs.defined |= _GD_Color;
-        di->color = XkbcInternAtom(tmp.str, False);
+        di->color = xkb_intern_atom(tmp.str);
+        free(tmp.str);
         return True;
     }
     switch (di->type)
@@ -2045,7 +2045,8 @@ SetKeyField(KeyInfo * key,
             return ReportBadType("key", field, keyText(key), "string");
         }
         key->defs.defined |= _GK_Shape;
-        key->shape = XkbcInternAtom(tmp.str, False);
+        key->shape = xkb_intern_atom(tmp.str);
+        free(tmp.str);
     }
     else if ((uStrCaseCmp(field, "color") == 0) ||
              (uStrCaseCmp(field, "keycolor") == 0))
@@ -2061,7 +2062,8 @@ SetKeyField(KeyInfo * key,
             return ReportBadType("key", field, keyText(key), "string");
         }
         key->defs.defined |= _GK_Color;
-        key->color = XkbcInternAtom(tmp.str, False);
+        key->color = xkb_intern_atom(tmp.str);
+        free(tmp.str);
     }
     else if ((uStrCaseCmp(field, "name") == 0)
              || (uStrCaseCmp(field, "keyname") == 0))
@@ -2093,6 +2095,7 @@ SetGeometryProperty(GeometryInfo * info, char *property, ExprDef * value)
 {
     PropertyInfo pi;
     ExprResult result;
+    int ret;
 
     InitPropertyInfo(&pi, info);
     pi.name = property;
@@ -2104,93 +2107,99 @@ SetGeometryProperty(GeometryInfo * info, char *property, ExprDef * value)
         return False;
     }
     pi.value = result.str;
-    return AddProperty(info, &pi);
+    ret = AddProperty(info, &pi);
+    free(pi.value);
+    return ret;
 }
 
 static int
-HandleGeometryVar(VarDef * stmt, XkbcDescPtr xkb, GeometryInfo * info)
+HandleGeometryVar(VarDef * stmt, struct xkb_desc * xkb, GeometryInfo * info)
 {
     ExprResult elem, field, tmp;
     ExprDef *ndx;
     DoodadInfo *di;
-    Atom *pField;
+    uint32_t *pField = NULL;
+    int ret = True; /* default to no error */
 
     if (ExprResolveLhs(stmt->name, &elem, &field, &ndx) == 0)
         return 0;               /* internal error, already reported */
-    if (elem.str && (uStrCaseCmp(elem.str, "shape") == 0))
-        return SetShapeField(NULL, field.str, ndx, stmt->value, info);
-    if (elem.str && (uStrCaseCmp(elem.str, "key") == 0))
-        return SetKeyField(&info->dfltSection.dfltRow.dfltKey,
-                           field.str, ndx, stmt->value, info);
-    if (elem.str && (uStrCaseCmp(elem.str, "row") == 0))
-        return SetRowField(&info->dfltSection.dfltRow, field.str, ndx,
-                           stmt->value, info);
-    if (elem.str && (uStrCaseCmp(elem.str, "section") == 0))
-    {
-        return SetSectionField(&info->dfltSection, field.str, ndx,
+
+    if (elem.str) {
+        if (uStrCaseCmp(elem.str, "shape") == 0)
+            ret = SetShapeField(NULL, field.str, ndx, stmt->value, info);
+        else if (uStrCaseCmp(elem.str, "key") == 0)
+            ret = SetKeyField(&info->dfltSection.dfltRow.dfltKey,
+                               field.str, ndx, stmt->value, info);
+        else if (uStrCaseCmp(elem.str, "row") == 0)
+            ret = SetRowField(&info->dfltSection.dfltRow, field.str, ndx,
                                stmt->value, info);
-    }
-    if (elem.str && (uStrCaseCmp(elem.str, "property") == 0))
-    {
-        if (ndx != NULL)
+        else if (uStrCaseCmp(elem.str, "section") == 0)
+            ret = SetSectionField(&info->dfltSection, field.str, ndx,
+                                   stmt->value, info);
+        else if (uStrCaseCmp(elem.str, "property") == 0)
         {
-            info->errorCount++;
-            ERROR("The %s geometry property is not an array\n", field.str);
-            ACTION("Ignoring illegal property definition\n");
-            return False;
+            if (ndx != NULL)
+            {
+                info->errorCount++;
+                ERROR("The %s geometry property is not an array\n", field.str);
+                ACTION("Ignoring illegal property definition\n");
+                ret = False;
+            }
+            else {
+                ret = SetGeometryProperty(info, field.str, stmt->value);
+            }
         }
-        return SetGeometryProperty(info, field.str, stmt->value);
-    }
-    if (elem.str
-        && ((di = FindDfltDoodadByTypeName(elem.str, NULL, info)) != NULL))
-    {
-        return SetDoodadField(di, field.str, ndx, stmt->value, NULL, info);
-    }
-    if (elem.str && (uStrCaseCmp(elem.str, "solid") == 0))
-    {
-        DoodadInfo *dflt;
-        dflt = FindDoodadByType(info->dfltDoodads, XkbSolidDoodad);
-        if (dflt == NULL)
-            dflt = NextDfltDoodad(NULL, info);
-        return SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
-    }
-    if (elem.str && (uStrCaseCmp(elem.str, "outline") == 0))
-    {
-        DoodadInfo *dflt;
-        dflt = FindDoodadByType(info->dfltDoodads, XkbOutlineDoodad);
-        if (dflt == NULL)
-            dflt = NextDfltDoodad(NULL, info);
-        return SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
-    }
-    if (elem.str && (uStrCaseCmp(elem.str, "text") == 0))
-    {
-        DoodadInfo *dflt;
-        dflt = FindDoodadByType(info->dfltDoodads, XkbTextDoodad);
-        if (dflt == NULL)
-            dflt = NextDfltDoodad(NULL, info);
-        return SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
-    }
-    if (elem.str && (uStrCaseCmp(elem.str, "indicator") == 0))
-    {
-        DoodadInfo *dflt;
-        dflt = FindDoodadByType(info->dfltDoodads, XkbIndicatorDoodad);
-        if (dflt == NULL)
-            dflt = NextDfltDoodad(NULL, info);
-        return SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
-    }
-    if (elem.str && (uStrCaseCmp(elem.str, "logo") == 0))
-    {
-        DoodadInfo *dflt;
-        dflt = FindDoodadByType(info->dfltDoodads, XkbLogoDoodad);
-        if (dflt == NULL)
-            dflt = NextDfltDoodad(NULL, info);
-        return SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
-    }
-    if (elem.str)
-    {
-        WARN("Assignment to field of unknown element\n");
-        ACTION("No value assigned to %s.%s\n", elem.str, field.str);
-        return False;
+        else if ((di = FindDfltDoodadByTypeName(elem.str, NULL, info)) != NULL)
+            ret = SetDoodadField(di, field.str, ndx, stmt->value, NULL, info);
+        else if (uStrCaseCmp(elem.str, "solid") == 0)
+        {
+            DoodadInfo *dflt;
+            dflt = FindDoodadByType(info->dfltDoodads, XkbSolidDoodad);
+            if (dflt == NULL)
+                dflt = NextDfltDoodad(NULL, info);
+            ret = SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
+        }
+        else if (uStrCaseCmp(elem.str, "outline") == 0)
+        {
+            DoodadInfo *dflt;
+            dflt = FindDoodadByType(info->dfltDoodads, XkbOutlineDoodad);
+            if (dflt == NULL)
+                dflt = NextDfltDoodad(NULL, info);
+            ret = SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
+        }
+        else if (uStrCaseCmp(elem.str, "text") == 0)
+        {
+            DoodadInfo *dflt;
+            dflt = FindDoodadByType(info->dfltDoodads, XkbTextDoodad);
+            if (dflt == NULL)
+                dflt = NextDfltDoodad(NULL, info);
+            ret = SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
+        }
+        else if (uStrCaseCmp(elem.str, "indicator") == 0)
+        {
+            DoodadInfo *dflt;
+            dflt = FindDoodadByType(info->dfltDoodads, XkbIndicatorDoodad);
+            if (dflt == NULL)
+                dflt = NextDfltDoodad(NULL, info);
+            ret = SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
+        }
+        else if (uStrCaseCmp(elem.str, "logo") == 0)
+        {
+            DoodadInfo *dflt;
+            dflt = FindDoodadByType(info->dfltDoodads, XkbLogoDoodad);
+            if (dflt == NULL)
+                dflt = NextDfltDoodad(NULL, info);
+            ret = SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
+        }
+        else
+        {
+            WARN("Assignment to field of unknown element\n");
+            ACTION("No value assigned to %s.%s\n", elem.str, field.str);
+            ret = False;
+        }
+        free(elem.str);
+        free(field.str);
+        return ret;
     }
 
     if ((uStrCaseCmp(field.str, "width") == 0) ||
@@ -2199,28 +2208,32 @@ HandleGeometryVar(VarDef * stmt, XkbcDescPtr xkb, GeometryInfo * info)
         if (ndx != NULL)
         {
             info->errorCount++;
-            return ReportNotArray("keyboard", field.str, "geometry");
+            ret = ReportNotArray("keyboard", field.str, "geometry");
         }
-        if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
+        else if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
         {
             info->errorCount++;
-            return ReportBadType("keyboard", field.str, "geometry", "number");
+            ret = ReportBadType("keyboard", field.str, "geometry", "number");
         }
-        if (tmp.ival < 1)
+        else if (tmp.ival < 1)
         {
             WARN("Keyboard width must be positive\n");
             ACTION("Ignoring illegal keyboard width %s\n",
                     XkbcGeomFPText(tmp.ival));
-            return True;
+            ret = True;
         }
-        if (info->widthMM != 0)
-        {
-            WARN("Keyboard width multiply defined\n");
-            ACTION("Using last definition (%s),", XkbcGeomFPText(tmp.ival));
-            INFO(" ignoring first (%s)\n", XkbcGeomFPText(info->widthMM));
+        else {
+            if (info->widthMM != 0)
+            {
+                WARN("Keyboard width multiply defined\n");
+                ACTION("Using last definition (%s),", XkbcGeomFPText(tmp.ival));
+                INFO(" ignoring first (%s)\n", XkbcGeomFPText(info->widthMM));
+            }
+            info->widthMM = tmp.ival;
+            ret = True;
         }
-        info->widthMM = tmp.ival;
-        return True;
+        free(field.str);
+        return ret;
     }
     else if ((uStrCaseCmp(field.str, "height") == 0) ||
              (uStrCaseCmp(field.str, "heightmm") == 0))
@@ -2228,79 +2241,58 @@ HandleGeometryVar(VarDef * stmt, XkbcDescPtr xkb, GeometryInfo * info)
         if (ndx != NULL)
         {
             info->errorCount++;
-            return ReportNotArray("keyboard", field.str, "geometry");
+            ret = ReportNotArray("keyboard", field.str, "geometry");
         }
         if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
         {
             info->errorCount++;
-            return ReportBadType("keyboard", field.str, "geometry", "number");
+            ret = ReportBadType("keyboard", field.str, "geometry", "number");
         }
         if (tmp.ival < 1)
         {
             WARN("Keyboard height must be positive\n");
             ACTION("Ignoring illegal keyboard height %s\n",
                     XkbcGeomFPText(tmp.ival));
-            return True;
+            ret = True;
         }
-        if (info->heightMM != 0)
-        {
-            WARN("Keyboard height multiply defined\n");
-            ACTION("Using last definition (%s),", XkbcGeomFPText(tmp.ival));
-            INFO(" ignoring first (%s)\n", XkbcGeomFPText(info->heightMM));
+        else {
+            if (info->heightMM != 0)
+            {
+                WARN("Keyboard height multiply defined\n");
+                ACTION("Using last definition (%s),", XkbcGeomFPText(tmp.ival));
+                INFO(" ignoring first (%s)\n", XkbcGeomFPText(info->heightMM));
+            }
+            info->heightMM = tmp.ival;
+            ret = True;
         }
-        info->heightMM = tmp.ival;
-        return True;
-    }
-    else if (uStrCaseCmp(field.str, "font") == 0)
-    {
-        pField = &info->font;
-    }
-    else if ((uStrCaseCmp(field.str, "fontslant") == 0) ||
-             (uStrCaseCmp(field.str, "slant") == 0))
-    {
-        pField = &info->fontSlant;
-    }
-    else if ((uStrCaseCmp(field.str, "fontweight") == 0) ||
-             (uStrCaseCmp(field.str, "weight") == 0))
-    {
-        pField = &info->fontWeight;
-    }
-    else if ((uStrCaseCmp(field.str, "fontwidth") == 0) ||
-             (uStrCaseCmp(field.str, "setwidth") == 0))
-    {
-        pField = &info->fontWeight;
-    }
-    else if ((uStrCaseCmp(field.str, "fontencoding") == 0) ||
-             (uStrCaseCmp(field.str, "encoding") == 0))
-    {
-        pField = &info->fontEncoding;
-    }
-    else if ((uStrCaseCmp(field.str, "xfont") == 0) ||
-             (uStrCaseCmp(field.str, "xfontname") == 0))
-    {
-        pField = &info->fontSpec;
+        free(field.str);
+        return ret;
     }
     else if (uStrCaseCmp(field.str, "fontsize") == 0)
     {
         if (ndx != NULL)
         {
             info->errorCount++;
-            return ReportNotArray("keyboard", field.str, "geometry");
+            ret = ReportNotArray("keyboard", field.str, "geometry");
         }
-        if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
+        else if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
         {
             info->errorCount++;
-            return ReportBadType("keyboard", field.str, "geometry", "number");
+            ret = ReportBadType("keyboard", field.str, "geometry", "number");
         }
-        if ((tmp.ival < 40) || (tmp.ival > 2550))
+        else if ((tmp.ival < 40) || (tmp.ival > 2550))
         {
             info->errorCount++;
             ERROR("Illegal font size %d (must be 4..255)\n", tmp.ival);
             ACTION("Ignoring font size in keyboard geometry\n");
-            return False;
+            ret = False;
         }
-        info->fontSize = tmp.ival;
-        return True;
+        else {
+            info->fontSize = tmp.ival;
+            ret = True;
+        }
+        free(field.str);
+        return ret;
     }
     else if ((uStrCaseCmp(field.str, "color") == 0) ||
              (uStrCaseCmp(field.str, "basecolor") == 0))
@@ -2308,48 +2300,94 @@ HandleGeometryVar(VarDef * stmt, XkbcDescPtr xkb, GeometryInfo * info)
         if (ndx != NULL)
         {
             info->errorCount++;
-            return ReportNotArray("keyboard", field.str, "geometry");
+            ret = ReportNotArray("keyboard", field.str, "geometry");
         }
         if (!ExprResolveString(stmt->value, &tmp, NULL, NULL))
         {
             info->errorCount++;
-            return ReportBadType("keyboard", field.str, "geometry", "string");
+            ret = ReportBadType("keyboard", field.str, "geometry", "string");
         }
-        info->baseColor = XkbcInternAtom(tmp.str, False);
-        return True;
+        else {
+            info->baseColor = xkb_intern_atom(tmp.str);
+            free(tmp.str);
+            ret = True;
+        }
+        free(field.str);
+        return ret;
     }
     else if (uStrCaseCmp(field.str, "labelcolor") == 0)
     {
         if (ndx != NULL)
         {
             info->errorCount++;
-            return ReportNotArray("keyboard", field.str, "geometry");
+            ret = ReportNotArray("keyboard", field.str, "geometry");
         }
         if (!ExprResolveString(stmt->value, &tmp, NULL, NULL))
         {
             info->errorCount++;
-            return ReportBadType("keyboard", field.str, "geometry", "string");
+            ret = ReportBadType("keyboard", field.str, "geometry", "string");
         }
-        info->labelColor = XkbcInternAtom(tmp.str, False);
-        return True;
+        else {
+            info->labelColor = xkb_intern_atom(tmp.str);
+            free(tmp.str);
+            ret = True;
+        }
+        free(field.str);
+        return ret;
+    }
+    else if (uStrCaseCmp(field.str, "font") == 0)
+    {
+        pField = &info->font;
+    }
+    else if ((uStrCaseCmp(field.str, "fontslant") == 0) ||
+             (uStrCaseCmp(field.str, "slant") == 0))
+    {
+        pField = &info->fontSlant;
+    }
+    else if ((uStrCaseCmp(field.str, "fontweight") == 0) ||
+             (uStrCaseCmp(field.str, "weight") == 0))
+    {
+        pField = &info->fontWeight;
+    }
+    else if ((uStrCaseCmp(field.str, "fontwidth") == 0) ||
+             (uStrCaseCmp(field.str, "setwidth") == 0))
+    {
+        pField = &info->fontWeight;
+    }
+    else if ((uStrCaseCmp(field.str, "fontencoding") == 0) ||
+             (uStrCaseCmp(field.str, "encoding") == 0))
+    {
+        pField = &info->fontEncoding;
+    }
+    else if ((uStrCaseCmp(field.str, "xfont") == 0) ||
+             (uStrCaseCmp(field.str, "xfontname") == 0))
+    {
+        pField = &info->fontSpec;
     }
     else
     {
-        return SetGeometryProperty(info, field.str, stmt->value);
+        ret = SetGeometryProperty(info, field.str, stmt->value);
+        free(field.str);
+        return ret;
     }
 
+    /* fallthrough for the cases that set pField */
     if (ndx != NULL)
     {
         info->errorCount++;
-        return ReportNotArray("keyboard", field.str, "geometry");
+        ret = ReportNotArray("keyboard", field.str, "geometry");
     }
-    if (!ExprResolveString(stmt->value, &tmp, NULL, NULL))
+    else if (!ExprResolveString(stmt->value, &tmp, NULL, NULL))
     {
         info->errorCount++;
-        return ReportBadType("keyboard", field.str, "geometry", "string");
+        ret = ReportBadType("keyboard", field.str, "geometry", "string");
     }
-    *pField = XkbcInternAtom(tmp.str, False);
-    return True;
+    else {
+        *pField = xkb_intern_atom(tmp.str);
+        free(tmp.str);
+    }
+    free(field.str);
+    return ret;
 }
 
 /***====================================================================***/
@@ -2360,7 +2398,7 @@ HandleShapeBody(ShapeDef * def, ShapeInfo * si, unsigned merge,
 {
     OutlineDef *ol;
     int nOut, nPt;
-    XkbOutlinePtr outline;
+    struct xkb_outline * outline;
     ExprDef *pt;
 
     if (def->nOutlines < 1)
@@ -2370,7 +2408,7 @@ HandleShapeBody(ShapeDef * def, ShapeInfo * si, unsigned merge,
         return True;
     }
     si->nOutlines = def->nOutlines;
-    si->outlines = uTypedCalloc(def->nOutlines, XkbOutlineRec);
+    si->outlines = uTypedCalloc(def->nOutlines, struct xkb_outline);
     if (!si->outlines)
     {
         ERROR("Couldn't allocate outlines for \"%s\"\n", shText(si));
@@ -2383,19 +2421,19 @@ HandleShapeBody(ShapeDef * def, ShapeInfo * si, unsigned merge,
     {
         if (ol->nPoints < 1)
         {
-            SetShapeField(si, XkbcAtomGetString(ol->field), NULL,
-                          ol->points, info);
+            SetShapeField(si, XkbcAtomText(ol->field), NULL, ol->points, info);
             continue;
         }
         outline = NULL;
         outline = &si->outlines[nOut++];
         outline->num_points = ol->nPoints;
         outline->corner_radius = si->dfltCornerRadius;
-        outline->points = uTypedCalloc(ol->nPoints, XkbPointRec);
+        outline->points = uTypedCalloc(ol->nPoints, struct xkb_point);
         if (!outline->points)
         {
             ERROR("Can't allocate points for \"%s\"\n", shText(si));
             ACTION("Definition ignored\n");
+            /* XXX leaks */
             info->errorCount++;
             return False;
         }
@@ -2408,7 +2446,7 @@ HandleShapeBody(ShapeDef * def, ShapeInfo * si, unsigned merge,
         }
         if (ol->field != None)
         {
-            char *str = XkbcAtomText(ol->field);
+            const char *str = XkbcAtomText(ol->field);
             if ((uStrCaseCmp(str, "approximation") == 0) ||
                 (uStrCaseCmp(str, "approx") == 0))
             {
@@ -2450,7 +2488,7 @@ HandleShapeBody(ShapeDef * def, ShapeInfo * si, unsigned merge,
 }
 
 static int
-HandleShapeDef(ShapeDef * def, XkbcDescPtr xkb, unsigned merge,
+HandleShapeDef(ShapeDef * def, struct xkb_desc * xkb, unsigned merge,
                GeometryInfo * info)
 {
     ShapeInfo si;
@@ -2460,8 +2498,7 @@ HandleShapeDef(ShapeDef * def, XkbcDescPtr xkb, unsigned merge,
 
     bzero(&si, sizeof(ShapeInfo));
     si.defs.merge = merge;
-    si.name =
-        XkbcInternAtom(XkbcAtomGetString(def->name), False);
+    si.name = def->name;
     si.dfltCornerRadius = info->dfltCornerRadius;
     if (!HandleShapeBody(def, &si, merge, info))
         return False;
@@ -2487,8 +2524,7 @@ HandleDoodadDef(DoodadDef * def,
         def->type = XkbIndicatorDoodad;
     }
     InitDoodadInfo(&new, def->type, si, info);
-    new.name =
-        XkbcInternAtom(XkbcAtomGetString(def->name), False);
+    new.name = def->name;
     for (var = def->body; var != NULL; var = (VarDef *) var->common.next)
     {
         if (ExprResolveLhs(var->name, &elem, &field, &ndx) == 0)
@@ -2498,9 +2534,13 @@ HandleDoodadDef(DoodadDef * def,
             WARN("Assignment to field of unknown element in doodad %s\n",
                   ddText(&new));
             ACTION("No value assigned to %s.%s\n", elem.str, field.str);
+            free(elem.str);
         }
-        else if (!SetDoodadField(&new, field.str, ndx, var->value, si, info))
+        else if (!SetDoodadField(&new, field.str, ndx, var->value, si, info)) {
+            free(field.str);
             return False;
+        }
+        free(field.str);
     }
     if (!AddDoodad(si, info, &new))
         return False;
@@ -2526,8 +2566,7 @@ HandleOverlayDef(OverlayDef * def,
         return True;
     }
     bzero(&ol, sizeof(OverlayInfo));
-    ol.name =
-        XkbcInternAtom(XkbcAtomGetString(def->name), False);
+    ol.name = def->name;
     for (keyDef = def->keys; keyDef;
          keyDef = (OverlayKeyDef *) keyDef->common.next)
     {
@@ -2704,31 +2743,45 @@ HandleSectionBody(SectionDef * def,
             if ((elem.str == NULL) || (uStrCaseCmp(elem.str, "section") == 0))
             {
                 if (!SetSectionField(si, field.str, ndx, var->value, info))
+                {
+                    free(field.str);
                     return False;
+                }
             }
             else if (uStrCaseCmp(elem.str, "row") == 0)
             {
                 if (!SetRowField
                     (&si->dfltRow, field.str, ndx, var->value, info))
+                {
+                    free(field.str);
                     return False;
+                }
             }
             else if (uStrCaseCmp(elem.str, "key") == 0)
             {
                 if (!SetKeyField(&si->dfltRow.dfltKey, field.str, ndx,
                                  var->value, info))
+                {
+                    free(field.str);
                     return False;
+                }
             }
             else if ((di =
                       FindDfltDoodadByTypeName(elem.str, si, info)) != NULL)
             {
                 if (!SetDoodadField(di, field.str, ndx, var->value, si, info))
+                {
+                    free(field.str);
                     return False;
+                }
             }
             else
             {
                 WARN("Assignment to field of unknown element in section\n");
                 ACTION("No value assigned to %s.%s\n", elem.str, field.str);
             }
+            free(field.str);
+            free(elem.str);
         }
         else if (rowDef->common.stmtType == StmtRowDef)
         {
@@ -2769,24 +2822,15 @@ HandleSectionBody(SectionDef * def,
 
 static int
 HandleSectionDef(SectionDef * def,
-                 XkbcDescPtr xkb, unsigned merge, GeometryInfo * info)
+                 struct xkb_desc * xkb, unsigned merge, GeometryInfo * info)
 {
     SectionInfo si;
-    char *str;
 
     if (def->merge != MergeDefault)
         merge = def->merge;
     InitSectionInfo(&si, info);
     si.defs.merge = merge;
-    str = XkbcAtomGetString(def->name);
-    if ((str == NULL) || (strlen(str) < 1))
-    {
-        ERROR("Section defined without a name\n");
-        ACTION("Definition ignored\n");
-        return False;
-    }
-    si.name =
-        XkbcInternAtom(XkbcAtomGetString(def->name), False);
+    si.name = def->name;
     if (!HandleSectionBody(def, &si, merge, info))
         return False;
     if (!AddSection(info, &si))
@@ -2798,7 +2842,7 @@ HandleSectionDef(SectionDef * def,
 
 static void
 HandleGeometryFile(XkbFile * file,
-                   XkbcDescPtr xkb, unsigned merge, GeometryInfo * info)
+                   struct xkb_desc * xkb, unsigned merge, GeometryInfo * info)
 {
     ParseCommon *stmt;
     char *failWhat;
@@ -2878,15 +2922,15 @@ HandleGeometryFile(XkbFile * file,
 /***====================================================================***/
 
 static Bool
-CopyShapeDef(XkbGeometryPtr geom, ShapeInfo * si)
+CopyShapeDef(struct xkb_geometry * geom, ShapeInfo * si)
 {
     register int i, n;
-    XkbShapePtr shape;
-    XkbOutlinePtr old_outline, outline;
-    Atom name;
+    struct xkb_shape * shape;
+    struct xkb_outline *old_outline, *outline;
+    uint32_t name;
 
     si->index = geom->num_shapes;
-    name = XkbcInternAtom(XkbcAtomGetString(si->name), False);
+    name = si->name;
     shape = XkbcAddGeomShape(geom, name, si->nOutlines);
     if (!shape)
     {
@@ -2905,7 +2949,7 @@ CopyShapeDef(XkbGeometryPtr geom, ShapeInfo * si)
             return False;
         }
         n = old_outline->num_points;
-        memcpy(outline->points, old_outline->points, n * sizeof(XkbPointRec));
+        memcpy(outline->points, old_outline->points, n * sizeof(struct xkb_point));
         outline->num_points = old_outline->num_points;
         outline->corner_radius = old_outline->corner_radius;
     }
@@ -2975,7 +3019,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                 WARN("No color for doodad %s\n", ddText(di));
                 ACTION("Using black\n");
             }
-            di->color = XkbcInternAtom("black", False);
+            di->color = xkb_intern_atom("black");
         }
         break;
     case XkbTextDoodad:
@@ -2994,7 +3038,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                 WARN("No color specified for doodad %s\n", ddText(di));
                 ACTION("Using black\n");
             }
-            di->color = XkbcInternAtom("black", False);
+            di->color = xkb_intern_atom("black");
         }
         if ((di->defs.defined & _GD_FontSpec) != 0)
         {
@@ -3017,7 +3061,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                 WARN("No font specified for doodad %s\n", ddText(di));
                 ACTION("Using \"%s\"\n", DFLT_FONT);
             }
-            di->font = XkbcInternAtom(DFLT_FONT, False);
+            di->font = xkb_intern_atom(DFLT_FONT);
         }
         if ((di->defs.defined & _GD_FontSlant) == 0)
         {
@@ -3026,7 +3070,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                 WARN("No font slant for text doodad %s\n", ddText(di));
                 ACTION("Using \"%s\"\n", DFLT_SLANT);
             }
-            di->fontSlant = XkbcInternAtom(DFLT_SLANT, False);
+            di->fontSlant = xkb_intern_atom(DFLT_SLANT);
         }
         if ((di->defs.defined & _GD_FontWeight) == 0)
         {
@@ -3035,7 +3079,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                 WARN("No font weight for text doodad %s\n", ddText(di));
                 ACTION("Using \"%s\"\n", DFLT_WEIGHT);
             }
-            di->fontWeight = XkbcInternAtom(DFLT_WEIGHT, False);
+            di->fontWeight = xkb_intern_atom(DFLT_WEIGHT);
         }
         if ((di->defs.defined & _GD_FontSetWidth) == 0)
         {
@@ -3044,7 +3088,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                 WARN("No font set width for text doodad %s\n", ddText(di));
                 ACTION("Using \"%s\"\n", DFLT_SET_WIDTH);
             }
-            di->fontSetWidth = XkbcInternAtom(DFLT_SET_WIDTH, False);
+            di->fontSetWidth = xkb_intern_atom(DFLT_SET_WIDTH);
         }
         if ((di->defs.defined & _GD_FontVariant) == 0)
         {
@@ -3053,7 +3097,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                 WARN("No font variant for text doodad %s\n", ddText(di));
                 ACTION("Using \"%s\"\n", DFLT_VARIANT);
             }
-            di->fontVariant = XkbcInternAtom(DFLT_VARIANT, False);
+            di->fontVariant = xkb_intern_atom(DFLT_VARIANT);
         }
         if ((di->defs.defined & _GD_FontEncoding) == 0)
         {
@@ -3062,7 +3106,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                 WARN("No font encoding for doodad %s\n", ddText(di));
                 ACTION("Using \"%s\"\n", DFLT_ENCODING);
             }
-            di->fontEncoding = XkbcInternAtom(DFLT_ENCODING, False);
+            di->fontEncoding = xkb_intern_atom(DFLT_ENCODING);
         }
         if ((di->defs.defined & _GD_FontSize) == 0)
         {
@@ -3076,11 +3120,10 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
         if ((di->defs.defined & _GD_Height) == 0)
         {
             unsigned size, nLines;
-            char *tmp;
+            const char *tmp;
             size = (di->fontSize * 120) / 100;
             size = (size * 254) / 720;  /* convert to mm/10 */
-            for (nLines = 1, tmp = XkbcAtomGetString(di->text); *tmp;
-                 tmp++)
+            for (nLines = 1, tmp = XkbcAtomText(di->text); *tmp; tmp++)
             {
                 if (*tmp == '\n')
                     nLines++;
@@ -3097,9 +3140,9 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
         if ((di->defs.defined & _GD_Width) == 0)
         {
             unsigned width, tmp;
-            char *str;
+            const char *str;
             width = tmp = 0;
-            for (str = XkbcAtomGetString(di->text); *str; str++)
+            for (str = XkbcAtomText(di->text); *str; str++)
             {
                 if (*str != '\n')
                     tmp++;
@@ -3150,7 +3193,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                       ddText(di));
                 ACTION("Using green\n");
             }
-            di->color = XkbcInternAtom("green", False);
+            di->color = xkb_intern_atom("green");
         }
         if ((di->defs.defined & _GD_OffColor) == 0)
         {
@@ -3160,7 +3203,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                       ddText(di));
                 ACTION("Using black\n");
             }
-            di->offColor = XkbcInternAtom("black", False);
+            di->offColor = xkb_intern_atom("black");
         }
         break;
     case XkbLogoDoodad:
@@ -3197,7 +3240,7 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
                 WARN("No color for doodad %s\n", ddText(di));
                 ACTION("Using black\n");
             }
-            di->color = XkbcInternAtom("black", False);
+            di->color = xkb_intern_atom("black");
         }
         break;
     default:
@@ -3211,55 +3254,48 @@ VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
 #define        FONT_TEMPLATE   "-*-%s-%s-%s-%s-%s-*-%d-*-*-*-*-%s"
 
 static char *
-FontFromParts(Atom fontTok,
-              Atom weightTok,
-              Atom slantTok,
-              Atom setWidthTok, Atom varTok, int size, Atom encodingTok)
+FontFromParts(uint32_t fontTok,
+              uint32_t weightTok,
+              uint32_t slantTok,
+              uint32_t setWidthTok, uint32_t varTok, int size, uint32_t encodingTok)
 {
     int totalSize;
-    char *font, *weight, *slant, *setWidth, *variant, *encoding;
+    const char *font, *weight, *slant, *setWidth, *variant, *encoding;
     char *rtrn;
 
-    font = (fontTok != None ? XkbcAtomGetString(fontTok) : DFLT_FONT);
-    weight =
-        (weightTok != None ? XkbcAtomGetString(weightTok) : DFLT_WEIGHT);
-    slant =
-        (slantTok != None ? XkbcAtomGetString(slantTok) : DFLT_SLANT);
+    font = (fontTok != None ? XkbcAtomText(fontTok) : DFLT_FONT);
+    weight = (weightTok != None ? XkbcAtomText(weightTok) : DFLT_WEIGHT);
+    slant = (slantTok != None ? XkbcAtomText(slantTok) : DFLT_SLANT);
     setWidth =
-        (setWidthTok !=
-         None ? XkbcAtomGetString(setWidthTok) : DFLT_SET_WIDTH);
-    variant =
-        (varTok != None ? XkbcAtomGetString(varTok) : DFLT_VARIANT);
+        (setWidthTok != None ? XkbcAtomText(setWidthTok) : DFLT_SET_WIDTH);
+    variant = (varTok != None ? XkbcAtomText(varTok) : DFLT_VARIANT);
     encoding =
-        (encodingTok !=
-         None ? XkbcAtomGetString(encodingTok) : DFLT_ENCODING);
+        (encodingTok != None ? XkbcAtomText(encodingTok) : DFLT_ENCODING);
     if (size == 0)
         size = DFLT_SIZE;
     totalSize =
         strlen(FONT_TEMPLATE) + strlen(font) + strlen(weight) + strlen(slant);
     totalSize += strlen(setWidth) + strlen(variant) + strlen(encoding);
-    rtrn = uCalloc(totalSize, 1);
+    rtrn = calloc(totalSize, 1);
     if (rtrn)
-    {
         sprintf(rtrn, FONT_TEMPLATE, font, weight, slant, setWidth, variant,
                 size, encoding);
-    }
     return rtrn;
 }
 
 static Bool
-CopyDoodadDef(XkbGeometryPtr geom,
-              XkbSectionPtr section, DoodadInfo * di, GeometryInfo * info)
+CopyDoodadDef(struct xkb_geometry * geom,
+              struct xkb_section * section, DoodadInfo * di, GeometryInfo * info)
 {
-    Atom name;
-    XkbDoodadPtr doodad;
-    XkbColorPtr color;
-    XkbShapePtr shape;
+    uint32_t name;
+    union xkb_doodad * doodad;
+    struct xkb_color * color;
+    struct xkb_shape * shape;
     ShapeInfo *si;
 
     if (!VerifyDoodadInfo(di, info))
         return False;
-    name = XkbcInternAtom(XkbcAtomGetString(di->name), False);
+    name = di->name;
     doodad = XkbcAddGeomDoodad(geom, section, name);
     if (!doodad)
     {
@@ -3280,9 +3316,8 @@ CopyDoodadDef(XkbGeometryPtr geom,
         if (!si)
             return False;
         doodad->shape.angle = di->angle;
-        color =
-            XkbcAddGeomColor(geom, XkbcAtomGetString(di->color),
-                            geom->num_colors);
+        color = XkbcAddGeomColor(geom, XkbcAtomText(di->color),
+                                 geom->num_colors);
         shape = &geom->shapes[si->index];
         XkbSetShapeDoodadColor(geom, &doodad->shape, color);
         XkbSetShapeDoodadShape(geom, &doodad->shape, shape);
@@ -3300,9 +3335,8 @@ CopyDoodadDef(XkbGeometryPtr geom,
         else
             doodad->text.font = XkbcAtomGetString(di->fontSpec);
         doodad->text.text = XkbcAtomGetString(di->text);
-        color =
-            XkbcAddGeomColor(geom, XkbcAtomGetString(di->color),
-                            geom->num_colors);
+        color = XkbcAddGeomColor(geom, XkbcAtomText(di->color),
+                                 geom->num_colors);
         XkbSetTextDoodadColor(geom, &doodad->text, color);
         break;
     case XkbIndicatorDoodad:
@@ -3310,14 +3344,12 @@ CopyDoodadDef(XkbGeometryPtr geom,
         if (!si)
             return False;
         shape = &geom->shapes[si->index];
-        color =
-            XkbcAddGeomColor(geom, XkbcAtomGetString(di->color),
-                            geom->num_colors);
+        color = XkbcAddGeomColor(geom, XkbcAtomText(di->color),
+                                 geom->num_colors);
         XkbSetIndicatorDoodadShape(geom, &doodad->indicator, shape);
         XkbSetIndicatorDoodadOnColor(geom, &doodad->indicator, color);
-        color =
-            XkbcAddGeomColor(geom, XkbcAtomGetString(di->offColor),
-                            geom->num_colors);
+        color = XkbcAddGeomColor(geom, XkbcAtomText(di->offColor),
+                                 geom->num_colors);
         XkbSetIndicatorDoodadOffColor(geom, &doodad->indicator, color);
         break;
     case XkbLogoDoodad:
@@ -3325,9 +3357,8 @@ CopyDoodadDef(XkbGeometryPtr geom,
         if (!si)
             return False;
         doodad->logo.angle = di->angle;
-        color =
-            XkbcAddGeomColor(geom, XkbcAtomGetString(di->color),
-                            geom->num_colors);
+        color = XkbcAddGeomColor(geom, XkbcAtomText(di->color),
+                                 geom->num_colors);
         shape = &geom->shapes[si->index];
         XkbSetLogoDoodadColor(geom, &doodad->logo, color);
         XkbSetLogoDoodadShape(geom, &doodad->logo, shape);
@@ -3341,15 +3372,15 @@ CopyDoodadDef(XkbGeometryPtr geom,
 /***====================================================================***/
 
 static Bool
-VerifyOverlayInfo(XkbGeometryPtr geom,
-                  XkbSectionPtr section,
+VerifyOverlayInfo(struct xkb_geometry * geom,
+                  struct xkb_section * section,
                   OverlayInfo * oi,
                   GeometryInfo * info, short rowMap[256], short rowSize[256])
 {
     register OverlayKeyInfo *ki, *next;
     unsigned long oKey, uKey, sKey;
-    XkbRowPtr row;
-    XkbKeyPtr key;
+    struct xkb_row * row;
+    struct xkb_key * key;
     int r, k;
 
     /* find out which row each key is in */
@@ -3398,7 +3429,7 @@ VerifyOverlayInfo(XkbGeometryPtr geom,
     while ((oi->keys != NULL) && (oi->keys->sectionRow == _GOK_UnknownRow))
     {
         next = (OverlayKeyInfo *) oi->keys->defs.next;
-        uFree(oi->keys);
+        free(oi->keys);
         oi->keys = next;
         oi->nKeys--;
     }
@@ -3409,7 +3440,7 @@ VerifyOverlayInfo(XkbGeometryPtr geom,
         {
             ki->defs.next = next->defs.next;
             oi->nKeys--;
-            uFree(next);
+            free(next);
             next = (OverlayKeyInfo *) ki->defs.next;
         }
     }
@@ -3438,20 +3469,20 @@ VerifyOverlayInfo(XkbGeometryPtr geom,
 }
 
 static Bool
-CopyOverlayDef(XkbGeometryPtr geom,
-               XkbSectionPtr section, OverlayInfo * oi, GeometryInfo * info)
+CopyOverlayDef(struct xkb_geometry * geom,
+               struct xkb_section * section, OverlayInfo * oi, GeometryInfo * info)
 {
-    Atom name;
-    XkbOverlayPtr ol;
-    XkbOverlayRowPtr row;
-    XkbOverlayKeyPtr key;
+    uint32_t name;
+    struct xkb_overlay * ol;
+    struct xkb_overlay_row * row;
+    struct xkb_overlay_key * key;
     OverlayKeyInfo *ki;
     short rowMap[256], rowSize[256];
     int i;
 
     if (!VerifyOverlayInfo(geom, section, oi, info, rowMap, rowSize))
         return False;
-    name = XkbcInternAtom(XkbcAtomGetString(oi->name), False);
+    name = oi->name;
     ol = XkbcAddGeomOverlay(section, name, oi->nRows);
     if (!ol)
     {
@@ -3480,7 +3511,7 @@ CopyOverlayDef(XkbGeometryPtr geom,
     {
         row = &ol->rows[ki->overlayRow];
         key = &row->keys[row->num_keys++];
-        bzero(key, sizeof(XkbOverlayKeyRec));
+        bzero(key, sizeof(struct xkb_overlay_key));
         strncpy(key->over.name, ki->over, XkbKeyNameLength);
         strncpy(key->under.name, ki->under, XkbKeyNameLength);
     }
@@ -3490,18 +3521,16 @@ CopyOverlayDef(XkbGeometryPtr geom,
 /***====================================================================***/
 
 static Bool
-CopySectionDef(XkbGeometryPtr geom, SectionInfo * si, GeometryInfo * info)
+CopySectionDef(struct xkb_geometry * geom, SectionInfo * si, GeometryInfo * info)
 {
-    XkbSectionPtr section;
-    XkbRowPtr row;
-    XkbKeyPtr key;
+    struct xkb_section * section;
+    struct xkb_row * row;
+    struct xkb_key * key;
     KeyInfo *ki;
     RowInfo *ri;
-    Atom name;
 
-    name = XkbcInternAtom(XkbcAtomGetString(si->name), False);
-    section =
-        XkbcAddGeomSection(geom, name, si->nRows, si->nDoodads, si->nOverlays);
+    section = XkbcAddGeomSection(geom, si->name, si->nRows, si->nDoodads,
+                                 si->nOverlays);
     if (section == NULL)
     {
         WSGO("Couldn't allocate section in geometry\n");
@@ -3528,7 +3557,7 @@ CopySectionDef(XkbGeometryPtr geom, SectionInfo * si, GeometryInfo * info)
         row->vertical = ri->vertical;
         for (ki = ri->keys; ki != NULL; ki = (KeyInfo *) ki->defs.next)
         {
-            XkbColorPtr color;
+            struct xkb_color * color;
             if ((ki->defs.defined & _GK_Name) == 0)
             {
                 ERROR("Key %d of row %d in section %s has no name\n",
@@ -3557,9 +3586,8 @@ CopySectionDef(XkbGeometryPtr geom, SectionInfo * si, GeometryInfo * info)
             }
             if (ki->color != None)
                 color =
-                    XkbcAddGeomColor(geom,
-                                    XkbcAtomGetString(ki->color),
-                                    geom->num_colors);
+                    XkbcAddGeomColor(geom, XkbcAtomText(ki->color),
+                                     geom->num_colors);
             else
                 color = XkbcAddGeomColor(geom, "white", geom->num_colors);
             XkbSetKeyColor(geom, key, color);
@@ -3596,7 +3624,7 @@ CopySectionDef(XkbGeometryPtr geom, SectionInfo * si, GeometryInfo * info)
 /***====================================================================***/
 
 Bool
-CompileGeometry(XkbFile *file, XkbcDescPtr xkb, unsigned merge)
+CompileGeometry(XkbFile *file, struct xkb_desc * xkb, unsigned merge)
 {
     GeometryInfo info;
 
@@ -3605,8 +3633,8 @@ CompileGeometry(XkbFile *file, XkbcDescPtr xkb, unsigned merge)
 
     if (info.errorCount == 0)
     {
-        XkbGeometryPtr geom;
-        XkbGeometrySizesRec sizes;
+        struct xkb_geometry * geom;
+        struct xkb_geometry_sizes sizes;
         bzero(&sizes, sizeof(sizes));
         sizes.which = XkbGeomAllMask;
         sizes.num_properties = info.nProps;
@@ -3626,13 +3654,12 @@ CompileGeometry(XkbFile *file, XkbcDescPtr xkb, unsigned merge)
         geom->height_mm = info.heightMM;
         if (info.name != NULL)
         {
-            geom->name = XkbcInternAtom(info.name, False);
+            geom->name = xkb_intern_atom(info.name);
             if (XkbcAllocNames(xkb, XkbGeometryNameMask, 0, 0) == Success)
                 xkb->names->geometry = geom->name;
         }
         if (info.fontSpec != None)
-            geom->label_font =
-                _XkbDupString(XkbcAtomGetString(info.fontSpec));
+            geom->label_font = XkbcAtomGetString(info.fontSpec);
         else
             geom->label_font = FontFromParts(info.font, info.fontWeight,
                                              info.fontSlant,
@@ -3644,15 +3671,15 @@ CompileGeometry(XkbFile *file, XkbcDescPtr xkb, unsigned merge)
         XkbcAddGeomColor(geom, "white", geom->num_colors);
 
         if (info.baseColor == None)
-            info.baseColor = XkbcInternAtom("white", False);
+            info.baseColor = xkb_intern_atom("white");
         if (info.labelColor == None)
-            info.labelColor = XkbcInternAtom("black", False);
+            info.labelColor = xkb_intern_atom("black");
         geom->base_color =
-            XkbcAddGeomColor(geom, XkbcAtomGetString(info.baseColor),
-                            geom->num_colors);
+            XkbcAddGeomColor(geom, XkbcAtomText(info.baseColor),
+                             geom->num_colors);
         geom->label_color =
-            XkbcAddGeomColor(geom, XkbcAtomGetString(info.labelColor),
-                            geom->num_colors);
+            XkbcAddGeomColor(geom, XkbcAtomText(info.labelColor),
+                             geom->num_colors);
 
         if (info.props)
         {