summaryrefslogtreecommitdiff
path: root/geometry.c
diff options
context:
space:
mode:
Diffstat (limited to 'geometry.c')
-rw-r--r--geometry.c5905
1 files changed, 3199 insertions, 2706 deletions
diff --git a/geometry.c b/geometry.c
index baf79e8..6eb3fb8 100644
--- a/geometry.c
+++ b/geometry.c
@@ -44,25 +44,27 @@
#define DFLT_ENCODING "iso8859-1"
#define DFLT_SIZE 120
-typedef struct _PropertyInfo {
- CommonInfo defs;
- char * name;
- char * value;
+typedef struct _PropertyInfo
+{
+ CommonInfo defs;
+ char *name;
+ char *value;
} PropertyInfo;
#define _GSh_Outlines (1<<1)
#define _GSh_Approx (1<<2)
#define _GSh_Primary (1<<3)
-typedef struct _ShapeInfo {
- CommonInfo defs;
- Atom name;
- short index;
- unsigned short nOutlines;
- unsigned short szOutlines;
- XkbOutlinePtr outlines;
- XkbOutlinePtr approx;
- XkbOutlinePtr primary;
- int dfltCornerRadius;
+typedef struct _ShapeInfo
+{
+ CommonInfo defs;
+ Atom name;
+ short index;
+ unsigned short nOutlines;
+ unsigned short szOutlines;
+ XkbOutlinePtr outlines;
+ XkbOutlinePtr approx;
+ XkbOutlinePtr primary;
+ int dfltCornerRadius;
} ShapeInfo;
#define shText(d,s) \
@@ -73,12 +75,12 @@ typedef struct _ShapeInfo {
#define _GD_Left (1<<2)
#define _GD_Angle (1<<3)
#define _GD_Shape (1<<4)
-#define _GD_FontVariant (1<<4) /* CHEATING */
+#define _GD_FontVariant (1<<4) /* CHEATING */
#define _GD_Corner (1<<5)
-#define _GD_Width (1<<5) /* CHEATING */
+#define _GD_Width (1<<5) /* CHEATING */
#define _GD_Color (1<<6)
#define _GD_OffColor (1<<7)
-#define _GD_Height (1<<7) /* CHEATING */
+#define _GD_Height (1<<7) /* CHEATING */
#define _GD_Text (1<<8)
#define _GD_Font (1<<9)
#define _GD_FontSlant (1<<10)
@@ -91,30 +93,31 @@ typedef struct _ShapeInfo {
#define _GD_FontParts (_GD_Font|_GD_FontSlant|_GD_FontWeight|_GD_FontSetWidth|_GD_FontSize|_GD_FontEncoding|_GD_FontVariant)
-typedef struct _DoodadInfo {
- CommonInfo defs;
- Atom name;
- unsigned char type;
- unsigned char priority;
- short top;
- short left;
- short angle;
- 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;
- unsigned short fontSize;
- Atom fontEncoding;
- Atom fontSpec;
- char * logoName;
+typedef struct _DoodadInfo
+{
+ CommonInfo defs;
+ Atom name;
+ unsigned char type;
+ unsigned char priority;
+ short top;
+ short left;
+ short angle;
+ 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;
+ unsigned short fontSize;
+ Atom fontEncoding;
+ Atom fontSpec;
+ char *logoName;
struct _SectionInfo *section;
} DoodadInfo;
@@ -127,14 +130,15 @@ typedef struct _DoodadInfo {
#define _GK_Gap (1<<2)
#define _GK_Shape (1<<3)
#define _GK_Color (1<<4)
-typedef struct _KeyInfo {
- CommonInfo defs;
- char name[8];
- short gap;
- short index;
- Atom shape;
- Atom color;
- struct _RowInfo * row;
+typedef struct _KeyInfo
+{
+ CommonInfo defs;
+ char name[8];
+ short gap;
+ short index;
+ Atom shape;
+ Atom color;
+ struct _RowInfo *row;
} KeyInfo;
#define keyText(k) ((k)&&(k)->name[0]?(k)->name:"default")
@@ -142,35 +146,38 @@ typedef struct _KeyInfo {
#define _GR_Vertical (1<<1)
#define _GR_Top (1<<2)
#define _GR_Left (1<<3)
-typedef struct _RowInfo {
- CommonInfo defs;
- unsigned short top;
- unsigned short left;
- short index;
- Bool vertical;
- unsigned short nKeys;
- KeyInfo * keys;
- KeyInfo dfltKey;
+typedef struct _RowInfo
+{
+ CommonInfo defs;
+ unsigned short top;
+ unsigned short left;
+ short index;
+ Bool vertical;
+ unsigned short nKeys;
+ KeyInfo *keys;
+ KeyInfo dfltKey;
struct _SectionInfo *section;
} RowInfo;
#define rowText(d,r) \
((r)?XkbAtomText((d),(r)->section->name,XkbMessage):"default")
#define _GOK_UnknownRow -1
-typedef struct _OverlayKeyInfo {
- CommonInfo defs;
- short sectionRow;
- short overlayRow;
- char over[XkbKeyNameLength+1];
- char under[XkbKeyNameLength+1];
+typedef struct _OverlayKeyInfo
+{
+ CommonInfo defs;
+ short sectionRow;
+ short overlayRow;
+ char over[XkbKeyNameLength + 1];
+ char under[XkbKeyNameLength + 1];
} OverlayKeyInfo;
-typedef struct _OverlayInfo {
- CommonInfo defs;
- Atom name;
- unsigned short nRows;
- unsigned short nKeys;
- OverlayKeyInfo *keys;
+typedef struct _OverlayInfo
+{
+ CommonInfo defs;
+ Atom name;
+ unsigned short nRows;
+ unsigned short nKeys;
+ OverlayKeyInfo *keys;
} OverlayInfo;
#define oiText(d,o) ((o)?XkbAtomText((d),(o)->name,XkbMessage):"default")
@@ -183,434 +190,472 @@ typedef struct _OverlayInfo {
#define _GS_Height (1<<5)
#define _GS_Angle (1<<6)
#define _GS_Priority (1<<7)
-typedef struct _SectionInfo {
- CommonInfo defs;
- Atom name;
- unsigned short top;
- unsigned short left;
- unsigned short width;
- unsigned short height;
- unsigned short angle;
- unsigned short nRows;
- unsigned short nDoodads;
- unsigned short nOverlays;
- unsigned char priority;
- unsigned char nextDoodadPriority;
- RowInfo * rows;
- DoodadInfo * doodads;
- RowInfo dfltRow;
- DoodadInfo * dfltDoodads;
- OverlayInfo * overlays;
+typedef struct _SectionInfo
+{
+ CommonInfo defs;
+ Atom name;
+ unsigned short top;
+ unsigned short left;
+ unsigned short width;
+ unsigned short height;
+ unsigned short angle;
+ unsigned short nRows;
+ unsigned short nDoodads;
+ unsigned short nOverlays;
+ unsigned char priority;
+ unsigned char nextDoodadPriority;
+ RowInfo *rows;
+ DoodadInfo *doodads;
+ RowInfo dfltRow;
+ DoodadInfo *dfltDoodads;
+ OverlayInfo *overlays;
struct _GeometryInfo *geometry;
} SectionInfo;
#define scText(d,s) ((s)?XkbAtomText((d),(s)->name,XkbMessage):"default")
-typedef struct _GeometryInfo {
- char * name;
- Display * dpy;
- unsigned fileID;
- unsigned merge;
- int errorCount;
- unsigned nextPriority;
- int nProps;
- int nShapes;
- int nSections;
- int nDoodads;
- PropertyInfo * props;
- ShapeInfo * shapes;
- SectionInfo * sections;
- DoodadInfo * doodads;
- int widthMM;
- int heightMM;
- Atom font;
- Atom fontSlant;
- Atom fontWeight;
- Atom fontSetWidth;
- Atom fontVariant;
- unsigned fontSize;
- Atom fontEncoding;
- Atom fontSpec;
- Atom baseColor;
- Atom labelColor;
- int dfltCornerRadius;
- SectionInfo dfltSection;
- DoodadInfo * dfltDoodads;
- AliasInfo * aliases;
+typedef struct _GeometryInfo
+{
+ char *name;
+ Display *dpy;
+ unsigned fileID;
+ unsigned merge;
+ int errorCount;
+ unsigned nextPriority;
+ int nProps;
+ int nShapes;
+ int nSections;
+ int nDoodads;
+ PropertyInfo *props;
+ ShapeInfo *shapes;
+ SectionInfo *sections;
+ DoodadInfo *doodads;
+ int widthMM;
+ int heightMM;
+ Atom font;
+ Atom fontSlant;
+ Atom fontWeight;
+ Atom fontSetWidth;
+ Atom fontVariant;
+ unsigned fontSize;
+ Atom fontEncoding;
+ Atom fontSpec;
+ Atom baseColor;
+ Atom labelColor;
+ int dfltCornerRadius;
+ SectionInfo dfltSection;
+ DoodadInfo *dfltDoodads;
+ AliasInfo *aliases;
} GeometryInfo;
static char *
-ddText(Display *dpy,DoodadInfo *di)
+ddText(Display * dpy, DoodadInfo * di)
{
-static char buf[64];
+ static char buf[64];
- if (di==NULL) {
- strcpy(buf,"default");
- return buf;
+ if (di == NULL)
+ {
+ strcpy(buf, "default");
+ return buf;
}
- if (di->section) {
- sprintf(buf,"%s in section %s",XkbAtomText(dpy,di->name,XkbMessage),
- scText(dpy,di->section));
- return buf;
+ if (di->section)
+ {
+ sprintf(buf, "%s in section %s",
+ XkbAtomText(dpy, di->name, XkbMessage), scText(dpy,
+ di->section));
+ return buf;
}
- return XkbAtomText(dpy,di->name,XkbMessage);
+ return XkbAtomText(dpy, di->name, XkbMessage);
}
/***====================================================================***/
static void
-InitPropertyInfo(PropertyInfo *pi,GeometryInfo *info)
+InitPropertyInfo(PropertyInfo * pi, GeometryInfo * info)
{
- pi->defs.defined= 0;
- pi->defs.fileID= info->fileID;
- pi->defs.merge= info->merge;
- pi->name= pi->value= NULL;
+ pi->defs.defined = 0;
+ pi->defs.fileID = info->fileID;
+ pi->defs.merge = info->merge;
+ pi->name = pi->value = NULL;
return;
}
static void
-FreeProperties(PropertyInfo *pi,GeometryInfo *info)
-{
-PropertyInfo * tmp;
-PropertyInfo * next;
-
- if (info->props==pi) {
- info->props= NULL;
- info->nProps= 0;
- }
- for (tmp=pi;tmp!=NULL;tmp=next) {
- if (tmp->name)
- uFree(tmp->name);
- if (tmp->value)
- uFree(tmp->value);
- tmp->name= tmp->value=NULL;
- next= (PropertyInfo *)tmp->defs.next;
- uFree(tmp);
+FreeProperties(PropertyInfo * pi, GeometryInfo * info)
+{
+ PropertyInfo *tmp;
+ PropertyInfo *next;
+
+ if (info->props == pi)
+ {
+ info->props = NULL;
+ info->nProps = 0;
+ }
+ for (tmp = pi; tmp != NULL; tmp = next)
+ {
+ if (tmp->name)
+ uFree(tmp->name);
+ if (tmp->value)
+ uFree(tmp->value);
+ tmp->name = tmp->value = NULL;
+ next = (PropertyInfo *) tmp->defs.next;
+ uFree(tmp);
}
return;
}
static void
-InitKeyInfo(KeyInfo *key,RowInfo *row,GeometryInfo *info)
+InitKeyInfo(KeyInfo * key, RowInfo * row, GeometryInfo * info)
{
- if (key!=&row->dfltKey) {
- *key= row->dfltKey;
- strcpy(key->name,"unknown");
- key->defs.defined&= ~_GK_Default;
+ if (key != &row->dfltKey)
+ {
+ *key = row->dfltKey;
+ strcpy(key->name, "unknown");
+ key->defs.defined &= ~_GK_Default;
}
- else {
- bzero(key,sizeof(KeyInfo));
- strcpy(key->name,"default");
- key->defs.defined= _GK_Default;
- key->defs.fileID= info->fileID;
- key->defs.merge= info->merge;
- key->defs.next= NULL;
- key->row= row;
+ else
+ {
+ bzero(key, sizeof(KeyInfo));
+ strcpy(key->name, "default");
+ key->defs.defined = _GK_Default;
+ key->defs.fileID = info->fileID;
+ key->defs.merge = info->merge;
+ key->defs.next = NULL;
+ key->row = row;
}
return;
}
static void
-ClearKeyInfo(KeyInfo *key)
+ClearKeyInfo(KeyInfo * key)
{
- key->defs.defined&= ~_GK_Default;
- strcpy(key->name,"default");
- key->gap= 0;
- key->shape= None;
- key->color= None;
+ key->defs.defined &= ~_GK_Default;
+ strcpy(key->name, "default");
+ key->gap = 0;
+ key->shape = None;
+ key->color = None;
return;
}
static void
-FreeKeys(KeyInfo *key,RowInfo *row,GeometryInfo *info)
+FreeKeys(KeyInfo * key, RowInfo * row, GeometryInfo * info)
{
-KeyInfo * tmp;
-KeyInfo * next;
+ KeyInfo *tmp;
+ KeyInfo *next;
- if (row->keys==key) {
- row->nKeys= 0;
- row->keys= NULL;
+ if (row->keys == key)
+ {
+ row->nKeys = 0;
+ row->keys = NULL;
}
- for (tmp=key;tmp!=NULL;tmp=next) {
- ClearKeyInfo(tmp);
- next= (KeyInfo *)tmp->defs.next;
- uFree(tmp);
+ for (tmp = key; tmp != NULL; tmp = next)
+ {
+ ClearKeyInfo(tmp);
+ next = (KeyInfo *) tmp->defs.next;
+ uFree(tmp);
}
return;
}
static void
-InitRowInfo(RowInfo *row,SectionInfo *section,GeometryInfo *info)
-{
- if (row!= &section->dfltRow) {
- *row= section->dfltRow;
- row->defs.defined&= ~_GR_Default;
- }
- else {
- bzero(row,sizeof(RowInfo *));
- row->defs.defined= _GR_Default;
- row->defs.fileID= info->fileID;
- row->defs.merge= info->merge;
- row->defs.next= NULL;
- row->section= section;
- row->nKeys= 0;
- row->keys= NULL;
- InitKeyInfo(&row->dfltKey,row,info);
+InitRowInfo(RowInfo * row, SectionInfo * section, GeometryInfo * info)
+{
+ if (row != &section->dfltRow)
+ {
+ *row = section->dfltRow;
+ row->defs.defined &= ~_GR_Default;
+ }
+ else
+ {
+ bzero(row, sizeof(RowInfo *));
+ row->defs.defined = _GR_Default;
+ row->defs.fileID = info->fileID;
+ row->defs.merge = info->merge;
+ row->defs.next = NULL;
+ row->section = section;
+ row->nKeys = 0;
+ row->keys = NULL;
+ InitKeyInfo(&row->dfltKey, row, info);
}
return;
}
static void
-ClearRowInfo(RowInfo *row,GeometryInfo *info)
+ClearRowInfo(RowInfo * row, GeometryInfo * info)
{
- row->defs.defined&= ~_GR_Default;
- row->top= row->left= 0;
- row->vertical= False;
- row->nKeys= 0;
+ row->defs.defined &= ~_GR_Default;
+ row->top = row->left = 0;
+ row->vertical = False;
+ row->nKeys = 0;
if (row->keys)
- FreeKeys(row->keys,row,info);
+ FreeKeys(row->keys, row, info);
ClearKeyInfo(&row->dfltKey);
- row->dfltKey.defs.defined|= _GK_Default;
+ row->dfltKey.defs.defined |= _GK_Default;
return;
}
static void
-FreeRows(RowInfo *row,SectionInfo *section,GeometryInfo *info)
+FreeRows(RowInfo * row, SectionInfo * section, GeometryInfo * info)
{
-RowInfo * next;
-RowInfo * tmp;
+ RowInfo *next;
+ RowInfo *tmp;
- if (row==section->rows) {
- section->nRows= 0;
- section->rows= NULL;
+ if (row == section->rows)
+ {
+ section->nRows = 0;
+ section->rows = NULL;
}
- for (tmp=row;tmp!=NULL;tmp=next) {
- ClearRowInfo(tmp,info);
- next= (RowInfo *)tmp->defs.next;
- uFree(tmp);
+ for (tmp = row; tmp != NULL; tmp = next)
+ {
+ ClearRowInfo(tmp, info);
+ next = (RowInfo *) tmp->defs.next;
+ uFree(tmp);
}
return;
}
static DoodadInfo *
-FindDoodadByType(DoodadInfo *di,unsigned type)
+FindDoodadByType(DoodadInfo * di, unsigned type)
{
- while (di) {
- if (di->type==type)
- return di;
- di= (DoodadInfo *)di->defs.next;
+ while (di)
+ {
+ if (di->type == type)
+ return di;
+ di = (DoodadInfo *) di->defs.next;
}
return NULL;
}
static DoodadInfo *
-FindDoodadByName(DoodadInfo *di,Atom name)
+FindDoodadByName(DoodadInfo * di, Atom name)
{
- while (di) {
- if (di->name==name)
- return di;
- di= (DoodadInfo *)di->defs.next;
+ while (di)
+ {
+ if (di->name == name)
+ return di;
+ di = (DoodadInfo *) di->defs.next;
}
return NULL;
}
static void
-InitDoodadInfo(DoodadInfo *di,unsigned type,SectionInfo *si,GeometryInfo *info)
+InitDoodadInfo(DoodadInfo * di, unsigned type, SectionInfo * si,
+ GeometryInfo * info)
{
-DoodadInfo * dflt;
+ DoodadInfo *dflt;
- dflt= NULL;
+ dflt = NULL;
if (si && si->dfltDoodads)
- dflt= FindDoodadByType(si->dfltDoodads,type);
- if ((dflt==NULL)&&(info->dfltDoodads))
- dflt= FindDoodadByType(info->dfltDoodads,type);
- if (dflt!=NULL) {
- *di= *dflt;
- di->defs.next= NULL;
- }
- else {
- bzero(di,sizeof(DoodadInfo));
- di->defs.fileID= info->fileID;
- di->type= type;
- }
- di->section= si;
- if (si!=NULL) {
- di->priority= si->nextDoodadPriority++;
+ dflt = FindDoodadByType(si->dfltDoodads, type);
+ if ((dflt == NULL) && (info->dfltDoodads))
+ dflt = FindDoodadByType(info->dfltDoodads, type);
+ if (dflt != NULL)
+ {
+ *di = *dflt;
+ di->defs.next = NULL;
+ }
+ else
+ {
+ bzero(di, sizeof(DoodadInfo));
+ di->defs.fileID = info->fileID;
+ di->type = type;
+ }
+ di->section = si;
+ if (si != NULL)
+ {
+ di->priority = si->nextDoodadPriority++;
#if XkbGeomMaxPriority < 255
- if (si->nextDoodadPriority>XkbGeomMaxPriority)
- si->nextDoodadPriority= XkbGeomMaxPriority;
+ if (si->nextDoodadPriority > XkbGeomMaxPriority)
+ si->nextDoodadPriority = XkbGeomMaxPriority;
#endif
}
- else {
- di->priority= info->nextPriority++;
- if (info->nextPriority>XkbGeomMaxPriority)
- info->nextPriority= XkbGeomMaxPriority;
+ else
+ {
+ di->priority = info->nextPriority++;
+ if (info->nextPriority > XkbGeomMaxPriority)
+ info->nextPriority = XkbGeomMaxPriority;
}
return;
}
static void
-ClearDoodadInfo(DoodadInfo *di)
+ClearDoodadInfo(DoodadInfo * di)
{
-CommonInfo defs;
+ CommonInfo defs;
- defs= di->defs;
- bzero(di,sizeof(DoodadInfo));
- di->defs= defs;
- di->defs.defined= 0;
+ defs = di->defs;
+ bzero(di, sizeof(DoodadInfo));
+ di->defs = defs;
+ di->defs.defined = 0;
return;
}
static void
-ClearOverlayInfo(OverlayInfo *ol)
+ClearOverlayInfo(OverlayInfo * ol)
{
- if (ol && ol->keys) {
- ol->keys= (OverlayKeyInfo *)ClearCommonInfo(&ol->keys->defs);
- ol->nKeys= 0;
+ if (ol && ol->keys)
+ {
+ ol->keys = (OverlayKeyInfo *) ClearCommonInfo(&ol->keys->defs);
+ ol->nKeys = 0;
}
return;
}
static void
-FreeDoodads(DoodadInfo *di,SectionInfo *si,GeometryInfo *info)
-{
-DoodadInfo * tmp;
-DoodadInfo * next;
-
- if (si) {
- if (si->doodads==di) {
- si->doodads= NULL;
- si->nDoodads= 0;
- }
- if (si->dfltDoodads==di)
- si->dfltDoodads= NULL;
- }
- if (info->doodads==di) {
- info->doodads= NULL;
- info->nDoodads= 0;
- }
- if (info->dfltDoodads==di)
- info->dfltDoodads= NULL;
- for (tmp=di;tmp!=NULL;tmp=next) {
- next= (DoodadInfo *)tmp->defs.next;
- ClearDoodadInfo(tmp);
- uFree(tmp);
+FreeDoodads(DoodadInfo * di, SectionInfo * si, GeometryInfo * info)
+{
+ DoodadInfo *tmp;
+ DoodadInfo *next;
+
+ if (si)
+ {
+ if (si->doodads == di)
+ {
+ si->doodads = NULL;
+ si->nDoodads = 0;
+ }
+ if (si->dfltDoodads == di)
+ si->dfltDoodads = NULL;
+ }
+ if (info->doodads == di)
+ {
+ info->doodads = NULL;
+ info->nDoodads = 0;
+ }
+ if (info->dfltDoodads == di)
+ info->dfltDoodads = NULL;
+ for (tmp = di; tmp != NULL; tmp = next)
+ {
+ next = (DoodadInfo *) tmp->defs.next;
+ ClearDoodadInfo(tmp);
+ uFree(tmp);
}
return;
}
static void
-InitSectionInfo(SectionInfo *si,GeometryInfo *info)
-{
- if (si!=&info->dfltSection) {
- *si= info->dfltSection;
- si->defs.defined&= ~_GS_Default;
- si->name= XkbInternAtom(info->dpy,"unknown",False);
- si->priority= info->nextPriority++;
- if (info->nextPriority>XkbGeomMaxPriority)
- info->nextPriority= XkbGeomMaxPriority;
- }
- else {
- bzero(si,sizeof(SectionInfo));
- si->defs.fileID= info->fileID;
- si->defs.merge= info->merge;
- si->defs.next= NULL;
- si->geometry= info;
- si->name= XkbInternAtom(info->dpy,"default",False);
- InitRowInfo(&si->dfltRow,si,info);
+InitSectionInfo(SectionInfo * si, GeometryInfo * info)
+{
+ if (si != &info->dfltSection)
+ {
+ *si = info->dfltSection;
+ si->defs.defined &= ~_GS_Default;
+ si->name = XkbInternAtom(info->dpy, "unknown", False);
+ si->priority = info->nextPriority++;
+ if (info->nextPriority > XkbGeomMaxPriority)
+ info->nextPriority = XkbGeomMaxPriority;
+ }
+ else
+ {
+ bzero(si, sizeof(SectionInfo));
+ si->defs.fileID = info->fileID;
+ si->defs.merge = info->merge;
+ si->defs.next = NULL;
+ si->geometry = info;
+ si->name = XkbInternAtom(info->dpy, "default", False);
+ InitRowInfo(&si->dfltRow, si, info);
}
return;
}
static void
-DupSectionInfo(SectionInfo *into,SectionInfo *from,GeometryInfo *info)
-{
-CommonInfo defs;
-
- defs= into->defs;
- *into= *from;
- into->defs.fileID= defs.fileID;
- into->defs.merge= defs.merge;
- into->defs.next= NULL;
- into->dfltRow.defs.fileID= defs.fileID;
- into->dfltRow.defs.merge= defs.merge;
- into->dfltRow.defs.next= NULL;
- into->dfltRow.section= into;
- into->dfltRow.dfltKey.defs.fileID= defs.fileID;
- into->dfltRow.dfltKey.defs.merge= defs.merge;
- into->dfltRow.dfltKey.defs.next= NULL;
- into->dfltRow.dfltKey.row= &into->dfltRow;
+DupSectionInfo(SectionInfo * into, SectionInfo * from, GeometryInfo * info)
+{
+ CommonInfo defs;
+
+ defs = into->defs;
+ *into = *from;
+ into->defs.fileID = defs.fileID;
+ into->defs.merge = defs.merge;
+ into->defs.next = NULL;
+ into->dfltRow.defs.fileID = defs.fileID;
+ into->dfltRow.defs.merge = defs.merge;
+ into->dfltRow.defs.next = NULL;
+ into->dfltRow.section = into;
+ into->dfltRow.dfltKey.defs.fileID = defs.fileID;
+ into->dfltRow.dfltKey.defs.merge = defs.merge;
+ into->dfltRow.dfltKey.defs.next = NULL;
+ into->dfltRow.dfltKey.row = &into->dfltRow;
return;
}
static void
-ClearSectionInfo(SectionInfo *si,GeometryInfo *info)
-{
-
- si->defs.defined&= ~_GS_Default;
- si->name= XkbInternAtom(info->dpy,"default",False);
- si->top= si->left= 0;
- si->width= si->height= 0;
- si->angle= 0;
- if (si->rows) {
- FreeRows(si->rows,si,info);
- si->rows= NULL;
- }
- ClearRowInfo(&si->dfltRow,info);
- if (si->doodads) {
- FreeDoodads(si->doodads,si,info);
- si->doodads= NULL;
- }
- si->dfltRow.defs.defined= _GR_Default;
+ClearSectionInfo(SectionInfo * si, GeometryInfo * info)
+{
+
+ si->defs.defined &= ~_GS_Default;
+ si->name = XkbInternAtom(info->dpy, "default", False);
+ si->top = si->left = 0;
+ si->width = si->height = 0;
+ si->angle = 0;
+ if (si->rows)
+ {
+ FreeRows(si->rows, si, info);
+ si->rows = NULL;
+ }
+ ClearRowInfo(&si->dfltRow, info);
+ if (si->doodads)
+ {
+ FreeDoodads(si->doodads, si, info);
+ si->doodads = NULL;
+ }
+ si->dfltRow.defs.defined = _GR_Default;
return;
}
static void
-FreeSections(SectionInfo *si,GeometryInfo *info)
+FreeSections(SectionInfo * si, GeometryInfo * info)
{
-SectionInfo * tmp;
-SectionInfo * next;
+ SectionInfo *tmp;
+ SectionInfo *next;
- if (si==info->sections) {
- info->nSections= 0;
- info->sections= NULL;
+ if (si == info->sections)
+ {
+ info->nSections = 0;
+ info->sections = NULL;
}
- for (tmp=si;tmp!=NULL;tmp=next) {
- ClearSectionInfo(tmp,info);
- next= (SectionInfo *)tmp->defs.next;
- uFree(tmp);
+ for (tmp = si; tmp != NULL; tmp = next)
+ {
+ ClearSectionInfo(tmp, info);
+ next = (SectionInfo *) tmp->defs.next;
+ uFree(tmp);
}
return;
}
static void
-FreeShapes(ShapeInfo *si,GeometryInfo *info)
-{
-ShapeInfo * tmp;
-ShapeInfo * next;
-
- if (si==info->shapes) {
- info->nShapes= 0;
- info->shapes= NULL;
- }
- for (tmp=si;tmp!=NULL;tmp=next) {
- if (tmp->outlines) {
- register int i;
- for (i=0;i<tmp->nOutlines;i++) {
- if (tmp->outlines[i].points!=NULL) {
- uFree(tmp->outlines[i].points);
- tmp->outlines[i].num_points= 0;
- tmp->outlines[i].points= NULL;
- }
- }
- uFree(tmp->outlines);
- tmp->szOutlines= 0;
- tmp->nOutlines= 0;
- tmp->outlines= NULL;
- tmp->primary= tmp->approx=NULL;
- }
- next= (ShapeInfo *)tmp->defs.next;
- uFree(tmp);
+FreeShapes(ShapeInfo * si, GeometryInfo * info)
+{
+ ShapeInfo *tmp;
+ ShapeInfo *next;
+
+ if (si == info->shapes)
+ {
+ info->nShapes = 0;
+ info->shapes = NULL;
+ }
+ for (tmp = si; tmp != NULL; tmp = next)
+ {
+ if (tmp->outlines)
+ {
+ register int i;
+ for (i = 0; i < tmp->nOutlines; i++)
+ {
+ if (tmp->outlines[i].points != NULL)
+ {
+ uFree(tmp->outlines[i].points);
+ tmp->outlines[i].num_points = 0;
+ tmp->outlines[i].points = NULL;
+ }
+ }
+ uFree(tmp->outlines);
+ tmp->szOutlines = 0;
+ tmp->nOutlines = 0;
+ tmp->outlines = NULL;
+ tmp->primary = tmp->approx = NULL;
+ }
+ next = (ShapeInfo *) tmp->defs.next;
+ uFree(tmp);
}
return;
}
@@ -618,300 +663,342 @@ ShapeInfo * next;
/***====================================================================***/
static void
-InitGeometryInfo(GeometryInfo *info,unsigned fileID,unsigned merge)
+InitGeometryInfo(GeometryInfo * info, unsigned fileID, unsigned merge)
{
- bzero(info,sizeof(GeometryInfo));
- info->fileID= fileID;
- info->merge= merge;
- InitSectionInfo(&info->dfltSection,info);
- info->dfltSection.defs.defined= _GS_Default;
+ bzero(info, sizeof(GeometryInfo));
+ info->fileID = fileID;
+ info->merge = merge;
+ InitSectionInfo(&info->dfltSection, info);
+ info->dfltSection.defs.defined = _GS_Default;
return;
}
static void
-ClearGeometryInfo(GeometryInfo *info)
+ClearGeometryInfo(GeometryInfo * info)
{
if (info->name)
- uFree(info->name);
- info->name= NULL;
+ uFree(info->name);
+ info->name = NULL;
if (info->props)
- FreeProperties(info->props,info);
+ FreeProperties(info->props, info);
if (info->shapes)
- FreeShapes(info->shapes,info);
+ FreeShapes(info->shapes, info);
if (info->sections)
- FreeSections(info->sections,info);
- info->widthMM= 0;
- info->heightMM= 0;
- info->dfltCornerRadius= 0;
- ClearSectionInfo(&info->dfltSection,info);
- info->dfltSection.defs.defined= _GS_Default;
+ FreeSections(info->sections, info);
+ info->widthMM = 0;
+ info->heightMM = 0;
+ info->dfltCornerRadius = 0;
+ ClearSectionInfo(&info->dfltSection, info);
+ info->dfltSection.defs.defined = _GS_Default;
if (info->aliases)
- ClearAliases(&info->aliases);
+ ClearAliases(&info->aliases);
return;
}
/***====================================================================***/
static PropertyInfo *
-NextProperty(GeometryInfo *info)
+NextProperty(GeometryInfo * info)
{
-PropertyInfo * pi;
+ PropertyInfo *pi;
- pi= uTypedAlloc(PropertyInfo);
- if (pi) {
- bzero((char *)pi,sizeof(PropertyInfo));
- info->props= (PropertyInfo *)AddCommonInfo(&info->props->defs,
- (CommonInfo *)pi);
- info->nProps++;
+ pi = uTypedAlloc(PropertyInfo);
+ if (pi)
+ {
+ bzero((char *) pi, sizeof(PropertyInfo));
+ info->props = (PropertyInfo *) AddCommonInfo(&info->props->defs,
+ (CommonInfo *) pi);
+ info->nProps++;
}
return pi;
}
static PropertyInfo *
-FindProperty(GeometryInfo *info,char *name)
+FindProperty(GeometryInfo * info, char *name)
{
-PropertyInfo * old;
+ PropertyInfo *old;
if (!name)
- return NULL;
- for (old= info->props;old!=NULL;old=(PropertyInfo *)old->defs.next) {
- if ((old->name)&&(uStringEqual(name,old->name)))
- return old;
+ return NULL;
+ for (old = info->props; old != NULL;
+ old = (PropertyInfo *) old->defs.next)
+ {
+ if ((old->name) && (uStringEqual(name, old->name)))
+ return old;
}
return NULL;
}
static Bool
-AddProperty(GeometryInfo *info,PropertyInfo *new)
-{
-PropertyInfo * old;
-
- if ((!new)||(!new->value)||(!new->name))
- return False;
- old= FindProperty(info,new->name);
- if (old!=NULL) {
- if ((new->defs.merge==MergeReplace)||(new->defs.merge==MergeOverride)) {
- if (((old->defs.fileID==new->defs.fileID)&&(warningLevel>0))||
- (warningLevel>9)) {
- WARN1("Multiple definitions for the \"%s\" property\n",
- new->name);
- ACTION2("Ignoring \"%s\", using \"%s\"\n",old->value,
- new->value);
- }
- if (old->value)
- uFree(old->value);
- old->value= uStringDup(new->value);
- return True;
- }
- if (((old->defs.fileID==new->defs.fileID)&&(warningLevel>0))||
- (warningLevel>9)) {
- WARN1("Multiple definitions for \"%s\" property\n",new->name);
- ACTION2("Using \"%s\", ignoring \"%s\" \n",old->value,new->value);
- }
- return True;
- }
- old= new;
- if ((new= NextProperty(info))==NULL)
- return False;
- new->defs.next= NULL;
- new->name= uStringDup(old->name);
- new->value= uStringDup(old->value);
+AddProperty(GeometryInfo * info, PropertyInfo * new)
+{
+ PropertyInfo *old;
+
+ if ((!new) || (!new->value) || (!new->name))
+ return False;
+ old = FindProperty(info, new->name);
+ if (old != NULL)
+ {
+ if ((new->defs.merge == MergeReplace)
+ || (new->defs.merge == MergeOverride))
+ {
+ if (((old->defs.fileID == new->defs.fileID)
+ && (warningLevel > 0)) || (warningLevel > 9))
+ {
+ WARN1("Multiple definitions for the \"%s\" property\n",
+ new->name);
+ ACTION2("Ignoring \"%s\", using \"%s\"\n", old->value,
+ new->value);
+ }
+ if (old->value)
+ uFree(old->value);
+ old->value = uStringDup(new->value);
+ return True;
+ }
+ if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+ || (warningLevel > 9))
+ {
+ WARN1("Multiple definitions for \"%s\" property\n", new->name);
+ ACTION2("Using \"%s\", ignoring \"%s\" \n", old->value,
+ new->value);
+ }
+ return True;
+ }
+ old = new;
+ if ((new = NextProperty(info)) == NULL)
+ return False;
+ new->defs.next = NULL;
+ new->name = uStringDup(old->name);
+ new->value = uStringDup(old->value);
return True;
}
/***====================================================================***/
static ShapeInfo *
-NextShape(GeometryInfo *info)
+NextShape(GeometryInfo * info)
{
-ShapeInfo * si;
+ ShapeInfo *si;
- si= uTypedAlloc(ShapeInfo);
- if (si) {
- bzero((char *)si,sizeof(ShapeInfo));
- info->shapes= (ShapeInfo *)AddCommonInfo(&info->shapes->defs,
- (CommonInfo *)si);
- info->nShapes++;
- si->dfltCornerRadius= info->dfltCornerRadius;
+ si = uTypedAlloc(ShapeInfo);
+ if (si)
+ {
+ bzero((char *) si, sizeof(ShapeInfo));
+ info->shapes = (ShapeInfo *) AddCommonInfo(&info->shapes->defs,
+ (CommonInfo *) si);
+ info->nShapes++;
+ si->dfltCornerRadius = info->dfltCornerRadius;
}
return si;
}
static ShapeInfo *
-FindShape(GeometryInfo *info, Atom name, const char *type, const char *which)
-{
-ShapeInfo * old;
-
- for (old= info->shapes;old!=NULL;old=(ShapeInfo *)old->defs.next) {
- if (name==old->name)
- return old;
- }
- if (type!=NULL) {
- old= info->shapes;
- WARN3("Unknown shape \"%s\" for %s %s\n",
- XkbAtomText(info->dpy,name,XkbMessage),type,which);
- if (old) {
- ACTION1("Using default shape %s instead\n",shText(info->dpy,old));
- return old;
- }
- ACTION("No default shape; definition ignored\n");
- return NULL;
+FindShape(GeometryInfo * info, Atom name, const char *type, const char *which)
+{
+ ShapeInfo *old;
+
+ for (old = info->shapes; old != NULL; old = (ShapeInfo *) old->defs.next)
+ {
+ if (name == old->name)
+ return old;
+ }
+ if (type != NULL)
+ {
+ old = info->shapes;
+ WARN3("Unknown shape \"%s\" for %s %s\n",
+ XkbAtomText(info->dpy, name, XkbMessage), type, which);
+ if (old)
+ {
+ ACTION1("Using default shape %s instead\n",
+ shText(info->dpy, old));
+ return old;
+ }
+ ACTION("No default shape; definition ignored\n");
+ return NULL;
}
return NULL;
}
static Bool
-AddShape(GeometryInfo *info,ShapeInfo *new)
-{
-ShapeInfo * old;
-
- old= FindShape(info,new->name,NULL,NULL);
- if (old!=NULL) {
- if ((new->defs.merge==MergeReplace)||(new->defs.merge==MergeOverride)) {
- ShapeInfo *next= (ShapeInfo *)old->defs.next;
- if (((old->defs.fileID==new->defs.fileID)&&(warningLevel>0))||
- (warningLevel>9)) {
- WARN1("Duplicate shape name \"%s\"\n",shText(info->dpy,old));
- ACTION("Using last definition\n");
- }
- *old= *new;
- old->defs.next= &next->defs;
- return True;
- }
- if (((old->defs.fileID==new->defs.fileID)&&(warningLevel>0))||
- (warningLevel>9)) {
- WARN1("Multiple shapes named \"%s\"\n",shText(info->dpy,old));
- ACTION("Using first definition\n");
- }
- return True;
- }
- old= new;
- if ((new= NextShape(info))==NULL)
- return False;
- *new= *old;
- new->defs.next= NULL;
- old->szOutlines= old->nOutlines= 0;
- old->outlines= NULL;
- old->approx= NULL;
- old->primary= NULL;
+AddShape(GeometryInfo * info, ShapeInfo * new)
+{
+ ShapeInfo *old;
+
+ old = FindShape(info, new->name, NULL, NULL);
+ if (old != NULL)
+ {
+ if ((new->defs.merge == MergeReplace)
+ || (new->defs.merge == MergeOverride))
+ {
+ ShapeInfo *next = (ShapeInfo *) old->defs.next;
+ if (((old->defs.fileID == new->defs.fileID)
+ && (warningLevel > 0)) || (warningLevel > 9))
+ {
+ WARN1("Duplicate shape name \"%s\"\n",
+ shText(info->dpy, old));
+ ACTION("Using last definition\n");
+ }
+ *old = *new;
+ old->defs.next = &next->defs;
+ return True;
+ }
+ if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+ || (warningLevel > 9))
+ {
+ WARN1("Multiple shapes named \"%s\"\n", shText(info->dpy, old));
+ ACTION("Using first definition\n");
+ }
+ return True;
+ }
+ old = new;
+ if ((new = NextShape(info)) == NULL)
+ return False;
+ *new = *old;
+ new->defs.next = NULL;
+ old->szOutlines = old->nOutlines = 0;
+ old->outlines = NULL;
+ old->approx = NULL;
+ old->primary = NULL;
return True;
}
/***====================================================================***/
static void
-ReplaceDoodad(DoodadInfo *into,DoodadInfo *from)
+ReplaceDoodad(DoodadInfo * into, DoodadInfo * from)
{
-CommonInfo * next;
+ CommonInfo *next;
- next= into->defs.next;
+ next = into->defs.next;
ClearDoodadInfo(into);
- *into= *from;
- into->defs.next= next;
- next= from->defs.next;
+ *into = *from;
+ into->defs.next = next;
+ next = from->defs.next;
ClearDoodadInfo(from);
- from->defs.next= next;
+ from->defs.next = next;
return;
}
static DoodadInfo *
-NextDfltDoodad(SectionInfo *si,GeometryInfo *info)
+NextDfltDoodad(SectionInfo * si, GeometryInfo * info)
{
-DoodadInfo * di;
+ DoodadInfo *di;
- di= uTypedCalloc(1,DoodadInfo);
- if (!di)
- return NULL;
- if (si) {
- si->dfltDoodads= (DoodadInfo *)AddCommonInfo(&si->dfltDoodads->defs,
- (CommonInfo *)di);
+ di = uTypedCalloc(1, DoodadInfo);
+ if (!di)
+ return NULL;
+ if (si)
+ {
+ si->dfltDoodads =
+ (DoodadInfo *) AddCommonInfo(&si->dfltDoodads->defs,
+ (CommonInfo *) di);
}
- else {
- info->dfltDoodads= (DoodadInfo *)AddCommonInfo(&info->dfltDoodads->defs,
- (CommonInfo *)di);
+ else
+ {
+ info->dfltDoodads =
+ (DoodadInfo *) AddCommonInfo(&info->dfltDoodads->defs,
+ (CommonInfo *) di);
}
return di;
}
static DoodadInfo *
-NextDoodad(SectionInfo *si,GeometryInfo *info)
-{
-DoodadInfo * di;
-
- di= uTypedCalloc(1,DoodadInfo);
- if (di) {
- if (si) {
- si->doodads= (DoodadInfo *)AddCommonInfo(&si->doodads->defs,
- (CommonInfo *)di);
- si->nDoodads++;
- }
- else {
- info->doodads= (DoodadInfo *)AddCommonInfo(&info->doodads->defs,
- (CommonInfo *)di);
- info->nDoodads++;
- }
+NextDoodad(SectionInfo * si, GeometryInfo * info)
+{
+ DoodadInfo *di;
+
+ di = uTypedCalloc(1, DoodadInfo);
+ if (di)
+ {
+ if (si)
+ {
+ si->doodads = (DoodadInfo *) AddCommonInfo(&si->doodads->defs,
+ (CommonInfo *) di);
+ si->nDoodads++;
+ }
+ else
+ {
+ info->doodads =
+ (DoodadInfo *) AddCommonInfo(&info->doodads->defs,
+ (CommonInfo *) di);
+ info->nDoodads++;
+ }
}
return di;
}
static Bool
-AddDoodad(SectionInfo *si,GeometryInfo *info,DoodadInfo *new)
-{
-DoodadInfo * old;
-
- old= FindDoodadByName((si?si->doodads:info->doodads),new->name);
- if (old!=NULL) {
- if ((new->defs.merge==MergeReplace)||(new->defs.merge==MergeOverride)) {
- if (((old->defs.fileID==new->defs.fileID)&&(warningLevel>0))||
- (warningLevel>9)) {
- WARN1("Multiple doodads named \"%s\"\n",
- XkbAtomText(info->dpy,old->name,XkbMessage));
- ACTION("Using last definition\n");
- }
- ReplaceDoodad(old,new);
- old->section= si;
- return True;
- }
- if (((old->defs.fileID==new->defs.fileID)&&(warningLevel>0))||
- (warningLevel>9)) {
- WARN1("Multiple doodads named \"%s\"\n",
- XkbAtomText(info->dpy,old->name,XkbMessage));
- ACTION("Using first definition\n");
- }
- return True;
- }
- old= new;
- if ((new= NextDoodad(si,info))==NULL)
- return False;
- ReplaceDoodad(new,old);
- new->section= si;
- new->defs.next= NULL;
+AddDoodad(SectionInfo * si, GeometryInfo * info, DoodadInfo * new)
+{
+ DoodadInfo *old;
+
+ old = FindDoodadByName((si ? si->doodads : info->doodads), new->name);
+ if (old != NULL)
+ {
+ if ((new->defs.merge == MergeReplace)
+ || (new->defs.merge == MergeOverride))
+ {
+ if (((old->defs.fileID == new->defs.fileID)
+ && (warningLevel > 0)) || (warningLevel > 9))
+ {
+ WARN1("Multiple doodads named \"%s\"\n",
+ XkbAtomText(info->dpy, old->name, XkbMessage));
+ ACTION("Using last definition\n");
+ }
+ ReplaceDoodad(old, new);
+ old->section = si;
+ return True;
+ }
+ if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+ || (warningLevel > 9))
+ {
+ WARN1("Multiple doodads named \"%s\"\n",
+ XkbAtomText(info->dpy, old->name, XkbMessage));
+ ACTION("Using first definition\n");
+ }
+ return True;
+ }
+ old = new;
+ if ((new = NextDoodad(si, info)) == NULL)
+ return False;
+ ReplaceDoodad(new, old);
+ new->section = si;
+ new->defs.next = NULL;
return True;
}
static DoodadInfo *
-FindDfltDoodadByTypeName(char *name,SectionInfo *si,GeometryInfo *info)
-{
-DoodadInfo * dflt;
-unsigned type;
-
- if (uStrCaseCmp(name,"outline")==0) type= XkbOutlineDoodad;
- else if (uStrCaseCmp(name,"solid")==0) type= XkbSolidDoodad;
- else if (uStrCaseCmp(name,"text")==0) type= XkbTextDoodad;
- else if (uStrCaseCmp(name,"indicator")==0) type= XkbIndicatorDoodad;
- else if (uStrCaseCmp(name,"logo")==0) type= XkbLogoDoodad;
- else 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) {
- dflt= NextDfltDoodad(si,info);
- if (dflt!=NULL) {
- dflt->name= None;
- dflt->type= type;
- }
+FindDfltDoodadByTypeName(char *name, SectionInfo * si, GeometryInfo * info)
+{
+ DoodadInfo *dflt;
+ unsigned type;
+
+ if (uStrCaseCmp(name, "outline") == 0)
+ type = XkbOutlineDoodad;
+ else if (uStrCaseCmp(name, "solid") == 0)
+ type = XkbSolidDoodad;
+ else if (uStrCaseCmp(name, "text") == 0)
+ type = XkbTextDoodad;
+ else if (uStrCaseCmp(name, "indicator") == 0)
+ type = XkbIndicatorDoodad;
+ else if (uStrCaseCmp(name, "logo") == 0)
+ type = XkbLogoDoodad;
+ else
+ 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)
+ {
+ dflt = NextDfltDoodad(si, info);
+ if (dflt != NULL)
+ {
+ dflt->name = None;
+ dflt->type = type;
+ }
}
return dflt;
}
@@ -919,55 +1006,66 @@ unsigned type;
/***====================================================================***/
static Bool
-AddOverlay(SectionInfo *si,GeometryInfo *info,OverlayInfo *new)
-{
-OverlayInfo * old;
-
- for (old=si->overlays;old!=NULL;old=(OverlayInfo *)old->defs.next) {
- if (old->name==new->name)
- break;
- }
- if (old!=NULL) {
- if ((new->defs.merge==MergeReplace)||(new->defs.merge==MergeOverride)) {
- if (((old->defs.fileID==new->defs.fileID)&&(warningLevel>0))||
- (warningLevel>9)) {
- WARN2("Multiple overlays named \"%s\" for section \"%s\"\n",
- XkbAtomText(info->dpy,old->name,XkbMessage),
- XkbAtomText(info->dpy,si->name,XkbMessage));
- ACTION("Using last definition\n");
- }
- ClearOverlayInfo(old);
- old->nKeys= new->nKeys;
- old->keys= new->keys;
- new->nKeys= 0;
- new->keys= NULL;
- return True;
- }
- if (((old->defs.fileID==new->defs.fileID)&&(warningLevel>0))||
- (warningLevel>9)) {
- WARN2("Multiple doodads named \"%s\" in section \"%s\"\n",
- XkbAtomText(info->dpy,old->name,XkbMessage),
- XkbAtomText(info->dpy,si->name,XkbMessage));
- ACTION("Using first definition\n");
- }
- return True;
- }
- old= new;
- new= uTypedCalloc(1,OverlayInfo);
- if (!new) {
- if (warningLevel>0) {
- WSGO("Couldn't allocate a new OverlayInfo\n");
- ACTION2("Overlay \"%s\" in section \"%s\" will be incomplete\n",
- XkbAtomText(info->dpy,old->name,XkbMessage),
- XkbAtomText(info->dpy,si->name,XkbMessage));
- }
- return False;
- }
- *new= *old;
- old->nKeys= 0;
- old->keys= NULL;
- si->overlays= (OverlayInfo *)AddCommonInfo(&si->overlays->defs,
- (CommonInfo *)new);
+AddOverlay(SectionInfo * si, GeometryInfo * info, OverlayInfo * new)
+{
+ OverlayInfo *old;
+
+ for (old = si->overlays; old != NULL;
+ old = (OverlayInfo *) old->defs.next)
+ {
+ if (old->name == new->name)
+ break;
+ }
+ if (old != NULL)
+ {
+ if ((new->defs.merge == MergeReplace)
+ || (new->defs.merge == MergeOverride))
+ {
+ if (((old->defs.fileID == new->defs.fileID)
+ && (warningLevel > 0)) || (warningLevel > 9))
+ {
+ WARN2
+ ("Multiple overlays named \"%s\" for section \"%s\"\n",
+ XkbAtomText(info->dpy, old->name, XkbMessage),
+ XkbAtomText(info->dpy, si->name, XkbMessage));
+ ACTION("Using last definition\n");
+ }
+ ClearOverlayInfo(old);
+ old->nKeys = new->nKeys;
+ old->keys = new->keys;
+ new->nKeys = 0;
+ new->keys = NULL;
+ return True;
+ }
+ if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+ || (warningLevel > 9))
+ {
+ WARN2("Multiple doodads named \"%s\" in section \"%s\"\n",
+ XkbAtomText(info->dpy, old->name, XkbMessage),
+ XkbAtomText(info->dpy, si->name, XkbMessage));
+ ACTION("Using first definition\n");
+ }
+ return True;
+ }
+ old = new;
+ new = uTypedCalloc(1, OverlayInfo);
+ if (!new)
+ {
+ if (warningLevel > 0)
+ {
+ WSGO("Couldn't allocate a new OverlayInfo\n");
+ ACTION2
+ ("Overlay \"%s\" in section \"%s\" will be incomplete\n",
+ XkbAtomText(info->dpy, old->name, XkbMessage),
+ XkbAtomText(info->dpy, si->name, XkbMessage));
+ }
+ return False;
+ }
+ *new = *old;
+ old->nKeys = 0;
+ old->keys = NULL;
+ si->overlays = (OverlayInfo *) AddCommonInfo(&si->overlays->defs,
+ (CommonInfo *) new);
si->nOverlays++;
return True;
}
@@ -975,79 +1073,91 @@ OverlayInfo * old;
/***====================================================================***/
static SectionInfo *
-NextSection(GeometryInfo *info)
-{
-SectionInfo * si;
-
- si= uTypedAlloc(SectionInfo);
- if (si) {
- *si= info->dfltSection;
- si->defs.defined&= ~_GS_Default;
- si->defs.next= NULL;
- si->nRows= 0;
- si->rows= NULL;
- info->sections= (SectionInfo *)AddCommonInfo(&info->sections->defs,
- (CommonInfo *)si);
- info->nSections++;
+NextSection(GeometryInfo * info)
+{
+ SectionInfo *si;
+
+ si = uTypedAlloc(SectionInfo);
+ if (si)
+ {
+ *si = info->dfltSection;
+ si->defs.defined &= ~_GS_Default;
+ si->defs.next = NULL;
+ si->nRows = 0;
+ si->rows = NULL;
+ info->sections =
+ (SectionInfo *) AddCommonInfo(&info->sections->defs,
+ (CommonInfo *) si);
+ info->nSections++;
}
return si;
}
static SectionInfo *
-FindMatchingSection(GeometryInfo *info,SectionInfo *new)
+FindMatchingSection(GeometryInfo * info, SectionInfo * new)
{
-SectionInfo * old;
+ SectionInfo *old;
- for (old=info->sections;old!=NULL;old=(SectionInfo *)old->defs.next) {
- if (new->name==old->name)
- return old;
+ for (old = info->sections; old != NULL;
+ old = (SectionInfo *) old->defs.next)
+ {
+ if (new->name == old->name)
+ return old;
}
return NULL;
}
static Bool
-AddSection(GeometryInfo *info,SectionInfo *new)
+AddSection(GeometryInfo * info, SectionInfo * new)
{
-SectionInfo * old;
+ SectionInfo *old;
- old= FindMatchingSection(info,new);
- if (old!=NULL) {
+ old = FindMatchingSection(info, new);
+ if (old != NULL)
+ {
#ifdef NOTDEF
- if ((new->defs.merge==MergeReplace)||(new->defs.merge==MergeOverride)) {
- SectionInfo *next= (SectionInfo *)old->defs.next;
- if (((old->defs.fileID==new->defs.fileID)&&(warningLevel>0))||
- (warningLevel>9)) {
- WARN1("Duplicate shape name \"%s\"\n",shText(info->dpy,old));
- ACTION("Using last definition\n");
- }
- *old= *new;
- old->defs.next= &next->defs;
- return True;
- }
- if (((old->defs.fileID==new->defs.fileID)&&(warningLevel>0))||
- (warningLevel>9)) {
- WARN1("Multiple shapes named \"%s\"\n",shText(info->dpy,old));
- ACTION("Using first definition\n");
- }
- return True;
+ if ((new->defs.merge == MergeReplace)
+ || (new->defs.merge == MergeOverride))
+ {
+ SectionInfo *next = (SectionInfo *) old->defs.next;
+ if (((old->defs.fileID == new->defs.fileID)
+ && (warningLevel > 0)) || (warningLevel > 9))
+ {
+ WARN1("Duplicate shape name \"%s\"\n",
+ shText(info->dpy, old));
+ ACTION("Using last definition\n");
+ }
+ *old = *new;
+ old->defs.next = &next->defs;
+ return True;
+ }
+ if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+ || (warningLevel > 9))
+ {
+ WARN1("Multiple shapes named \"%s\"\n", shText(info->dpy, old));
+ ACTION("Using first definition\n");
+ }
+ return True;
#else
- WARN("Don't know how to merge sections yet\n");
+ WARN("Don't know how to merge sections yet\n");
#endif
}
- old= new;
- if ((new= NextSection(info))==NULL)
- return False;
- *new= *old;
- new->defs.next= NULL;
- old->nRows= old->nDoodads= old->nOverlays= 0;
- old->rows= NULL;
- old->doodads= NULL;
- old->overlays= NULL;
- if (new->doodads) {
- DoodadInfo *di;
- for (di=new->doodads;di;di=(DoodadInfo *)di->defs.next) {
- di->section= new;
- }
+ old = new;
+ if ((new = NextSection(info)) == NULL)
+ return False;
+ *new = *old;
+ new->defs.next = NULL;
+ old->nRows = old->nDoodads = old->nOverlays = 0;
+ old->rows = NULL;
+ old->doodads = NULL;
+ old->overlays = NULL;
+ if (new->doodads)
+ {
+ DoodadInfo *di;
+ for (di = new->doodads; di; di = (DoodadInfo *) di->defs.next)
+ {
+ di->section = new;
+ }
}
return True;
}
@@ -1055,302 +1165,344 @@ SectionInfo * old;
/***====================================================================***/
static RowInfo *
-NextRow(SectionInfo *si)
-{
-RowInfo * row;
-
- row= uTypedAlloc(RowInfo);
- if (row) {
- *row= si->dfltRow;
- row->defs.defined&= ~_GR_Default;
- row->defs.next= NULL;
- row->nKeys= 0;
- row->keys= NULL;
- si->rows= (RowInfo *)AddCommonInfo(&si->rows->defs,(CommonInfo *)row);
- row->index= si->nRows++;
+NextRow(SectionInfo * si)
+{
+ RowInfo *row;
+
+ row = uTypedAlloc(RowInfo);
+ if (row)
+ {
+ *row = si->dfltRow;
+ row->defs.defined &= ~_GR_Default;
+ row->defs.next = NULL;
+ row->nKeys = 0;
+ row->keys = NULL;
+ si->rows =
+ (RowInfo *) AddCommonInfo(&si->rows->defs, (CommonInfo *) row);
+ row->index = si->nRows++;
}
return row;
}
static Bool
-AddRow(SectionInfo *si,RowInfo *new)
+AddRow(SectionInfo * si, RowInfo * new)
{
-RowInfo * old;
+ RowInfo *old;
- old= new;
- if ((new= NextRow(si))==NULL)
- return False;
- *new= *old;
- new->defs.next= NULL;
- old->nKeys= 0;
- old->keys= NULL;
+ old = new;
+ if ((new = NextRow(si)) == NULL)
+ return False;
+ *new = *old;
+ new->defs.next = NULL;
+ old->nKeys = 0;
+ old->keys = NULL;
return True;
}
/***====================================================================***/
static KeyInfo *
-NextKey(RowInfo *row)
+NextKey(RowInfo * row)
{
-KeyInfo * key;
+ KeyInfo *key;
- key= uTypedAlloc(KeyInfo);
- if (key) {
- *key= row->dfltKey;
- key->defs.defined&= ~_GK_Default;
- key->defs.next= NULL;
- key->index= row->nKeys++;
+ key = uTypedAlloc(KeyInfo);
+ if (key)
+ {
+ *key = row->dfltKey;
+ key->defs.defined &= ~_GK_Default;
+ key->defs.next = NULL;
+ key->index = row->nKeys++;
}
return key;
}
static Bool
-AddKey(RowInfo *row,KeyInfo *new)
+AddKey(RowInfo * row, KeyInfo * new)
{
-KeyInfo * old;
+ KeyInfo *old;
- old= new;
- if ((new= NextKey(row))==NULL)
- return False;
- *new= *old;
- new->defs.next= NULL;
- row->keys= (KeyInfo *)AddCommonInfo(&row->keys->defs,(CommonInfo *)new);
+ old = new;
+ if ((new = NextKey(row)) == NULL)
+ return False;
+ *new = *old;
+ new->defs.next = NULL;
+ row->keys =
+ (KeyInfo *) AddCommonInfo(&row->keys->defs, (CommonInfo *) new);
return True;
}
/***====================================================================***/
static void
-MergeIncludedGeometry(GeometryInfo *into,GeometryInfo *from,unsigned merge)
-{
-Bool clobber;
-
- if (from->errorCount>0) {
- into->errorCount+= from->errorCount;
- return;
- }
- clobber= (merge==MergeOverride)||(merge==MergeReplace);
- if (into->name==NULL) {
- into->name= from->name;
- from->name= NULL;
- }
- if ((into->widthMM==0)||((from->widthMM!=0)&&clobber))
- into->widthMM= from->widthMM;
- if ((into->heightMM==0)||((from->heightMM!=0)&&clobber))
- into->heightMM= from->heightMM;
- if ((into->font==None)||((from->font!=None)&&clobber))
- into->font= from->font;
- if ((into->fontSlant==None)||((from->fontSlant!=None)&&clobber))
- into->fontSlant= from->fontSlant;
- if ((into->fontWeight==None)||((from->fontWeight!=None)&&clobber))
- into->fontWeight= from->fontWeight;
- if ((into->fontSetWidth==None)||((from->fontSetWidth!=None)&&clobber))
- into->fontSetWidth= from->fontSetWidth;
- if ((into->fontVariant==None)||((from->fontVariant!=None)&&clobber))
- into->fontVariant= from->fontVariant;
- if ((into->fontSize==0)||((from->fontSize!=0)&&clobber))
- into->fontSize= from->fontSize;
- if ((into->fontEncoding==None)||((from->fontEncoding!=None)&&clobber))
- into->fontEncoding= from->fontEncoding;
- if ((into->fontSpec==None)||((from->fontSpec!=None)&&clobber))
- into->fontSpec= from->fontSpec;
- if ((into->baseColor==None)||((from->baseColor!=None)&&clobber))
- into->baseColor= from->baseColor;
- if ((into->labelColor==None)||((from->labelColor!=None)&&clobber))
- into->labelColor= from->labelColor;
- into->nextPriority= from->nextPriority;
- if (from->props!=NULL) {
- PropertyInfo *pi;
- for (pi=from->props;pi;pi=(PropertyInfo *)pi->defs.next) {
- if (!AddProperty(into,pi))
- into->errorCount++;
- }
- }
- if (from->shapes!=NULL) {
- ShapeInfo * si;
-
- for (si=from->shapes;si;si=(ShapeInfo *)si->defs.next) {
- if (!AddShape(into,si))
- into->errorCount++;
- }
- }
- if (from->sections!=NULL) {
- SectionInfo * si;
-
- for (si=from->sections;si;si=(SectionInfo *)si->defs.next) {
- if (!AddSection(into,si))
- into->errorCount++;
- }
- }
- if (from->doodads!=NULL) {
- DoodadInfo * di;
-
- for (di=from->doodads;di;di=(DoodadInfo *)di->defs.next) {
- if (!AddDoodad(NULL,into,di))
- into->errorCount++;
- }
- }
- if (!MergeAliases(&into->aliases,&from->aliases,merge))
- into->errorCount++;
+MergeIncludedGeometry(GeometryInfo * into, GeometryInfo * from,
+ unsigned merge)
+{
+ Bool clobber;
+
+ if (from->errorCount > 0)
+ {
+ into->errorCount += from->errorCount;
+ return;
+ }
+ clobber = (merge == MergeOverride) || (merge == MergeReplace);
+ if (into->name == NULL)
+ {
+ into->name = from->name;
+ from->name = NULL;
+ }
+ if ((into->widthMM == 0) || ((from->widthMM != 0) && clobber))
+ into->widthMM = from->widthMM;
+ if ((into->heightMM == 0) || ((from->heightMM != 0) && clobber))
+ into->heightMM = from->heightMM;
+ if ((into->font == None) || ((from->font != None) && clobber))
+ into->font = from->font;
+ if ((into->fontSlant == None) || ((from->fontSlant != None) && clobber))
+ into->fontSlant = from->fontSlant;
+ if ((into->fontWeight == None) || ((from->fontWeight != None) && clobber))
+ into->fontWeight = from->fontWeight;
+ if ((into->fontSetWidth == None)
+ || ((from->fontSetWidth != None) && clobber))
+ into->fontSetWidth = from->fontSetWidth;
+ if ((into->fontVariant == None)
+ || ((from->fontVariant != None) && clobber))
+ into->fontVariant = from->fontVariant;
+ if ((into->fontSize == 0) || ((from->fontSize != 0) && clobber))
+ into->fontSize = from->fontSize;
+ if ((into->fontEncoding == None)
+ || ((from->fontEncoding != None) && clobber))
+ into->fontEncoding = from->fontEncoding;
+ if ((into->fontSpec == None) || ((from->fontSpec != None) && clobber))
+ into->fontSpec = from->fontSpec;
+ if ((into->baseColor == None) || ((from->baseColor != None) && clobber))
+ into->baseColor = from->baseColor;
+ if ((into->labelColor == None) || ((from->labelColor != None) && clobber))
+ into->labelColor = from->labelColor;
+ into->nextPriority = from->nextPriority;
+ if (from->props != NULL)
+ {
+ PropertyInfo *pi;
+ for (pi = from->props; pi; pi = (PropertyInfo *) pi->defs.next)
+ {
+ if (!AddProperty(into, pi))
+ into->errorCount++;
+ }
+ }
+ if (from->shapes != NULL)
+ {
+ ShapeInfo *si;
+
+ for (si = from->shapes; si; si = (ShapeInfo *) si->defs.next)
+ {
+ if (!AddShape(into, si))
+ into->errorCount++;
+ }
+ }
+ if (from->sections != NULL)
+ {
+ SectionInfo *si;
+
+ for (si = from->sections; si; si = (SectionInfo *) si->defs.next)
+ {
+ if (!AddSection(into, si))
+ into->errorCount++;
+ }
+ }
+ if (from->doodads != NULL)
+ {
+ DoodadInfo *di;
+
+ for (di = from->doodads; di; di = (DoodadInfo *) di->defs.next)
+ {
+ if (!AddDoodad(NULL, into, di))
+ into->errorCount++;
+ }
+ }
+ if (!MergeAliases(&into->aliases, &from->aliases, merge))
+ into->errorCount++;
return;
}
-typedef void (*FileHandler)(
- XkbFile * /* file */,
- XkbDescPtr /* xkb */,
- unsigned /* merge */,
- GeometryInfo * /* info */
-);
+typedef void (*FileHandler) (XkbFile * /* file */ ,
+ XkbDescPtr /* xkb */ ,
+ unsigned /* merge */ ,
+ GeometryInfo * /* info */
+ );
static Bool
-HandleIncludeGeometry(IncludeStmt *stmt,XkbDescPtr xkb,GeometryInfo *info,
- FileHandler hndlr)
-{
-unsigned newMerge;
-XkbFile * rtrn;
-GeometryInfo included;
-Bool haveSelf;
-
- haveSelf= False;
- if ((stmt->file==NULL)&&(stmt->map==NULL)) {
- haveSelf= True;
- included= *info;
- bzero(info,sizeof(GeometryInfo));
- }
- else if (ProcessIncludeFile(stmt,XkmGeometryIndex,&rtrn,&newMerge)) {
- InitGeometryInfo(&included,rtrn->id,newMerge);
- included.nextPriority= info->nextPriority;
- included.dfltCornerRadius= info->dfltCornerRadius;
- DupSectionInfo(&included.dfltSection,&info->dfltSection,info);
- (*hndlr)(rtrn,xkb,MergeOverride,&included);
- if (stmt->stmt!=NULL) {
- if (included.name!=NULL)
- uFree(included.name);
- included.name= stmt->stmt;
- stmt->stmt= NULL;
- }
- }
- else {
- info->errorCount+= 10;
- return False;
- }
- if ((stmt->next!=NULL)&&(included.errorCount<1)) {
- IncludeStmt * next;
- unsigned op;
- GeometryInfo next_incl;
-
- for (next=stmt->next;next!=NULL;next=next->next) {
- if ((next->file==NULL)&&(next->map==NULL)) {
- haveSelf= True;
- MergeIncludedGeometry(&included,info,next->merge);
- ClearGeometryInfo(info);
- }
- else if (ProcessIncludeFile(next,XkmGeometryIndex,&rtrn,&op)) {
- InitGeometryInfo(&next_incl,rtrn->id,op);
- next_incl.nextPriority= included.nextPriority;
- next_incl.dfltCornerRadius= included.dfltCornerRadius;
- DupSectionInfo(&next_incl.dfltSection,&included.dfltSection,
- &included);
- (*hndlr)(rtrn,xkb,MergeOverride,&next_incl);
- MergeIncludedGeometry(&included,&next_incl,op);
- ClearGeometryInfo(&next_incl);
- }
- else {
- info->errorCount+= 10;
- return False;
- }
- }
+HandleIncludeGeometry(IncludeStmt * stmt, XkbDescPtr xkb, GeometryInfo * info,
+ FileHandler hndlr)
+{
+ unsigned newMerge;
+ XkbFile *rtrn;
+ GeometryInfo included;
+ Bool haveSelf;
+
+ haveSelf = False;
+ if ((stmt->file == NULL) && (stmt->map == NULL))
+ {
+ haveSelf = True;
+ included = *info;
+ bzero(info, sizeof(GeometryInfo));
+ }
+ else if (ProcessIncludeFile(stmt, XkmGeometryIndex, &rtrn, &newMerge))
+ {
+ InitGeometryInfo(&included, rtrn->id, newMerge);
+ included.nextPriority = info->nextPriority;
+ included.dfltCornerRadius = info->dfltCornerRadius;
+ DupSectionInfo(&included.dfltSection, &info->dfltSection, info);
+ (*hndlr) (rtrn, xkb, MergeOverride, &included);
+ if (stmt->stmt != NULL)
+ {
+ if (included.name != NULL)
+ uFree(included.name);
+ included.name = stmt->stmt;
+ stmt->stmt = NULL;
+ }
+ }
+ else
+ {
+ info->errorCount += 10;
+ return False;
+ }
+ if ((stmt->next != NULL) && (included.errorCount < 1))
+ {
+ IncludeStmt *next;
+ unsigned op;
+ GeometryInfo next_incl;
+
+ for (next = stmt->next; next != NULL; next = next->next)
+ {
+ if ((next->file == NULL) && (next->map == NULL))
+ {
+ haveSelf = True;
+ MergeIncludedGeometry(&included, info, next->merge);
+ ClearGeometryInfo(info);
+ }
+ else if (ProcessIncludeFile(next, XkmGeometryIndex, &rtrn, &op))
+ {
+ InitGeometryInfo(&next_incl, rtrn->id, op);
+ next_incl.nextPriority = included.nextPriority;
+ next_incl.dfltCornerRadius = included.dfltCornerRadius;
+ DupSectionInfo(&next_incl.dfltSection,
+ &included.dfltSection, &included);
+ (*hndlr) (rtrn, xkb, MergeOverride, &next_incl);
+ MergeIncludedGeometry(&included, &next_incl, op);
+ ClearGeometryInfo(&next_incl);
+ }
+ else
+ {
+ info->errorCount += 10;
+ return False;
+ }
+ }
}
if (haveSelf)
- *info= included;
- else {
- MergeIncludedGeometry(info,&included,newMerge);
- ClearGeometryInfo(&included);
+ *info = included;
+ else
+ {
+ MergeIncludedGeometry(info, &included, newMerge);
+ ClearGeometryInfo(&included);
}
- return (info->errorCount==0);
+ return (info->errorCount == 0);
}
static int
-SetShapeField( ShapeInfo * si,
- char * field,
- ExprDef * arrayNdx,
- ExprDef * value,
- GeometryInfo * info)
-{
-ExprResult tmp;
-
- if ((uStrCaseCmp(field,"radius")==0)||(uStrCaseCmp(field,"corner")==0)||
- (uStrCaseCmp(field,"cornerradius")==0)) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("key shape",field,shText(info->dpy,si));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("key shape",field,
- shText(info->dpy,si),"number");
- }
- if (si)
- si->dfltCornerRadius= tmp.ival;
- else info->dfltCornerRadius= tmp.ival;
- return True;
+SetShapeField(ShapeInfo * si,
+ char *field,
+ ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info)
+{
+ ExprResult tmp;
+
+ if ((uStrCaseCmp(field, "radius") == 0)
+ || (uStrCaseCmp(field, "corner") == 0)
+ || (uStrCaseCmp(field, "cornerradius") == 0))
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("key shape", field, shText(info->dpy, si));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("key shape", field,
+ shText(info->dpy, si), "number");
+ }
+ if (si)
+ si->dfltCornerRadius = tmp.ival;
+ else
+ info->dfltCornerRadius = tmp.ival;
+ return True;
}
info->errorCount++;
- return ReportBadField("key shape",field,shText(info->dpy,si));
+ return ReportBadField("key shape", field, shText(info->dpy, si));
}
static int
-SetShapeDoodadField( DoodadInfo * di,
- char * field,
- ExprDef * arrayNdx,
- ExprDef * value,
- SectionInfo * si,
- GeometryInfo * info)
-{
-ExprResult tmp;
-const char *typeName;
-
- typeName= (di->type==XkbSolidDoodad?"solid doodad":"outline doodad");
- if ((!uStrCaseCmp(field,"corner"))||(!uStrCaseCmp(field,"cornerradius"))) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray(typeName,field,ddText(info->dpy,di));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType(typeName,field,ddText(info->dpy,di),"number");
- }
- di->defs.defined|= _GD_Corner;
- di->corner= tmp.ival;
- return True;
- }
- else if (uStrCaseCmp(field,"angle")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray(typeName,field,ddText(info->dpy,di));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType(typeName,field,ddText(info->dpy,di),"number");
- }
- di->defs.defined|= _GD_Angle;
- di->angle= tmp.ival;
- return True;
- }
- else if (uStrCaseCmp(field,"shape")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray(typeName,field,ddText(info->dpy,di));
- }
- if (!ExprResolveString(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType(typeName,field,ddText(info->dpy,di),"string");
- }
- di->shape= XkbInternAtom(info->dpy,tmp.str,False);
- di->defs.defined|= _GD_Shape;
- return True;
- }
- return ReportBadField(typeName,field,ddText(info->dpy,di));
+SetShapeDoodadField(DoodadInfo * di,
+ char *field,
+ ExprDef * arrayNdx,
+ ExprDef * value, SectionInfo * si, GeometryInfo * info)
+{
+ ExprResult tmp;
+ const char *typeName;
+
+ typeName =
+ (di->type == XkbSolidDoodad ? "solid doodad" : "outline doodad");
+ if ((!uStrCaseCmp(field, "corner"))
+ || (!uStrCaseCmp(field, "cornerradius")))
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray(typeName, field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType(typeName, field, ddText(info->dpy, di),
+ "number");
+ }
+ di->defs.defined |= _GD_Corner;
+ di->corner = tmp.ival;
+ return True;
+ }
+ else if (uStrCaseCmp(field, "angle") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray(typeName, field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType(typeName, field, ddText(info->dpy, di),
+ "number");
+ }
+ di->defs.defined |= _GD_Angle;
+ di->angle = tmp.ival;
+ return True;
+ }
+ else if (uStrCaseCmp(field, "shape") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray(typeName, field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveString(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType(typeName, field, ddText(info->dpy, di),
+ "string");
+ }
+ di->shape = XkbInternAtom(info->dpy, tmp.str, False);
+ di->defs.defined |= _GD_Shape;
+ return True;
+ }
+ return ReportBadField(typeName, field, ddText(info->dpy, di));
}
#define FIELD_STRING 0
@@ -1358,873 +1510,1038 @@ const char *typeName;
#define FIELD_USHORT 2
static int
-SetTextDoodadField( DoodadInfo * di,
- char * field,
- ExprDef * arrayNdx,
- ExprDef * value,
- SectionInfo * si,
- GeometryInfo * info)
-{
-ExprResult tmp;
-unsigned def;
-unsigned type;
-char * typeName= "text doodad";
-union {
- Atom * str;
- short * ival;
- unsigned short * uval;
-} pField;
-
- if (uStrCaseCmp(field,"angle")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray(typeName,field,ddText(info->dpy,di));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType(typeName,field,ddText(info->dpy,di),"number");
- }
- di->defs.defined|= _GD_Angle;
- di->angle= tmp.ival;
- return True;
- }
- if (uStrCaseCmp(field,"width")==0) {
- type= FIELD_USHORT;
- pField.uval= &di->width;
- def= _GD_Width;
- }
- else if (uStrCaseCmp(field,"height")==0) {
- type= FIELD_USHORT;
- pField.uval= &di->height;
- def= _GD_Height;
- }
- else if (uStrCaseCmp(field,"text")==0) {
- type= FIELD_STRING;
- pField.str= &di->text;
- def= _GD_Text;
- }
- else if (uStrCaseCmp(field,"font")==0) {
- type= FIELD_STRING;
- pField.str= &di->font;
- def= _GD_Font;
- }
- else if ((uStrCaseCmp(field,"fontslant")==0)||
- (uStrCaseCmp(field,"slant")==0)) {
- type= FIELD_STRING;
- pField.str= &di->fontSlant;
- def= _GD_FontSlant;
- }
- else if ((uStrCaseCmp(field,"fontweight")==0)||
- (uStrCaseCmp(field,"weight")==0)) {
- type= FIELD_STRING;
- pField.str= &di->fontWeight;
- def= _GD_FontWeight;
- }
- else if ((uStrCaseCmp(field,"fontwidth")==0)||
- (uStrCaseCmp(field,"setwidth")==0)) {
- type= FIELD_STRING;
- pField.str= &di->fontSetWidth;
- def= _GD_FontSetWidth;
- }
- else if ((uStrCaseCmp(field,"fontvariant")==0)||
- (uStrCaseCmp(field,"variant")==0)) {
- type= FIELD_STRING;
- pField.str= &di->fontVariant;
- def= _GD_FontVariant;
- }
- else if ((uStrCaseCmp(field,"fontencoding")==0)||
- (uStrCaseCmp(field,"encoding")==0)) {
- type= FIELD_STRING;
- pField.str= &di->fontEncoding;
- def= _GD_FontEncoding;
- }
- else if ((uStrCaseCmp(field,"xfont")==0)||
- (uStrCaseCmp(field,"xfontname")==0)) {
- type= FIELD_STRING;
- pField.str= &di->fontSpec;
- def= _GD_FontSpec;
- }
- else if (uStrCaseCmp(field,"fontsize")==0) {
- type= FIELD_USHORT;
- pField.uval= &di->fontSize;
- def= _GD_FontSize;
- }
- else {
- return ReportBadField(typeName,field,ddText(info->dpy,di));
- }
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray(typeName,field,ddText(info->dpy,di));
- }
- if (type==FIELD_STRING) {
- if (!ExprResolveString(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType(typeName,field,ddText(info->dpy,di),
- "string");
- }
- di->defs.defined|= def;
- *pField.str= XkbInternAtom(NULL,tmp.str,False);
- }
- else {
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType(typeName,field,ddText(info->dpy,di),"number");
- }
- if ((type==FIELD_USHORT)&&(tmp.ival<0)) {
- info->errorCount++;
- return
- ReportBadType(typeName,field,ddText(info->dpy,di),"unsigned");
- }
- di->defs.defined|= def;
- if (type==FIELD_USHORT)
- *pField.uval= tmp.uval;
- else *pField.ival= tmp.ival;
+SetTextDoodadField(DoodadInfo * di,
+ char *field,
+ ExprDef * arrayNdx,
+ ExprDef * value, SectionInfo * si, GeometryInfo * info)
+{
+ ExprResult tmp;
+ unsigned def;
+ unsigned type;
+ char *typeName = "text doodad";
+ union
+ {
+ Atom *str;
+ short *ival;
+ unsigned short *uval;
+ } pField;
+
+ if (uStrCaseCmp(field, "angle") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray(typeName, field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType(typeName, field, ddText(info->dpy, di),
+ "number");
+ }
+ di->defs.defined |= _GD_Angle;
+ di->angle = tmp.ival;
+ return True;
+ }
+ if (uStrCaseCmp(field, "width") == 0)
+ {
+ type = FIELD_USHORT;
+ pField.uval = &di->width;
+ def = _GD_Width;
+ }
+ else if (uStrCaseCmp(field, "height") == 0)
+ {
+ type = FIELD_USHORT;
+ pField.uval = &di->height;
+ def = _GD_Height;
+ }
+ else if (uStrCaseCmp(field, "text") == 0)
+ {
+ type = FIELD_STRING;
+ pField.str = &di->text;
+ def = _GD_Text;
+ }
+ else if (uStrCaseCmp(field, "font") == 0)
+ {
+ type = FIELD_STRING;
+ pField.str = &di->font;
+ def = _GD_Font;
+ }
+ else if ((uStrCaseCmp(field, "fontslant") == 0) ||
+ (uStrCaseCmp(field, "slant") == 0))
+ {
+ type = FIELD_STRING;
+ pField.str = &di->fontSlant;
+ def = _GD_FontSlant;
+ }
+ else if ((uStrCaseCmp(field, "fontweight") == 0) ||
+ (uStrCaseCmp(field, "weight") == 0))
+ {
+ type = FIELD_STRING;
+ pField.str = &di->fontWeight;
+ def = _GD_FontWeight;
+ }
+ else if ((uStrCaseCmp(field, "fontwidth") == 0) ||
+ (uStrCaseCmp(field, "setwidth") == 0))
+ {
+ type = FIELD_STRING;
+ pField.str = &di->fontSetWidth;
+ def = _GD_FontSetWidth;
+ }
+ else if ((uStrCaseCmp(field, "fontvariant") == 0) ||
+ (uStrCaseCmp(field, "variant") == 0))
+ {
+ type = FIELD_STRING;
+ pField.str = &di->fontVariant;
+ def = _GD_FontVariant;
+ }
+ else if ((uStrCaseCmp(field, "fontencoding") == 0) ||
+ (uStrCaseCmp(field, "encoding") == 0))
+ {
+ type = FIELD_STRING;
+ pField.str = &di->fontEncoding;
+ def = _GD_FontEncoding;
+ }
+ else if ((uStrCaseCmp(field, "xfont") == 0) ||
+ (uStrCaseCmp(field, "xfontname") == 0))
+ {
+ type = FIELD_STRING;
+ pField.str = &di->fontSpec;
+ def = _GD_FontSpec;
+ }
+ else if (uStrCaseCmp(field, "fontsize") == 0)
+ {
+ type = FIELD_USHORT;
+ pField.uval = &di->fontSize;
+ def = _GD_FontSize;
+ }
+ else
+ {
+ return ReportBadField(typeName, field, ddText(info->dpy, di));
+ }
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray(typeName, field, ddText(info->dpy, di));
+ }
+ if (type == FIELD_STRING)
+ {
+ if (!ExprResolveString(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType(typeName, field, ddText(info->dpy, di),
+ "string");
+ }
+ di->defs.defined |= def;
+ *pField.str = XkbInternAtom(NULL, tmp.str, False);
+ }
+ else
+ {
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType(typeName, field, ddText(info->dpy, di),
+ "number");
+ }
+ if ((type == FIELD_USHORT) && (tmp.ival < 0))
+ {
+ info->errorCount++;
+ return
+ ReportBadType(typeName, field, ddText(info->dpy, di),
+ "unsigned");
+ }
+ di->defs.defined |= def;
+ if (type == FIELD_USHORT)
+ *pField.uval = tmp.uval;
+ else
+ *pField.ival = tmp.ival;
}
return True;
}
static int
-SetIndicatorDoodadField( DoodadInfo * di,
- char * field,
- ExprDef * arrayNdx,
- ExprDef * value,
- SectionInfo * si,
- GeometryInfo * info)
-{
-ExprResult tmp;
-
- if ((uStrCaseCmp(field,"oncolor")==0)||(uStrCaseCmp(field,"offcolor")==0)
- ||(uStrCaseCmp(field,"shape")==0)) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("indicator doodad",field,
- ddText(info->dpy,di));
- }
- if (!ExprResolveString(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("indicator doodad",field,ddText(info->dpy,di),
- "string");
- }
- if (uStrCaseCmp(field,"oncolor")==0) {
- di->defs.defined|= _GD_Color;
- di->color= XkbInternAtom(NULL,tmp.str,False);
- }
- else if (uStrCaseCmp(field,"offcolor")==0) {
- di->defs.defined|= _GD_OffColor;
- di->offColor= XkbInternAtom(NULL,tmp.str,False);
- }
- else if (uStrCaseCmp(field,"shape")==0) {
- di->defs.defined|= _GD_Shape;
- di->shape= XkbInternAtom(info->dpy,tmp.str,False);
- }
- return True;
- }
- return ReportBadField("indicator doodad",field,ddText(info->dpy,di));
+SetIndicatorDoodadField(DoodadInfo * di,
+ char *field,
+ ExprDef * arrayNdx,
+ ExprDef * value,
+ SectionInfo * si, GeometryInfo * info)
+{
+ ExprResult tmp;
+
+ if ((uStrCaseCmp(field, "oncolor") == 0)
+ || (uStrCaseCmp(field, "offcolor") == 0)
+ || (uStrCaseCmp(field, "shape") == 0))
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("indicator doodad", field,
+ ddText(info->dpy, di));
+ }
+ if (!ExprResolveString(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("indicator doodad", field,
+ ddText(info->dpy, di), "string");
+ }
+ if (uStrCaseCmp(field, "oncolor") == 0)
+ {
+ di->defs.defined |= _GD_Color;
+ di->color = XkbInternAtom(NULL, tmp.str, False);
+ }
+ else if (uStrCaseCmp(field, "offcolor") == 0)
+ {
+ di->defs.defined |= _GD_OffColor;
+ di->offColor = XkbInternAtom(NULL, tmp.str, False);
+ }
+ else if (uStrCaseCmp(field, "shape") == 0)
+ {
+ di->defs.defined |= _GD_Shape;
+ di->shape = XkbInternAtom(info->dpy, tmp.str, False);
+ }
+ return True;
+ }
+ return ReportBadField("indicator doodad", field, ddText(info->dpy, di));
}
static int
-SetLogoDoodadField( DoodadInfo * di,
- char * field,
- ExprDef * arrayNdx,
- ExprDef * value,
- SectionInfo * si,
- GeometryInfo * info)
-{
-ExprResult tmp;
-char * typeName= "logo doodad";
-
- if ((!uStrCaseCmp(field,"corner"))||(!uStrCaseCmp(field,"cornerradius"))) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray(typeName,field,ddText(info->dpy,di));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType(typeName,field,ddText(info->dpy,di),"number");
- }
- di->defs.defined|= _GD_Corner;
- di->corner= tmp.ival;
- return True;
- }
- else if (uStrCaseCmp(field,"angle")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray(typeName,field,ddText(info->dpy,di));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType(typeName,field,ddText(info->dpy,di),"number");
- }
- di->defs.defined|= _GD_Angle;
- di->angle= tmp.ival;
- return True;
- }
- else if (uStrCaseCmp(field,"shape")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray(typeName,field,ddText(info->dpy,di));
- }
- if (!ExprResolveString(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType(typeName,field,ddText(info->dpy,di),"string");
- }
- di->shape= XkbInternAtom(info->dpy,tmp.str,False);
- di->defs.defined|= _GD_Shape;
- return True;
- }
- else if ((!uStrCaseCmp(field,"logoname"))||(!uStrCaseCmp(field,"name"))) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray(typeName,field,ddText(info->dpy,di));
- }
- if (!ExprResolveString(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType(typeName,field,ddText(info->dpy,di),"string");
- }
- di->logoName= uStringDup(tmp.str);
- return True;
- }
- return ReportBadField(typeName,field,ddText(info->dpy,di));
+SetLogoDoodadField(DoodadInfo * di,
+ char *field,
+ ExprDef * arrayNdx,
+ ExprDef * value, SectionInfo * si, GeometryInfo * info)
+{
+ ExprResult tmp;
+ char *typeName = "logo doodad";
+
+ if ((!uStrCaseCmp(field, "corner"))
+ || (!uStrCaseCmp(field, "cornerradius")))
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray(typeName, field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType(typeName, field, ddText(info->dpy, di),
+ "number");
+ }
+ di->defs.defined |= _GD_Corner;
+ di->corner = tmp.ival;
+ return True;
+ }
+ else if (uStrCaseCmp(field, "angle") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray(typeName, field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType(typeName, field, ddText(info->dpy, di),
+ "number");
+ }
+ di->defs.defined |= _GD_Angle;
+ di->angle = tmp.ival;
+ return True;
+ }
+ else if (uStrCaseCmp(field, "shape") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray(typeName, field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveString(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType(typeName, field, ddText(info->dpy, di),
+ "string");
+ }
+ di->shape = XkbInternAtom(info->dpy, tmp.str, False);
+ di->defs.defined |= _GD_Shape;
+ return True;
+ }
+ else if ((!uStrCaseCmp(field, "logoname"))
+ || (!uStrCaseCmp(field, "name")))
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray(typeName, field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveString(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType(typeName, field, ddText(info->dpy, di),
+ "string");
+ }
+ di->logoName = uStringDup(tmp.str);
+ return True;
+ }
+ return ReportBadField(typeName, field, ddText(info->dpy, di));
}
static int
-SetDoodadField( DoodadInfo * di,
- char * field,
- ExprDef * arrayNdx,
- ExprDef * value,
- SectionInfo * si,
- GeometryInfo * info)
-{
-ExprResult tmp;
-
- if (uStrCaseCmp(field,"priority")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("doodad",field,ddText(info->dpy,di));
- }
- if (!ExprResolveInteger(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("doodad",field,ddText(info->dpy,di),"integer");
- }
- if ((tmp.ival<0)||(tmp.ival>XkbGeomMaxPriority)) {
- info->errorCount++;
- ERROR2("Doodad priority %d out of range (must be 0..%d)\n",
- tmp.ival,XkbGeomMaxPriority);
- ACTION1("Priority for doodad %s not changed",ddText(info->dpy,di));
- return False;
- }
- di->defs.defined|= _GD_Priority;
- di->priority= tmp.ival;
- return True;
- }
- else if (uStrCaseCmp(field,"left")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("doodad",field,ddText(info->dpy,di));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("doodad",field,ddText(info->dpy,di),"number");
- }
- di->defs.defined|= _GD_Left;
- di->left= tmp.ival;
- return True;
- }
- else if (uStrCaseCmp(field,"top")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("doodad",field,ddText(info->dpy,di));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("doodad",field,ddText(info->dpy,di),"number");
- }
- di->defs.defined|= _GD_Top;
- di->top= tmp.ival;
- return True;
- }
- else if (uStrCaseCmp(field,"color")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("doodad",field,ddText(info->dpy,di));
- }
- if (!ExprResolveString(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("doodad",field,ddText(info->dpy,di),"string");
- }
- di->defs.defined|= _GD_Color;
- di->color= XkbInternAtom(NULL,tmp.str,False);
- return True;
- }
- switch (di->type) {
- case XkbOutlineDoodad:
- case XkbSolidDoodad:
- return SetShapeDoodadField(di,field,arrayNdx,value,si,info);
- case XkbTextDoodad:
- return SetTextDoodadField(di,field,arrayNdx,value,si,info);
- case XkbIndicatorDoodad:
- return SetIndicatorDoodadField(di,field,arrayNdx,value,si,info);
- case XkbLogoDoodad:
- return SetLogoDoodadField(di,field,arrayNdx,value,si,info);
- }
- WSGO1("Unknown doodad type %d in SetDoodadField\n",(unsigned int)di->type);
- ACTION2("Definition of %s in %s ignored\n",field,ddText(info->dpy,di));
+SetDoodadField(DoodadInfo * di,
+ char *field,
+ ExprDef * arrayNdx,
+ ExprDef * value, SectionInfo * si, GeometryInfo * info)
+{
+ ExprResult tmp;
+
+ if (uStrCaseCmp(field, "priority") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("doodad", field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveInteger(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("doodad", field, ddText(info->dpy, di),
+ "integer");
+ }
+ if ((tmp.ival < 0) || (tmp.ival > XkbGeomMaxPriority))
+ {
+ info->errorCount++;
+ ERROR2("Doodad priority %d out of range (must be 0..%d)\n",
+ tmp.ival, XkbGeomMaxPriority);
+ ACTION1("Priority for doodad %s not changed",
+ ddText(info->dpy, di));
+ return False;
+ }
+ di->defs.defined |= _GD_Priority;
+ di->priority = tmp.ival;
+ return True;
+ }
+ else if (uStrCaseCmp(field, "left") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("doodad", field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("doodad", field, ddText(info->dpy, di),
+ "number");
+ }
+ di->defs.defined |= _GD_Left;
+ di->left = tmp.ival;
+ return True;
+ }
+ else if (uStrCaseCmp(field, "top") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("doodad", field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("doodad", field, ddText(info->dpy, di),
+ "number");
+ }
+ di->defs.defined |= _GD_Top;
+ di->top = tmp.ival;
+ return True;
+ }
+ else if (uStrCaseCmp(field, "color") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("doodad", field, ddText(info->dpy, di));
+ }
+ if (!ExprResolveString(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("doodad", field, ddText(info->dpy, di),
+ "string");
+ }
+ di->defs.defined |= _GD_Color;
+ di->color = XkbInternAtom(NULL, tmp.str, False);
+ return True;
+ }
+ switch (di->type)
+ {
+ case XkbOutlineDoodad:
+ case XkbSolidDoodad:
+ return SetShapeDoodadField(di, field, arrayNdx, value, si, info);
+ case XkbTextDoodad:
+ return SetTextDoodadField(di, field, arrayNdx, value, si, info);
+ case XkbIndicatorDoodad:
+ return SetIndicatorDoodadField(di, field, arrayNdx, value, si, info);
+ case XkbLogoDoodad:
+ return SetLogoDoodadField(di, field, arrayNdx, value, si, info);
+ }
+ WSGO1("Unknown doodad type %d in SetDoodadField\n",
+ (unsigned int) di->type);
+ ACTION2("Definition of %s in %s ignored\n", field, ddText(info->dpy, di));
return False;
}
static int
-SetSectionField( SectionInfo * si,
- char * field,
- ExprDef * arrayNdx,
- ExprDef * value,
- GeometryInfo * info)
-{
-unsigned short * pField;
-unsigned def;
-ExprResult tmp;
-
- pField= NULL;
- def= 0;
- if (uStrCaseCmp(field,"priority")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard section",field,scText(info->dpy,si));
- }
- if (!ExprResolveInteger(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- ReportBadType("keyboard section",field,scText(info->dpy,si),
- "integer");
- return False;
- }
- if ((tmp.ival<0)||(tmp.ival>XkbGeomMaxPriority)) {
- info->errorCount++;
- ERROR2("Section priority %d out of range (must be 0..%d)\n",
- tmp.ival,XkbGeomMaxPriority);
- ACTION1("Priority for section %s not changed",scText(info->dpy,si));
- return False;
- }
- si->priority= tmp.ival;
- si->defs.defined|= _GS_Priority;
- return True;
- }
- else if (uStrCaseCmp(field,"top")==0) {
- pField= &si->top;
- def= _GS_Top;
- }
- else if (uStrCaseCmp(field,"left")==0) {
- pField= &si->left;
- def= _GS_Left;
- }
- else if (uStrCaseCmp(field,"width")==0) {
- pField= &si->width;
- def= _GS_Width;
- }
- else if (uStrCaseCmp(field,"height")==0) {
- pField= &si->height;
- def= _GS_Height;
- }
- else if (uStrCaseCmp(field,"angle")==0) {
- pField= &si->angle;
- def= _GS_Angle;
- }
- else {
- info->errorCount++;
- return ReportBadField("keyboard section",field,scText(info->dpy,si));
- }
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard section",field,scText(info->dpy,si));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- ReportBadType("keyboard section",field,scText(info->dpy,si),"number");
- return False;
- }
- si->defs.defined|= def;
- *pField= tmp.uval;
+SetSectionField(SectionInfo * si,
+ char *field,
+ ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info)
+{
+ unsigned short *pField;
+ unsigned def;
+ ExprResult tmp;
+
+ pField = NULL;
+ def = 0;
+ if (uStrCaseCmp(field, "priority") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard section", field,
+ scText(info->dpy, si));
+ }
+ if (!ExprResolveInteger(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ ReportBadType("keyboard section", field,
+ scText(info->dpy, si), "integer");
+ return False;
+ }
+ if ((tmp.ival < 0) || (tmp.ival > XkbGeomMaxPriority))
+ {
+ info->errorCount++;
+ ERROR2("Section priority %d out of range (must be 0..%d)\n",
+ tmp.ival, XkbGeomMaxPriority);
+ ACTION1("Priority for section %s not changed",
+ scText(info->dpy, si));
+ return False;
+ }
+ si->priority = tmp.ival;
+ si->defs.defined |= _GS_Priority;
+ return True;
+ }
+ else if (uStrCaseCmp(field, "top") == 0)
+ {
+ pField = &si->top;
+ def = _GS_Top;
+ }
+ else if (uStrCaseCmp(field, "left") == 0)
+ {
+ pField = &si->left;
+ def = _GS_Left;
+ }
+ else if (uStrCaseCmp(field, "width") == 0)
+ {
+ pField = &si->width;
+ def = _GS_Width;
+ }
+ else if (uStrCaseCmp(field, "height") == 0)
+ {
+ pField = &si->height;
+ def = _GS_Height;
+ }
+ else if (uStrCaseCmp(field, "angle") == 0)
+ {
+ pField = &si->angle;
+ def = _GS_Angle;
+ }
+ else
+ {
+ info->errorCount++;
+ return ReportBadField("keyboard section", field,
+ scText(info->dpy, si));
+ }
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard section", field,
+ scText(info->dpy, si));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ ReportBadType("keyboard section", field, scText(info->dpy, si),
+ "number");
+ return False;
+ }
+ si->defs.defined |= def;
+ *pField = tmp.uval;
return True;
}
static int
-SetRowField( RowInfo * row,
- char * field,
- ExprDef * arrayNdx,
- ExprDef * value,
- GeometryInfo * info)
-{
-ExprResult tmp;
-
- if (uStrCaseCmp(field,"top")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard row",field,rowText(info->dpy,row));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("keyboard row",field,rowText(info->dpy,row),
- "number");
- }
- row->defs.defined|= _GR_Top;
- row->top= tmp.uval;
- }
- else if (uStrCaseCmp(field,"left")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard row",field,rowText(info->dpy,row));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("keyboard row",field,rowText(info->dpy,row),
- "number");
- }
- row->defs.defined|= _GR_Left;
- row->left= tmp.uval;
- }
- else if (uStrCaseCmp(field,"vertical")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard row",field,rowText(info->dpy,row));
- }
- if (!ExprResolveBoolean(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("keyboard row",field,rowText(info->dpy,row),
- "boolean");
- }
- row->defs.defined|= _GR_Vertical;
- row->vertical= tmp.uval;
- }
- else {
- info->errorCount++;
- return ReportBadField("keyboard row",field,rowText(info->dpy,row));
+SetRowField(RowInfo * row,
+ char *field,
+ ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info)
+{
+ ExprResult tmp;
+
+ if (uStrCaseCmp(field, "top") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard row", field,
+ rowText(info->dpy, row));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("keyboard row", field,
+ rowText(info->dpy, row), "number");
+ }
+ row->defs.defined |= _GR_Top;
+ row->top = tmp.uval;
+ }
+ else if (uStrCaseCmp(field, "left") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard row", field,
+ rowText(info->dpy, row));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("keyboard row", field,
+ rowText(info->dpy, row), "number");
+ }
+ row->defs.defined |= _GR_Left;
+ row->left = tmp.uval;
+ }
+ else if (uStrCaseCmp(field, "vertical") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard row", field,
+ rowText(info->dpy, row));
+ }
+ if (!ExprResolveBoolean(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("keyboard row", field,
+ rowText(info->dpy, row), "boolean");
+ }
+ row->defs.defined |= _GR_Vertical;
+ row->vertical = tmp.uval;
+ }
+ else
+ {
+ info->errorCount++;
+ return ReportBadField("keyboard row", field, rowText(info->dpy, row));
}
return True;
}
static int
-SetKeyField( KeyInfo *key,
- const char *field,
- ExprDef *arrayNdx,
- ExprDef *value,
- GeometryInfo *info)
-{
-ExprResult tmp;
-
- if (uStrCaseCmp(field,"gap")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("key",field,keyText(key));
- }
- if (!ExprResolveFloat(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("key",field,keyText(key),"number");
- }
- key->defs.defined|= _GK_Gap;
- key->gap= tmp.ival;
- }
- else if (uStrCaseCmp(field,"shape")==0) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("key",field,keyText(key));
- }
- if (!ExprResolveString(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("key",field,keyText(key),"string");
- }
- key->defs.defined|= _GK_Shape;
- key->shape= XkbInternAtom(info->dpy,tmp.str,False);
- }
- else if ((uStrCaseCmp(field,"color")==0)||
- (uStrCaseCmp(field,"keycolor")==0)) {
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("key",field,keyText(key));
- }
- if (!ExprResolveString(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("key",field,keyText(key),"string");
- }
- key->defs.defined|= _GK_Color;
- key->color= XkbInternAtom(NULL,tmp.str,False);
- }
- else if ((uStrCaseCmp(field,"name")==0)||(uStrCaseCmp(field,"keyname")==0)){
- if (arrayNdx!=NULL) {
- info->errorCount++;
- return ReportNotArray("key",field,keyText(key));
- }
- if (!ExprResolveKeyName(value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("key",field,keyText(key),"key name");
- }
- key->defs.defined|= _GK_Name;
- bzero(key->name,XkbKeyNameLength+1);
- strncpy(key->name,tmp.keyName.name,XkbKeyNameLength);
- }
- else {
- info->errorCount++;
- return ReportBadField("key",field,keyText(key));
+SetKeyField(KeyInfo * key,
+ const char *field,
+ ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info)
+{
+ ExprResult tmp;
+
+ if (uStrCaseCmp(field, "gap") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("key", field, keyText(key));
+ }
+ if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("key", field, keyText(key), "number");
+ }
+ key->defs.defined |= _GK_Gap;
+ key->gap = tmp.ival;
+ }
+ else if (uStrCaseCmp(field, "shape") == 0)
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("key", field, keyText(key));
+ }
+ if (!ExprResolveString(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("key", field, keyText(key), "string");
+ }
+ key->defs.defined |= _GK_Shape;
+ key->shape = XkbInternAtom(info->dpy, tmp.str, False);
+ }
+ else if ((uStrCaseCmp(field, "color") == 0) ||
+ (uStrCaseCmp(field, "keycolor") == 0))
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("key", field, keyText(key));
+ }
+ if (!ExprResolveString(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("key", field, keyText(key), "string");
+ }
+ key->defs.defined |= _GK_Color;
+ key->color = XkbInternAtom(NULL, tmp.str, False);
+ }
+ else if ((uStrCaseCmp(field, "name") == 0)
+ || (uStrCaseCmp(field, "keyname") == 0))
+ {
+ if (arrayNdx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("key", field, keyText(key));
+ }
+ if (!ExprResolveKeyName(value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("key", field, keyText(key), "key name");
+ }
+ key->defs.defined |= _GK_Name;
+ bzero(key->name, XkbKeyNameLength + 1);
+ strncpy(key->name, tmp.keyName.name, XkbKeyNameLength);
+ }
+ else
+ {
+ info->errorCount++;
+ return ReportBadField("key", field, keyText(key));
}
return True;
}
static int
-SetGeometryProperty(GeometryInfo *info,char *property,ExprDef *value)
+SetGeometryProperty(GeometryInfo * info, char *property, ExprDef * value)
{
-PropertyInfo pi;
-ExprResult result;
+ PropertyInfo pi;
+ ExprResult result;
- InitPropertyInfo(&pi,info);
- pi.name= property;
- if (!ExprResolveString(value,&result,NULL,NULL)) {
- info->errorCount++;
- ERROR("Property values must be type string\n");
- ACTION1("Ignoring illegal definition of \"%s\" property\n",property);
- return False;
+ InitPropertyInfo(&pi, info);
+ pi.name = property;
+ if (!ExprResolveString(value, &result, NULL, NULL))
+ {
+ info->errorCount++;
+ ERROR("Property values must be type string\n");
+ ACTION1("Ignoring illegal definition of \"%s\" property\n", property);
+ return False;
}
- pi.value= result.str;
- return AddProperty(info,&pi);
+ pi.value = result.str;
+ return AddProperty(info, &pi);
}
static int
-HandleGeometryVar(VarDef *stmt,XkbDescPtr xkb,GeometryInfo *info)
-{
-ExprResult elem,field,tmp;
-ExprDef * ndx;
-DoodadInfo * di;
-Atom * pField;
-
- 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,stmt->value,
- info);
- }
- if (elem.str&&(uStrCaseCmp(elem.str,"property")==0)) {
- if (ndx!=NULL) {
- info->errorCount++;
- ERROR1("The %s geometry property is not an array\n",field.str);
- ACTION("Ignoring illegal property definition\n");
- return False;
- }
- 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");
- ACTION2("No value assigned to %s.%s\n",elem.str,field.str);
- return False;
- }
-
- if ((uStrCaseCmp(field.str,"width")==0)||
- (uStrCaseCmp(field.str,"widthmm")==0)) {
- if (ndx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard",field.str,"geometry");
- }
- if (!ExprResolveFloat(stmt->value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("keyboard",field.str,"geometry","number");
- }
- if (tmp.ival<1) {
- WARN("Keyboard width must be positive\n");
- ACTION1("Ignoring illegal keyboard width %s\n",
- XkbGeomFPText(tmp.ival,XkbMessage));
- return True;
- }
- if (info->widthMM!=0) {
- WARN("Keyboard width multiply defined\n");
- ACTION1("Using last definition (%s),",
- XkbGeomFPText(tmp.ival,XkbMessage));
- INFO1(" ignoring first (%s)\n",
- XkbGeomFPText(info->widthMM,XkbMessage));
- }
- info->widthMM= tmp.ival;
- return True;
- }
- else if ((uStrCaseCmp(field.str,"height")==0)||
- (uStrCaseCmp(field.str,"heightmm")==0)) {
- if (ndx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard",field.str,"geometry");
- }
- if (!ExprResolveFloat(stmt->value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("keyboard",field.str,"geometry","number");
- }
- if (tmp.ival<1) {
- WARN("Keyboard height must be positive\n");
- ACTION1("Ignoring illegal keyboard height %s\n",
- XkbGeomFPText(tmp.ival,XkbMessage));
- return True;
- }
- if (info->heightMM!=0) {
- WARN("Keyboard height multiply defined\n");
- ACTION1("Using last definition (%s),",
- XkbGeomFPText(tmp.ival,XkbMessage));
- INFO1(" ignoring first (%s)\n",
- XkbGeomFPText(info->heightMM,XkbMessage));
- }
- 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;
- }
- else if (uStrCaseCmp(field.str,"fontsize")==0) {
- if (ndx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard",field.str,"geometry");
- }
- if (!ExprResolveFloat(stmt->value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("keyboard",field.str,"geometry","number");
- }
- if ((tmp.ival<40)||(tmp.ival>2550)) {
- info->errorCount++;
- ERROR1("Illegal font size %d (must be 4..255)\n",tmp.ival);
- ACTION("Ignoring font size in keyboard geometry\n");
- return False;
- }
- info->fontSize= tmp.ival;
- return True;
- }
- else if ((uStrCaseCmp(field.str,"color")==0)||
- (uStrCaseCmp(field.str,"basecolor")==0)){
- if (ndx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard",field.str,"geometry");
- }
- if (!ExprResolveString(stmt->value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("keyboard",field.str,"geometry","string");
- }
- info->baseColor= XkbInternAtom(NULL,tmp.str,False);
- return True;
- }
- else if (uStrCaseCmp(field.str,"labelcolor")==0){
- if (ndx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard",field.str,"geometry");
- }
- if (!ExprResolveString(stmt->value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("keyboard",field.str,"geometry","string");
- }
- info->labelColor= XkbInternAtom(NULL,tmp.str,False);
- return True;
- }
- else {
- return SetGeometryProperty(info,field.str,stmt->value);
- }
-
- if (ndx!=NULL) {
- info->errorCount++;
- return ReportNotArray("keyboard",field.str,"geometry");
- }
- if (!ExprResolveString(stmt->value,&tmp,NULL,NULL)) {
- info->errorCount++;
- return ReportBadType("keyboard",field.str,"geometry","string");
- }
- *pField= XkbInternAtom(NULL,tmp.str,False);
+HandleGeometryVar(VarDef * stmt, XkbDescPtr xkb, GeometryInfo * info)
+{
+ ExprResult elem, field, tmp;
+ ExprDef *ndx;
+ DoodadInfo *di;
+ Atom *pField;
+
+ 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,
+ stmt->value, info);
+ }
+ if (elem.str && (uStrCaseCmp(elem.str, "property") == 0))
+ {
+ if (ndx != NULL)
+ {
+ info->errorCount++;
+ ERROR1("The %s geometry property is not an array\n", field.str);
+ ACTION("Ignoring illegal property definition\n");
+ return False;
+ }
+ 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");
+ ACTION2("No value assigned to %s.%s\n", elem.str, field.str);
+ return False;
+ }
+
+ if ((uStrCaseCmp(field.str, "width") == 0) ||
+ (uStrCaseCmp(field.str, "widthmm") == 0))
+ {
+ if (ndx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard", field.str, "geometry");
+ }
+ if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("keyboard", field.str, "geometry", "number");
+ }
+ if (tmp.ival < 1)
+ {
+ WARN("Keyboard width must be positive\n");
+ ACTION1("Ignoring illegal keyboard width %s\n",
+ XkbGeomFPText(tmp.ival, XkbMessage));
+ return True;
+ }
+ if (info->widthMM != 0)
+ {
+ WARN("Keyboard width multiply defined\n");
+ ACTION1("Using last definition (%s),",
+ XkbGeomFPText(tmp.ival, XkbMessage));
+ INFO1(" ignoring first (%s)\n",
+ XkbGeomFPText(info->widthMM, XkbMessage));
+ }
+ info->widthMM = tmp.ival;
+ return True;
+ }
+ else if ((uStrCaseCmp(field.str, "height") == 0) ||
+ (uStrCaseCmp(field.str, "heightmm") == 0))
+ {
+ if (ndx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard", field.str, "geometry");
+ }
+ if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("keyboard", field.str, "geometry", "number");
+ }
+ if (tmp.ival < 1)
+ {
+ WARN("Keyboard height must be positive\n");
+ ACTION1("Ignoring illegal keyboard height %s\n",
+ XkbGeomFPText(tmp.ival, XkbMessage));
+ return True;
+ }
+ if (info->heightMM != 0)
+ {
+ WARN("Keyboard height multiply defined\n");
+ ACTION1("Using last definition (%s),",
+ XkbGeomFPText(tmp.ival, XkbMessage));
+ INFO1(" ignoring first (%s)\n",
+ XkbGeomFPText(info->heightMM, XkbMessage));
+ }
+ 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;
+ }
+ else if (uStrCaseCmp(field.str, "fontsize") == 0)
+ {
+ if (ndx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard", field.str, "geometry");
+ }
+ if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("keyboard", field.str, "geometry", "number");
+ }
+ if ((tmp.ival < 40) || (tmp.ival > 2550))
+ {
+ info->errorCount++;
+ ERROR1("Illegal font size %d (must be 4..255)\n", tmp.ival);
+ ACTION("Ignoring font size in keyboard geometry\n");
+ return False;
+ }
+ info->fontSize = tmp.ival;
+ return True;
+ }
+ else if ((uStrCaseCmp(field.str, "color") == 0) ||
+ (uStrCaseCmp(field.str, "basecolor") == 0))
+ {
+ if (ndx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard", field.str, "geometry");
+ }
+ if (!ExprResolveString(stmt->value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("keyboard", field.str, "geometry", "string");
+ }
+ info->baseColor = XkbInternAtom(NULL, tmp.str, False);
+ return True;
+ }
+ else if (uStrCaseCmp(field.str, "labelcolor") == 0)
+ {
+ if (ndx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard", field.str, "geometry");
+ }
+ if (!ExprResolveString(stmt->value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("keyboard", field.str, "geometry", "string");
+ }
+ info->labelColor = XkbInternAtom(NULL, tmp.str, False);
+ return True;
+ }
+ else
+ {
+ return SetGeometryProperty(info, field.str, stmt->value);
+ }
+
+ if (ndx != NULL)
+ {
+ info->errorCount++;
+ return ReportNotArray("keyboard", field.str, "geometry");
+ }
+ if (!ExprResolveString(stmt->value, &tmp, NULL, NULL))
+ {
+ info->errorCount++;
+ return ReportBadType("keyboard", field.str, "geometry", "string");
+ }
+ *pField = XkbInternAtom(NULL, tmp.str, False);
return True;
}
/***====================================================================***/
static Bool
-HandleShapeBody(ShapeDef *def,ShapeInfo *si,unsigned merge,GeometryInfo *info)
-{
-OutlineDef * ol;
-int nOut,nPt;
-XkbOutlinePtr outline;
-ExprDef * pt;
-
- if (def->nOutlines<1) {
- WARN1("Shape \"%s\" has no outlines\n",shText(info->dpy,si));
- ACTION("Definition ignored\n");
- return True;
- }
- si->nOutlines= def->nOutlines;
- si->outlines= uTypedCalloc(def->nOutlines,XkbOutlineRec);
- if (!si->outlines) {
- ERROR1("Couldn't allocate outlines for \"%s\"\n",shText(info->dpy,si));
- ACTION("Definition ignored\n");
- info->errorCount++;
- return False;
- }
- for (nOut=0,ol=def->outlines;ol!=NULL;ol=(OutlineDef *)ol->common.next) {
- if (ol->nPoints<1) {
- SetShapeField(si,XkbAtomGetString(NULL,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);
- if (!outline->points) {
- ERROR1("Can't allocate points for \"%s\"\n",shText(info->dpy,si));
- ACTION("Definition ignored\n");
- info->errorCount++;
- return False;
- }
- for (nPt=0,pt=ol->points;pt!=NULL;pt=(ExprDef *)pt->common.next) {
- outline->points[nPt].x= pt->value.coord.x;
- outline->points[nPt].y= pt->value.coord.y;
- nPt++;
- }
- if (ol->field!=None) {
- char *str= XkbAtomText(NULL,ol->field,XkbMessage);
- if ((uStrCaseCmp(str,"approximation")==0)||
- (uStrCaseCmp(str,"approx")==0)) {
- if (si->approx==NULL)
- si->approx= outline;
- else {
- WARN1("Multiple approximations for \"%s\"\n",
- shText(info->dpy,si));
- ACTION("Treating all but the first as normal outlines\n");
- }
- }
- else if (uStrCaseCmp(str,"primary")==0) {
- if (si->primary==NULL)
- si->primary= outline;
- else {
- WARN1("Multiple primary outlines for \"%s\"\n",
- shText(info->dpy,si));
- ACTION("Treating all but the first as normal outlines\n");
- }
- }
- else {
- WARN2("Unknown outline type %s for \"%s\"\n",str,
- shText(info->dpy,si));
- ACTION("Treated as a normal outline\n");
- }
- }
- }
- if (nOut!=si->nOutlines) {
- WSGO2("Expected %d outlines, got %d\n",(unsigned int)si->nOutlines,
- nOut);
- si->nOutlines= nOut;
+HandleShapeBody(ShapeDef * def, ShapeInfo * si, unsigned merge,
+ GeometryInfo * info)
+{
+ OutlineDef *ol;
+ int nOut, nPt;
+ XkbOutlinePtr outline;
+ ExprDef *pt;
+
+ if (def->nOutlines < 1)
+ {
+ WARN1("Shape \"%s\" has no outlines\n", shText(info->dpy, si));
+ ACTION("Definition ignored\n");
+ return True;
+ }
+ si->nOutlines = def->nOutlines;
+ si->outlines = uTypedCalloc(def->nOutlines, XkbOutlineRec);
+ if (!si->outlines)
+ {
+ ERROR1("Couldn't allocate outlines for \"%s\"\n",
+ shText(info->dpy, si));
+ ACTION("Definition ignored\n");
+ info->errorCount++;
+ return False;
+ }
+ for (nOut = 0, ol = def->outlines; ol != NULL;
+ ol = (OutlineDef *) ol->common.next)
+ {
+ if (ol->nPoints < 1)
+ {
+ SetShapeField(si, XkbAtomGetString(NULL, 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);
+ if (!outline->points)
+ {
+ ERROR1("Can't allocate points for \"%s\"\n",
+ shText(info->dpy, si));
+ ACTION("Definition ignored\n");
+ info->errorCount++;
+ return False;
+ }
+ for (nPt = 0, pt = ol->points; pt != NULL;
+ pt = (ExprDef *) pt->common.next)
+ {
+ outline->points[nPt].x = pt->value.coord.x;
+ outline->points[nPt].y = pt->value.coord.y;
+ nPt++;
+ }
+ if (ol->field != None)
+ {
+ char *str = XkbAtomText(NULL, ol->field, XkbMessage);
+ if ((uStrCaseCmp(str, "approximation") == 0) ||
+ (uStrCaseCmp(str, "approx") == 0))
+ {
+ if (si->approx == NULL)
+ si->approx = outline;
+ else
+ {
+ WARN1("Multiple approximations for \"%s\"\n",
+ shText(info->dpy, si));
+ ACTION("Treating all but the first as normal outlines\n");
+ }
+ }
+ else if (uStrCaseCmp(str, "primary") == 0)
+ {
+ if (si->primary == NULL)
+ si->primary = outline;
+ else
+ {
+ WARN1("Multiple primary outlines for \"%s\"\n",
+ shText(info->dpy, si));
+ ACTION("Treating all but the first as normal outlines\n");
+ }
+ }
+ else
+ {
+ WARN2("Unknown outline type %s for \"%s\"\n", str,
+ shText(info->dpy, si));
+ ACTION("Treated as a normal outline\n");
+ }
+ }
+ }
+ if (nOut != si->nOutlines)
+ {
+ WSGO2("Expected %d outlines, got %d\n",
+ (unsigned int) si->nOutlines, nOut);
+ si->nOutlines = nOut;
}
return True;
}
static int
-HandleShapeDef(ShapeDef *def,XkbDescPtr xkb,unsigned merge,GeometryInfo *info)
-{
-ShapeInfo si;
-
- if (def->merge!=MergeDefault)
- merge= def->merge;
-
- bzero(&si,sizeof(ShapeInfo));
- si.defs.merge= merge;
- si.name= XkbInternAtom(info->dpy,XkbAtomGetString(NULL,def->name),False);
- si.dfltCornerRadius= info->dfltCornerRadius;
- if (!HandleShapeBody(def,&si,merge,info))
- return False;
- if (!AddShape(info,&si))
- return False;
+HandleShapeDef(ShapeDef * def, XkbDescPtr xkb, unsigned merge,
+ GeometryInfo * info)
+{
+ ShapeInfo si;
+
+ if (def->merge != MergeDefault)
+ merge = def->merge;
+
+ bzero(&si, sizeof(ShapeInfo));
+ si.defs.merge = merge;
+ si.name =
+ XkbInternAtom(info->dpy, XkbAtomGetString(NULL, def->name), False);
+ si.dfltCornerRadius = info->dfltCornerRadius;
+ if (!HandleShapeBody(def, &si, merge, info))
+ return False;
+ if (!AddShape(info, &si))
+ return False;
return True;
}
/***====================================================================***/
static int
-HandleDoodadDef( DoodadDef *def,
- unsigned merge,
- SectionInfo *si,
- GeometryInfo *info)
-{
-ExprResult elem,field;
-ExprDef * ndx;
-DoodadInfo new;
-VarDef * var;
-
- if (def->common.stmtType==StmtIndicatorMapDef) {
- def->common.stmtType= StmtDoodadDef;
- def->type= XkbIndicatorDoodad;
- }
- InitDoodadInfo(&new,def->type,si,info);
- new.name= XkbInternAtom(info->dpy,XkbAtomGetString(NULL,def->name),False);
- for (var=def->body;var!=NULL;var= (VarDef *)var->common.next) {
- if (ExprResolveLhs(var->name,&elem,&field,&ndx)==0)
- return 0; /* internal error, already reported */
- if (elem.str!=NULL) {
- WARN1("Assignment to field of unknown element in doodad %s\n",
- ddText(info->dpy,&new));
- ACTION2("No value assigned to %s.%s\n",elem.str,field.str);
- }
- else if (!SetDoodadField(&new,field.str,ndx,var->value,si,info))
- return False;
- }
- if (!AddDoodad(si,info,&new))
- return False;
+HandleDoodadDef(DoodadDef * def,
+ unsigned merge, SectionInfo * si, GeometryInfo * info)
+{
+ ExprResult elem, field;
+ ExprDef *ndx;
+ DoodadInfo new;
+ VarDef *var;
+
+ if (def->common.stmtType == StmtIndicatorMapDef)
+ {
+ def->common.stmtType = StmtDoodadDef;
+ def->type = XkbIndicatorDoodad;
+ }
+ InitDoodadInfo(&new, def->type, si, info);
+ new.name =
+ XkbInternAtom(info->dpy, XkbAtomGetString(NULL, def->name), False);
+ for (var = def->body; var != NULL; var = (VarDef *) var->common.next)
+ {
+ if (ExprResolveLhs(var->name, &elem, &field, &ndx) == 0)
+ return 0; /* internal error, already reported */
+ if (elem.str != NULL)
+ {
+ WARN1("Assignment to field of unknown element in doodad %s\n",
+ ddText(info->dpy, &new));
+ ACTION2("No value assigned to %s.%s\n", elem.str, field.str);
+ }
+ else if (!SetDoodadField(&new, field.str, ndx, var->value, si, info))
+ return False;
+ }
+ if (!AddDoodad(si, info, &new))
+ return False;
ClearDoodadInfo(&new);
return True;
}
@@ -2232,43 +2549,45 @@ VarDef * var;
/***====================================================================***/
static int
-HandleOverlayDef( OverlayDef * def,
- unsigned merge,
- SectionInfo * si,
- GeometryInfo * info)
-{
-OverlayKeyDef * keyDef;
-OverlayKeyInfo *key;
-OverlayInfo ol;
-
- if ((def->nKeys<1)&&(warningLevel>3)) {
- WARN2("Overlay \"%s\" in section \"%s\" has no keys\n",
- XkbAtomText(NULL,def->name,XkbMessage),
- scText(info->dpy,si));
- ACTION("Overlay ignored\n");
- return True;
- }
- bzero(&ol,sizeof(OverlayInfo));
- ol.name= XkbInternAtom(info->dpy,XkbAtomGetString(NULL,def->name),False);
- for (keyDef= def->keys;keyDef;keyDef=(OverlayKeyDef *)keyDef->common.next) {
- key= uTypedCalloc(1,OverlayKeyInfo);
- if ((!key)&&warningLevel>0) {
- WSGO("Couldn't allocate OverlayKeyInfo\n");
- ACTION2("Overlay %s for section %s will be incomplete\n",
- oiText(info->dpy,&ol),
- scText(info->dpy,si));
- return False;
- }
- strncpy(key->over,keyDef->over,XkbKeyNameLength);
- strncpy(key->under,keyDef->under,XkbKeyNameLength);
- key->sectionRow= _GOK_UnknownRow;
- key->overlayRow= _GOK_UnknownRow;
- ol.keys= (OverlayKeyInfo *)AddCommonInfo(&ol.keys->defs,
- (CommonInfo *)key);
- ol.nKeys++;
- }
- if (!AddOverlay(si,info,&ol))
- return False;
+HandleOverlayDef(OverlayDef * def,
+ unsigned merge, SectionInfo * si, GeometryInfo * info)
+{
+ OverlayKeyDef *keyDef;
+ OverlayKeyInfo *key;
+ OverlayInfo ol;
+
+ if ((def->nKeys < 1) && (warningLevel > 3))
+ {
+ WARN2("Overlay \"%s\" in section \"%s\" has no keys\n",
+ XkbAtomText(NULL, def->name, XkbMessage), scText(info->dpy,
+ si));
+ ACTION("Overlay ignored\n");
+ return True;
+ }
+ bzero(&ol, sizeof(OverlayInfo));
+ ol.name =
+ XkbInternAtom(info->dpy, XkbAtomGetString(NULL, def->name), False);
+ for (keyDef = def->keys; keyDef;
+ keyDef = (OverlayKeyDef *) keyDef->common.next)
+ {
+ key = uTypedCalloc(1, OverlayKeyInfo);
+ if ((!key) && warningLevel > 0)
+ {
+ WSGO("Couldn't allocate OverlayKeyInfo\n");
+ ACTION2("Overlay %s for section %s will be incomplete\n",
+ oiText(info->dpy, &ol), scText(info->dpy, si));
+ return False;
+ }
+ strncpy(key->over, keyDef->over, XkbKeyNameLength);
+ strncpy(key->under, keyDef->under, XkbKeyNameLength);
+ key->sectionRow = _GOK_UnknownRow;
+ key->overlayRow = _GOK_UnknownRow;
+ ol.keys = (OverlayKeyInfo *) AddCommonInfo(&ol.keys->defs,
+ (CommonInfo *) key);
+ ol.nKeys++;
+ }
+ if (!AddOverlay(si, info, &ol))
+ return False;
ClearOverlayInfo(&ol);
return True;
}
@@ -2276,283 +2595,322 @@ OverlayInfo ol;
/***====================================================================***/
static Bool
-HandleComplexKey(KeyDef *def,KeyInfo *key,GeometryInfo *info)
-{
-RowInfo * row;
-ExprDef * expr;
-
- row= key->row;
- for (expr=def->expr;expr!=NULL;expr=(ExprDef *)expr->common.next) {
- if (expr->op==OpAssign) {
- ExprResult elem,f;
- ExprDef *ndx;
- if (ExprResolveLhs(expr->value.binary.left,&elem,&f,&ndx)==0)
- return False; /* internal error, already reported */
- if ((elem.str==NULL)||(uStrCaseCmp(elem.str,"key")==0)) {
- if (!SetKeyField(key,f.str,ndx,expr->value.binary.right,info))
- return False;
- }
- else {
- ERROR("Illegal element used in a key definition\n");
- ACTION2("Assignment to %s.%s ignored\n",elem.str,f.str);
- return False;
- }
- }
- else {
- switch (expr->type) {
- case TypeInt: case TypeFloat:
- if (!SetKeyField(key,"gap",NULL,expr,info))
- return False;
- break;
- case TypeString:
- if (!SetKeyField(key,"shape",NULL,expr,info))
- return False;
- break;
- case TypeKeyName:
- if (!SetKeyField(key,"name",NULL,expr,info))
- return False;
- break;
- default:
- ERROR("Cannot determine field for unnamed expression\n");
- ACTION3("Ignoring key %d in row %d of section %s\n",
- row->nKeys+1,row->section->nRows+1,
- rowText(info->dpy,row));
- return False;
- }
- }
+HandleComplexKey(KeyDef * def, KeyInfo * key, GeometryInfo * info)
+{
+ RowInfo *row;
+ ExprDef *expr;
+
+ row = key->row;
+ for (expr = def->expr; expr != NULL; expr = (ExprDef *) expr->common.next)
+ {
+ if (expr->op == OpAssign)
+ {
+ ExprResult elem, f;
+ ExprDef *ndx;
+ if (ExprResolveLhs(expr->value.binary.left, &elem, &f, &ndx) == 0)
+ return False; /* internal error, already reported */
+ if ((elem.str == NULL) || (uStrCaseCmp(elem.str, "key") == 0))
+ {
+ if (!SetKeyField
+ (key, f.str, ndx, expr->value.binary.right, info))
+ return False;
+ }
+ else
+ {
+ ERROR("Illegal element used in a key definition\n");
+ ACTION2("Assignment to %s.%s ignored\n", elem.str, f.str);
+ return False;
+ }
+ }
+ else
+ {
+ switch (expr->type)
+ {
+ case TypeInt:
+ case TypeFloat:
+ if (!SetKeyField(key, "gap", NULL, expr, info))
+ return False;
+ break;
+ case TypeString:
+ if (!SetKeyField(key, "shape", NULL, expr, info))
+ return False;
+ break;
+ case TypeKeyName:
+ if (!SetKeyField(key, "name", NULL, expr, info))
+ return False;
+ break;
+ default:
+ ERROR("Cannot determine field for unnamed expression\n");
+ ACTION3("Ignoring key %d in row %d of section %s\n",
+ row->nKeys + 1, row->section->nRows + 1,
+ rowText(info->dpy, row));
+ return False;
+ }
+ }
}
return True;
}
static Bool
-HandleRowBody(RowDef *def,RowInfo *row,unsigned merge,GeometryInfo *info)
-{
-KeyDef * keyDef;
-
- if ((def->nKeys<1)&&(warningLevel>3)) {
- ERROR1("Row in section %s has no keys\n",rowText(info->dpy,row));
- ACTION("Section ignored\n");
- return True;
- }
- for (keyDef= def->keys; keyDef!=NULL;keyDef=(KeyDef *)keyDef->common.next) {
- if (keyDef->common.stmtType==StmtVarDef) {
- VarDef *var= (VarDef *)keyDef;
- ExprResult elem,field;
- ExprDef *ndx;
- if (ExprResolveLhs(var->name,&elem,&field,&ndx)==0)
- return 0; /* internal error, already reported */
- if ((elem.str==NULL)||(uStrCaseCmp(elem.str,"row")==0)) {
- if (!SetRowField(row,field.str,ndx,var->value,info))
- return False;
- }
- else if (uStrCaseCmp(elem.str,"key")==0) {
- if (!SetKeyField(&row->dfltKey,field.str,ndx,var->value,info))
- return False;
- }
- else {
- WARN("Assignment to field of unknown element in row\n");
- ACTION2("No value assigned to %s.%s\n",elem.str,field.str);
- }
- }
- else if (keyDef->common.stmtType==StmtKeyDef) {
- KeyInfo key;
- InitKeyInfo(&key,row,info);
- if (keyDef->name!=NULL) {
- int len= strlen(keyDef->name);
- if ((len<1)||(len>XkbKeyNameLength)) {
- ERROR2("Illegal name %s for key in section %s\n",
- keyDef->name,
- rowText(info->dpy,row));
- ACTION("Section not compiled\n");
- return False;
- }
- bzero(key.name,XkbKeyNameLength+1);
- strncpy(key.name,keyDef->name,XkbKeyNameLength);
- key.defs.defined|= _GK_Name;
- }
- else if (!HandleComplexKey(keyDef,&key,info))
- return False;
- if (!AddKey(row,&key))
- return False;
- }
- else {
- WSGO1("Unexpected statement (type %d) in row body\n",
- keyDef->common.stmtType);
- return False;
- }
+HandleRowBody(RowDef * def, RowInfo * row, unsigned merge,
+ GeometryInfo * info)
+{
+ KeyDef *keyDef;
+
+ if ((def->nKeys < 1) && (warningLevel > 3))
+ {
+ ERROR1("Row in section %s has no keys\n", rowText(info->dpy, row));
+ ACTION("Section ignored\n");
+ return True;
+ }
+ for (keyDef = def->keys; keyDef != NULL;
+ keyDef = (KeyDef *) keyDef->common.next)
+ {
+ if (keyDef->common.stmtType == StmtVarDef)
+ {
+ VarDef *var = (VarDef *) keyDef;
+ ExprResult elem, field;
+ ExprDef *ndx;
+ if (ExprResolveLhs(var->name, &elem, &field, &ndx) == 0)
+ return 0; /* internal error, already reported */
+ if ((elem.str == NULL) || (uStrCaseCmp(elem.str, "row") == 0))
+ {
+ if (!SetRowField(row, field.str, ndx, var->value, info))
+ return False;
+ }
+ else if (uStrCaseCmp(elem.str, "key") == 0)
+ {
+ if (!SetKeyField
+ (&row->dfltKey, field.str, ndx, var->value, info))
+ return False;
+ }
+ else
+ {
+ WARN("Assignment to field of unknown element in row\n");
+ ACTION2("No value assigned to %s.%s\n", elem.str, field.str);
+ }
+ }
+ else if (keyDef->common.stmtType == StmtKeyDef)
+ {
+ KeyInfo key;
+ InitKeyInfo(&key, row, info);
+ if (keyDef->name != NULL)
+ {
+ int len = strlen(keyDef->name);
+ if ((len < 1) || (len > XkbKeyNameLength))
+ {
+ ERROR2("Illegal name %s for key in section %s\n",
+ keyDef->name, rowText(info->dpy, row));
+ ACTION("Section not compiled\n");
+ return False;
+ }
+ bzero(key.name, XkbKeyNameLength + 1);
+ strncpy(key.name, keyDef->name, XkbKeyNameLength);
+ key.defs.defined |= _GK_Name;
+ }
+ else if (!HandleComplexKey(keyDef, &key, info))
+ return False;
+ if (!AddKey(row, &key))
+ return False;
+ }
+ else
+ {
+ WSGO1("Unexpected statement (type %d) in row body\n",
+ keyDef->common.stmtType);
+ return False;
+ }
}
return True;
}
static Bool
-HandleSectionBody( SectionDef * def,
- SectionInfo * si,
- unsigned merge,
- GeometryInfo * info)
-{
-RowDef * rowDef;
-DoodadInfo * di;
-
- for (rowDef= def->rows;rowDef!=NULL;rowDef=(RowDef *)rowDef->common.next) {
- if (rowDef->common.stmtType==StmtVarDef) {
- VarDef *var= (VarDef *)rowDef;
- ExprResult elem,field;
- ExprDef *ndx;
- if (ExprResolveLhs(var->name,&elem,&field,&ndx)==0)
- return 0; /* internal error, already reported */
- if ((elem.str==NULL)||(uStrCaseCmp(elem.str,"section")==0)) {
- if (!SetSectionField(si,field.str,ndx,var->value,info))
- return False;
- }
- else if (uStrCaseCmp(elem.str,"row")==0) {
- if (!SetRowField(&si->dfltRow,field.str,ndx,var->value,info))
- return False;
- }
- else if (uStrCaseCmp(elem.str,"key")==0) {
- if(!SetKeyField(&si->dfltRow.dfltKey,field.str,ndx,
- var->value,info))
- return False;
- }
- else if ((di=FindDfltDoodadByTypeName(elem.str,si,info))!=NULL) {
- if (!SetDoodadField(di,field.str,ndx,var->value,si,info))
- return False;
- }
- else {
- WARN("Assignment to field of unknown element in section\n");
- ACTION2("No value assigned to %s.%s\n",elem.str,field.str);
- }
- }
- else if (rowDef->common.stmtType==StmtRowDef) {
- RowInfo row;
- InitRowInfo(&row,si,info);
- if (!HandleRowBody(rowDef,&row,merge,info))
- return False;
- if (!AddRow(si,&row))
- return False;
+HandleSectionBody(SectionDef * def,
+ SectionInfo * si, unsigned merge, GeometryInfo * info)
+{
+ RowDef *rowDef;
+ DoodadInfo *di;
+
+ for (rowDef = def->rows; rowDef != NULL;
+ rowDef = (RowDef *) rowDef->common.next)
+ {
+ if (rowDef->common.stmtType == StmtVarDef)
+ {
+ VarDef *var = (VarDef *) rowDef;
+ ExprResult elem, field;
+ ExprDef *ndx;
+ if (ExprResolveLhs(var->name, &elem, &field, &ndx) == 0)
+ return 0; /* internal error, already reported */
+ if ((elem.str == NULL) || (uStrCaseCmp(elem.str, "section") == 0))
+ {
+ if (!SetSectionField(si, field.str, ndx, var->value, info))
+ return False;
+ }
+ else if (uStrCaseCmp(elem.str, "row") == 0)
+ {
+ if (!SetRowField
+ (&si->dfltRow, field.str, ndx, var->value, info))
+ return False;
+ }
+ else if (uStrCaseCmp(elem.str, "key") == 0)
+ {
+ if (!SetKeyField(&si->dfltRow.dfltKey, field.str, ndx,
+ var->value, info))
+ return False;
+ }
+ else if ((di =
+ FindDfltDoodadByTypeName(elem.str, si, info)) != NULL)
+ {
+ if (!SetDoodadField(di, field.str, ndx, var->value, si, info))
+ return False;
+ }
+ else
+ {
+ WARN("Assignment to field of unknown element in section\n");
+ ACTION2("No value assigned to %s.%s\n", elem.str, field.str);
+ }
+ }
+ else if (rowDef->common.stmtType == StmtRowDef)
+ {
+ RowInfo row;
+ InitRowInfo(&row, si, info);
+ if (!HandleRowBody(rowDef, &row, merge, info))
+ return False;
+ if (!AddRow(si, &row))
+ return False;
/* ClearRowInfo(&row,info);*/
- }
- else if ((rowDef->common.stmtType==StmtDoodadDef)||
- (rowDef->common.stmtType==StmtIndicatorMapDef)) {
- if (!HandleDoodadDef((DoodadDef *)rowDef,merge,si,info))
- return False;
- }
- else if (rowDef->common.stmtType==StmtOverlayDef) {
- if (!HandleOverlayDef((OverlayDef *)rowDef,merge,si,info))
- return False;
- }
- else {
- WSGO1("Unexpected statement (type %d) in section body\n",
- rowDef->common.stmtType);
- return False;
- }
- }
- if (si->nRows!=def->nRows) {
- WSGO2("Expected %d rows, found %d\n",(unsigned int)def->nRows,
- (unsigned int)si->nRows);
- ACTION1("Definition of section %s might be incorrect\n",
- scText(info->dpy,si));
+ }
+ else if ((rowDef->common.stmtType == StmtDoodadDef) ||
+ (rowDef->common.stmtType == StmtIndicatorMapDef))
+ {
+ if (!HandleDoodadDef((DoodadDef *) rowDef, merge, si, info))
+ return False;
+ }
+ else if (rowDef->common.stmtType == StmtOverlayDef)
+ {
+ if (!HandleOverlayDef((OverlayDef *) rowDef, merge, si, info))
+ return False;
+ }
+ else
+ {
+ WSGO1("Unexpected statement (type %d) in section body\n",
+ rowDef->common.stmtType);
+ return False;
+ }
+ }
+ if (si->nRows != def->nRows)
+ {
+ WSGO2("Expected %d rows, found %d\n", (unsigned int) def->nRows,
+ (unsigned int) si->nRows);
+ ACTION1("Definition of section %s might be incorrect\n",
+ scText(info->dpy, si));
}
return True;
}
static int
-HandleSectionDef( SectionDef * def,
- XkbDescPtr xkb,
- unsigned merge,
- GeometryInfo * info)
-{
-SectionInfo si;
-char * str;
-
- if (def->merge!=MergeDefault)
- merge= def->merge;
- InitSectionInfo(&si,info);
- si.defs.merge= merge;
- str= XkbAtomGetString(NULL,def->name);
- if ((str==NULL)||(strlen(str)<1)) {
- ERROR("Section defined without a name\n");
- ACTION("Definition ignored\n");
- return False;
- }
- si.name= XkbInternAtom(info->dpy,XkbAtomGetString(NULL,def->name),False);
- if (!HandleSectionBody(def,&si,merge,info))
- return False;
- if (!AddSection(info,&si))
- return False;
+HandleSectionDef(SectionDef * def,
+ XkbDescPtr xkb, unsigned merge, GeometryInfo * info)
+{
+ SectionInfo si;
+ char *str;
+
+ if (def->merge != MergeDefault)
+ merge = def->merge;
+ InitSectionInfo(&si, info);
+ si.defs.merge = merge;
+ str = XkbAtomGetString(NULL, def->name);
+ if ((str == NULL) || (strlen(str) < 1))
+ {
+ ERROR("Section defined without a name\n");
+ ACTION("Definition ignored\n");
+ return False;
+ }
+ si.name =
+ XkbInternAtom(info->dpy, XkbAtomGetString(NULL, def->name), False);
+ if (!HandleSectionBody(def, &si, merge, info))
+ return False;
+ if (!AddSection(info, &si))
+ return False;
return True;
}
/***====================================================================***/
static void
-HandleGeometryFile( XkbFile * file,
- XkbDescPtr xkb,
- unsigned merge,
- GeometryInfo * info)
-{
-ParseCommon * stmt;
-char * failWhat;
-
- if (merge==MergeDefault)
- merge= MergeAugment;
- info->name= uStringDup(file->name);
- stmt= file->defs;
- while (stmt) {
- failWhat= NULL;
- switch (stmt->stmtType) {
- case StmtInclude:
- if (!HandleIncludeGeometry((IncludeStmt *)stmt,xkb,info,
- HandleGeometryFile))
- info->errorCount++;
- break;
- case StmtKeyAliasDef:
- if (!HandleAliasDef((KeyAliasDef *)stmt,
- merge,info->fileID,&info->aliases)) {
- info->errorCount++;
- }
- break;
- case StmtVarDef:
- if (!HandleGeometryVar((VarDef *)stmt,xkb,info))
- info->errorCount++;
- break;
- case StmtShapeDef:
- if (!HandleShapeDef((ShapeDef *)stmt,xkb,merge,info))
- info->errorCount++;
- break;
- case StmtSectionDef:
- if (!HandleSectionDef((SectionDef *)stmt,xkb,merge,info))
- info->errorCount++;
- break;
- case StmtIndicatorMapDef:
- case StmtDoodadDef:
- if (!HandleDoodadDef((DoodadDef *)stmt,merge,NULL,info))
- info->errorCount++;
- break;
- case StmtVModDef:
- if (!failWhat) failWhat= "virtual modfier";
- case StmtInterpDef:
- if (!failWhat) failWhat= "symbol interpretation";
- case StmtGroupCompatDef:
- if (!failWhat) failWhat= "group compatibility map";
- case StmtKeycodeDef:
- if (!failWhat) failWhat= "key name";
- ERROR("Interpretation files may not include other types\n");
- ACTION1("Ignoring %s definition.\n",failWhat);
- info->errorCount++;
- break;
- default:
- WSGO1("Unexpected statement type %d in HandleGeometryFile\n",
- stmt->stmtType);
- break;
- }
- stmt= stmt->next;
- if (info->errorCount>10) {
+HandleGeometryFile(XkbFile * file,
+ XkbDescPtr xkb, unsigned merge, GeometryInfo * info)
+{
+ ParseCommon *stmt;
+ char *failWhat;
+
+ if (merge == MergeDefault)
+ merge = MergeAugment;
+ info->name = uStringDup(file->name);
+ stmt = file->defs;
+ while (stmt)
+ {
+ failWhat = NULL;
+ switch (stmt->stmtType)
+ {
+ case StmtInclude:
+ if (!HandleIncludeGeometry((IncludeStmt *) stmt, xkb, info,
+ HandleGeometryFile))
+ info->errorCount++;
+ break;
+ case StmtKeyAliasDef:
+ if (!HandleAliasDef((KeyAliasDef *) stmt,
+ merge, info->fileID, &info->aliases))
+ {
+ info->errorCount++;
+ }
+ break;
+ case StmtVarDef:
+ if (!HandleGeometryVar((VarDef *) stmt, xkb, info))
+ info->errorCount++;
+ break;
+ case StmtShapeDef:
+ if (!HandleShapeDef((ShapeDef *) stmt, xkb, merge, info))
+ info->errorCount++;
+ break;
+ case StmtSectionDef:
+ if (!HandleSectionDef((SectionDef *) stmt, xkb, merge, info))
+ info->errorCount++;
+ break;
+ case StmtIndicatorMapDef:
+ case StmtDoodadDef:
+ if (!HandleDoodadDef((DoodadDef *) stmt, merge, NULL, info))
+ info->errorCount++;
+ break;
+ case StmtVModDef:
+ if (!failWhat)
+ failWhat = "virtual modfier";
+ case StmtInterpDef:
+ if (!failWhat)
+ failWhat = "symbol interpretation";
+ case StmtGroupCompatDef:
+ if (!failWhat)
+ failWhat = "group compatibility map";
+ case StmtKeycodeDef:
+ if (!failWhat)
+ failWhat = "key name";
+ ERROR("Interpretation files may not include other types\n");
+ ACTION1("Ignoring %s definition.\n", failWhat);
+ info->errorCount++;
+ break;
+ default:
+ WSGO1("Unexpected statement type %d in HandleGeometryFile\n",
+ stmt->stmtType);
+ break;
+ }
+ stmt = stmt->next;
+ if (info->errorCount > 10)
+ {
#ifdef NOISY
- ERROR("Too many errors\n");
+ ERROR("Too many errors\n");
#endif
- ACTION1("Abandoning geometry file \"%s\"\n",file->topName);
- break;
- }
+ ACTION1("Abandoning geometry file \"%s\"\n", file->topName);
+ break;
+ }
}
return;
}
@@ -2560,290 +2918,348 @@ char * failWhat;
/***====================================================================***/
static Bool
-CopyShapeDef(Display *dpy,XkbGeometryPtr geom,ShapeInfo *si)
-{
-register int i,n;
-XkbShapePtr shape;
-XkbOutlinePtr old_outline,outline;
-Atom name;
-
- si->index= geom->num_shapes;
- name= XkbInternAtom(dpy,XkbAtomGetString(NULL,si->name),False);
- shape= XkbAddGeomShape(geom,name,si->nOutlines);
- if (!shape) {
- WSGO("Couldn't allocate shape in geometry\n");
- ACTION1("Shape %s not compiled\n",shText(dpy,si));
- return False;
- }
- old_outline= si->outlines;
- for (i=0;i<si->nOutlines;i++,old_outline++) {
- outline= XkbAddGeomOutline(shape,old_outline->num_points);
- if (!outline) {
- WSGO("Couldn't allocate outline in shape\n");
- ACTION1("Shape %s is incomplete\n",shText(dpy,si));
- return False;
- }
- n= old_outline->num_points;
- memcpy(outline->points,old_outline->points,n*sizeof(XkbPointRec));
- outline->num_points= old_outline->num_points;
- outline->corner_radius= old_outline->corner_radius;
- }
- if (si->approx) {
- n= (si->approx-si->outlines);
- shape->approx= &shape->outlines[n];
- }
- if (si->primary) {
- n= (si->primary-si->outlines);
- shape->primary= &shape->outlines[n];
+CopyShapeDef(Display * dpy, XkbGeometryPtr geom, ShapeInfo * si)
+{
+ register int i, n;
+ XkbShapePtr shape;
+ XkbOutlinePtr old_outline, outline;
+ Atom name;
+
+ si->index = geom->num_shapes;
+ name = XkbInternAtom(dpy, XkbAtomGetString(NULL, si->name), False);
+ shape = XkbAddGeomShape(geom, name, si->nOutlines);
+ if (!shape)
+ {
+ WSGO("Couldn't allocate shape in geometry\n");
+ ACTION1("Shape %s not compiled\n", shText(dpy, si));
+ return False;
+ }
+ old_outline = si->outlines;
+ for (i = 0; i < si->nOutlines; i++, old_outline++)
+ {
+ outline = XkbAddGeomOutline(shape, old_outline->num_points);
+ if (!outline)
+ {
+ WSGO("Couldn't allocate outline in shape\n");
+ ACTION1("Shape %s is incomplete\n", shText(dpy, si));
+ return False;
+ }
+ n = old_outline->num_points;
+ memcpy(outline->points, old_outline->points, n * sizeof(XkbPointRec));
+ outline->num_points = old_outline->num_points;
+ outline->corner_radius = old_outline->corner_radius;
+ }
+ if (si->approx)
+ {
+ n = (si->approx - si->outlines);
+ shape->approx = &shape->outlines[n];
+ }
+ if (si->primary)
+ {
+ n = (si->primary - si->outlines);
+ shape->primary = &shape->outlines[n];
}
XkbComputeShapeBounds(shape);
return True;
}
static Bool
-VerifyDoodadInfo(DoodadInfo *di,GeometryInfo *info)
-{
- if ((di->defs.defined&(_GD_Top|_GD_Left))!=(_GD_Top|_GD_Left)) {
- if (warningLevel<9) {
- ERROR1("No position defined for doodad %s\n",ddText(info->dpy,di));
- ACTION("Illegal doodad ignored\n");
- return False;
- }
- }
- if ((di->defs.defined & _GD_Priority) == 0) {
- /* calculate priority -- should be just above previous doodad/row */
- }
- switch (di->type) {
- case XkbOutlineDoodad:
- case XkbSolidDoodad:
- if ((di->defs.defined&_GD_Shape)==0) {
- ERROR2("No shape defined for %s doodad %s\n",
- (di->type==XkbOutlineDoodad?"outline":"filled"),
- ddText(info->dpy,di));
- ACTION("Incomplete definition ignored\n");
- return False;
- }
- else {
- ShapeInfo *si;
- si= FindShape(info,di->shape, (di->type==XkbOutlineDoodad?
- "outline doodad":
- "solid doodad"),
- ddText(info->dpy,di));
- if (si)
- di->shape= si->name;
- else {
- ERROR1("No legal shape for %s\n",ddText(info->dpy,di));
- ACTION("Incomplete definition ignored\n");
- return False;
- }
- }
- if ((di->defs.defined&_GD_Color)==0) {
- if (warningLevel>5) {
- WARN1("No color for doodad %s\n",ddText(info->dpy,di));
- ACTION("Using black\n");
- }
- di->color= XkbInternAtom(NULL,"black",False);
- }
- break;
- case XkbTextDoodad:
- if ((di->defs.defined&_GD_Text)==0) {
- ERROR1("No text specified for text doodad %s\n",
- ddText(info->dpy,di));
- ACTION("Illegal doodad definition ignored\n");
- return False;
- }
- if ((di->defs.defined&_GD_Angle)==0)
- di->angle= 0;
- if ((di->defs.defined&_GD_Color)==0) {
- if (warningLevel>5) {
- WARN1("No color specified for doodad %s\n",
- ddText(info->dpy,di));
- ACTION("Using black\n");
- }
- di->color= XkbInternAtom(NULL,"black",False);
- }
- if ((di->defs.defined&_GD_FontSpec)!=0) {
- if ((di->defs.defined&_GD_FontParts)==0)
- return True;
- if (warningLevel<9) {
- WARN1("Text doodad %s has full and partial font definition\n",
- ddText(info->dpy,di));
- ACTION("Full specification ignored\n");
- }
- di->defs.defined&= ~_GD_FontSpec;
- di->fontSpec= None;
- }
- if ((di->defs.defined&_GD_Font)==0) {
- if (warningLevel>5) {
- WARN1("No font specified for doodad %s\n",
- ddText(info->dpy,di));
- ACTION1("Using \"%s\"\n",DFLT_FONT);
- }
- di->font= XkbInternAtom(NULL,DFLT_FONT,False);
- }
- if ((di->defs.defined&_GD_FontSlant)==0) {
- if (warningLevel>7) {
- WARN1("No font slant for text doodad %s\n",
- ddText(info->dpy,di));
- ACTION1("Using \"%s\"\n",DFLT_SLANT);
- }
- di->fontSlant= XkbInternAtom(NULL,DFLT_SLANT,False);
- }
- if ((di->defs.defined&_GD_FontWeight)==0) {
- if (warningLevel>7) {
- WARN1("No font weight for text doodad %s\n",
- ddText(info->dpy,di));
- ACTION1("Using \"%s\"\n",DFLT_WEIGHT);
- }
- di->fontWeight= XkbInternAtom(NULL,DFLT_WEIGHT,False);
- }
- if ((di->defs.defined&_GD_FontSetWidth)==0) {
- if (warningLevel>9) {
- WARN1("No font set width for text doodad %s\n",
- ddText(info->dpy,di));
- ACTION1("Using \"%s\"\n",DFLT_SET_WIDTH);
- }
- di->fontSetWidth= XkbInternAtom(NULL,DFLT_SET_WIDTH,False);
- }
- if ((di->defs.defined&_GD_FontVariant)==0) {
- if (warningLevel>9) {
- WARN1("No font variant for text doodad %s\n",
- ddText(info->dpy,di));
- ACTION1("Using \"%s\"\n",DFLT_VARIANT);
- }
- di->fontVariant= XkbInternAtom(NULL,DFLT_VARIANT,False);
- }
- if ((di->defs.defined&_GD_FontEncoding)==0) {
- if (warningLevel>7) {
- WARN1("No font encoding for doodad %s\n",
- ddText(info->dpy,di));
- ACTION1("Using \"%s\"\n",DFLT_ENCODING);
- }
- di->fontEncoding= XkbInternAtom(NULL,DFLT_ENCODING,False);
- }
- if ((di->defs.defined&_GD_FontSize)==0) {
- if (warningLevel>7) {
- WARN1("No font size for text doodad %s\n",
- ddText(info->dpy,di));
- ACTION1("Using %s point text\n",
- XkbGeomFPText(DFLT_SIZE,XkbMessage));
- }
- di->fontSize= DFLT_SIZE;
- }
- if ((di->defs.defined&_GD_Height)==0) {
- unsigned size,nLines;
- char *tmp;
- size= (di->fontSize*120)/100;
- size= (size*254)/720; /* convert to mm/10 */
- for (nLines=1,tmp=XkbAtomGetString(NULL,di->text);*tmp;tmp++) {
- if (*tmp=='\n') nLines++;
- }
- size*= nLines;
- if (warningLevel>5) {
- WARN1("No height for text doodad %s\n",
- ddText(info->dpy,di));
- ACTION1("Using calculated height %s millimeters\n",
- XkbGeomFPText(size,XkbMessage));
- }
- di->height= size;
- }
- if ((di->defs.defined&_GD_Width)==0) {
- unsigned width,tmp;
- char *str;
- width= tmp= 0;
- for (str=XkbAtomGetString(NULL,di->text);*str;str++) {
- if (*str!='\n')
- tmp++;
- else {
- if (tmp>width)
- width= tmp;
- tmp= 1;
- }
- }
- if (width==0)
- width= tmp;
- width*= (di->height*2)/3;
- if (warningLevel>5) {
- WARN1("No width for text doodad %s\n",ddText(info->dpy,di));
- ACTION1("Using calculated width %s millimeters\n",
- XkbGeomFPText(width,XkbMessage));
- }
- di->width= width;
- }
- break;
- case XkbIndicatorDoodad:
- if ((di->defs.defined&_GD_Shape)==0) {
- ERROR1("No shape defined for indicator doodad %s\n",
- ddText(info->dpy,di));
- ACTION("Incomplete definition ignored\n");
- return False;
- }
- else {
- ShapeInfo *si;
- si= FindShape(info,di->shape,"indicator doodad",
- ddText(info->dpy,di));
- if (si)
- di->shape= si->name;
- else {
- ERROR1("No legal shape for doodad %s\n",
- ddText(info->dpy,di));
- ACTION("Incomplete definition ignored\n");
- return False;
- }
- }
- if ((di->defs.defined&_GD_Color)==0) {
- if (warningLevel>5) {
- WARN1("No \"on\" color for indicator doodad %s\n",
- ddText(info->dpy,di));
- ACTION("Using green\n");
- }
- di->color= XkbInternAtom(NULL,"green",False);
- }
- if ((di->defs.defined&_GD_OffColor)==0) {
- if (warningLevel>5) {
- WARN1("No \"off\" color for indicator doodad %s\n",
- ddText(info->dpy,di));
- ACTION("Using black\n");
- }
- di->offColor= XkbInternAtom(NULL,"black",False);
- }
- break;
- case XkbLogoDoodad:
- if (di->logoName==NULL) {
- ERROR1("No logo name defined for logo doodad %s\n",
- ddText(info->dpy,di));
- ACTION("Incomplete definition ignored\n");
- return False;
- }
- if ((di->defs.defined&_GD_Shape)==0) {
- ERROR1("No shape defined for logo doodad %s\n",
- ddText(info->dpy,di));
- ACTION("Incomplete definition ignored\n");
- return False;
- }
- else {
- ShapeInfo *si;
- si= FindShape(info,di->shape,"logo doodad",
- ddText(info->dpy,di));
- if (si)
- di->shape= si->name;
- else {
- ERROR1("No legal shape for %s\n",ddText(info->dpy,di));
- ACTION("Incomplete definition ignored\n");
- return False;
- }
- }
- if ((di->defs.defined&_GD_Color)==0) {
- if (warningLevel>5) {
- WARN1("No color for doodad %s\n",ddText(info->dpy,di));
- ACTION("Using black\n");
- }
- di->color= XkbInternAtom(NULL,"black",False);
- }
- break;
- default:
- WSGO1("Uknown doodad type %d in VerifyDoodad\n",(unsigned int)di->type);
- return False;
+VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
+{
+ if ((di->defs.defined & (_GD_Top | _GD_Left)) != (_GD_Top | _GD_Left))
+ {
+ if (warningLevel < 9)
+ {
+ ERROR1("No position defined for doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION("Illegal doodad ignored\n");
+ return False;
+ }
+ }
+ if ((di->defs.defined & _GD_Priority) == 0)
+ {
+ /* calculate priority -- should be just above previous doodad/row */
+ }
+ switch (di->type)
+ {
+ case XkbOutlineDoodad:
+ case XkbSolidDoodad:
+ if ((di->defs.defined & _GD_Shape) == 0)
+ {
+ ERROR2("No shape defined for %s doodad %s\n",
+ (di->type == XkbOutlineDoodad ? "outline" : "filled"),
+ ddText(info->dpy, di));
+ ACTION("Incomplete definition ignored\n");
+ return False;
+ }
+ else
+ {
+ ShapeInfo *si;
+ si = FindShape(info, di->shape,
+ (di->type ==
+ XkbOutlineDoodad ? "outline doodad" :
+ "solid doodad"), ddText(info->dpy, di));
+ if (si)
+ di->shape = si->name;
+ else
+ {
+ ERROR1("No legal shape for %s\n", ddText(info->dpy, di));
+ ACTION("Incomplete definition ignored\n");
+ return False;
+ }
+ }
+ if ((di->defs.defined & _GD_Color) == 0)
+ {
+ if (warningLevel > 5)
+ {
+ WARN1("No color for doodad %s\n", ddText(info->dpy, di));
+ ACTION("Using black\n");
+ }
+ di->color = XkbInternAtom(NULL, "black", False);
+ }
+ break;
+ case XkbTextDoodad:
+ if ((di->defs.defined & _GD_Text) == 0)
+ {
+ ERROR1("No text specified for text doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION("Illegal doodad definition ignored\n");
+ return False;
+ }
+ if ((di->defs.defined & _GD_Angle) == 0)
+ di->angle = 0;
+ if ((di->defs.defined & _GD_Color) == 0)
+ {
+ if (warningLevel > 5)
+ {
+ WARN1("No color specified for doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION("Using black\n");
+ }
+ di->color = XkbInternAtom(NULL, "black", False);
+ }
+ if ((di->defs.defined & _GD_FontSpec) != 0)
+ {
+ if ((di->defs.defined & _GD_FontParts) == 0)
+ return True;
+ if (warningLevel < 9)
+ {
+ WARN1
+ ("Text doodad %s has full and partial font definition\n",
+ ddText(info->dpy, di));
+ ACTION("Full specification ignored\n");
+ }
+ di->defs.defined &= ~_GD_FontSpec;
+ di->fontSpec = None;
+ }
+ if ((di->defs.defined & _GD_Font) == 0)
+ {
+ if (warningLevel > 5)
+ {
+ WARN1("No font specified for doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION1("Using \"%s\"\n", DFLT_FONT);
+ }
+ di->font = XkbInternAtom(NULL, DFLT_FONT, False);
+ }
+ if ((di->defs.defined & _GD_FontSlant) == 0)
+ {
+ if (warningLevel > 7)
+ {
+ WARN1("No font slant for text doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION1("Using \"%s\"\n", DFLT_SLANT);
+ }
+ di->fontSlant = XkbInternAtom(NULL, DFLT_SLANT, False);
+ }
+ if ((di->defs.defined & _GD_FontWeight) == 0)
+ {
+ if (warningLevel > 7)
+ {
+ WARN1("No font weight for text doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION1("Using \"%s\"\n", DFLT_WEIGHT);
+ }
+ di->fontWeight = XkbInternAtom(NULL, DFLT_WEIGHT, False);
+ }
+ if ((di->defs.defined & _GD_FontSetWidth) == 0)
+ {
+ if (warningLevel > 9)
+ {
+ WARN1("No font set width for text doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION1("Using \"%s\"\n", DFLT_SET_WIDTH);
+ }
+ di->fontSetWidth = XkbInternAtom(NULL, DFLT_SET_WIDTH, False);
+ }
+ if ((di->defs.defined & _GD_FontVariant) == 0)
+ {
+ if (warningLevel > 9)
+ {
+ WARN1("No font variant for text doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION1("Using \"%s\"\n", DFLT_VARIANT);
+ }
+ di->fontVariant = XkbInternAtom(NULL, DFLT_VARIANT, False);
+ }
+ if ((di->defs.defined & _GD_FontEncoding) == 0)
+ {
+ if (warningLevel > 7)
+ {
+ WARN1("No font encoding for doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION1("Using \"%s\"\n", DFLT_ENCODING);
+ }
+ di->fontEncoding = XkbInternAtom(NULL, DFLT_ENCODING, False);
+ }
+ if ((di->defs.defined & _GD_FontSize) == 0)
+ {
+ if (warningLevel > 7)
+ {
+ WARN1("No font size for text doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION1("Using %s point text\n",
+ XkbGeomFPText(DFLT_SIZE, XkbMessage));
+ }
+ di->fontSize = DFLT_SIZE;
+ }
+ if ((di->defs.defined & _GD_Height) == 0)
+ {
+ unsigned size, nLines;
+ char *tmp;
+ size = (di->fontSize * 120) / 100;
+ size = (size * 254) / 720; /* convert to mm/10 */
+ for (nLines = 1, tmp = XkbAtomGetString(NULL, di->text); *tmp;
+ tmp++)
+ {
+ if (*tmp == '\n')
+ nLines++;
+ }
+ size *= nLines;
+ if (warningLevel > 5)
+ {
+ WARN1("No height for text doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION1("Using calculated height %s millimeters\n",
+ XkbGeomFPText(size, XkbMessage));
+ }
+ di->height = size;
+ }
+ if ((di->defs.defined & _GD_Width) == 0)
+ {
+ unsigned width, tmp;
+ char *str;
+ width = tmp = 0;
+ for (str = XkbAtomGetString(NULL, di->text); *str; str++)
+ {
+ if (*str != '\n')
+ tmp++;
+ else
+ {
+ if (tmp > width)
+ width = tmp;
+ tmp = 1;
+ }
+ }
+ if (width == 0)
+ width = tmp;
+ width *= (di->height * 2) / 3;
+ if (warningLevel > 5)
+ {
+ WARN1("No width for text doodad %s\n", ddText(info->dpy, di));
+ ACTION1("Using calculated width %s millimeters\n",
+ XkbGeomFPText(width, XkbMessage));
+ }
+ di->width = width;
+ }
+ break;
+ case XkbIndicatorDoodad:
+ if ((di->defs.defined & _GD_Shape) == 0)
+ {
+ ERROR1("No shape defined for indicator doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION("Incomplete definition ignored\n");
+ return False;
+ }
+ else
+ {
+ ShapeInfo *si;
+ si = FindShape(info, di->shape, "indicator doodad",
+ ddText(info->dpy, di));
+ if (si)
+ di->shape = si->name;
+ else
+ {
+ ERROR1("No legal shape for doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION("Incomplete definition ignored\n");
+ return False;
+ }
+ }
+ if ((di->defs.defined & _GD_Color) == 0)
+ {
+ if (warningLevel > 5)
+ {
+ WARN1("No \"on\" color for indicator doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION("Using green\n");
+ }
+ di->color = XkbInternAtom(NULL, "green", False);
+ }
+ if ((di->defs.defined & _GD_OffColor) == 0)
+ {
+ if (warningLevel > 5)
+ {
+ WARN1("No \"off\" color for indicator doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION("Using black\n");
+ }
+ di->offColor = XkbInternAtom(NULL, "black", False);
+ }
+ break;
+ case XkbLogoDoodad:
+ if (di->logoName == NULL)
+ {
+ ERROR1("No logo name defined for logo doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION("Incomplete definition ignored\n");
+ return False;
+ }
+ if ((di->defs.defined & _GD_Shape) == 0)
+ {
+ ERROR1("No shape defined for logo doodad %s\n",
+ ddText(info->dpy, di));
+ ACTION("Incomplete definition ignored\n");
+ return False;
+ }
+ else
+ {
+ ShapeInfo *si;
+ si = FindShape(info, di->shape, "logo doodad",
+ ddText(info->dpy, di));
+ if (si)
+ di->shape = si->name;
+ else
+ {
+ ERROR1("No legal shape for %s\n", ddText(info->dpy, di));
+ ACTION("Incomplete definition ignored\n");
+ return False;
+ }
+ }
+ if ((di->defs.defined & _GD_Color) == 0)
+ {
+ if (warningLevel > 5)
+ {
+ WARN1("No color for doodad %s\n", ddText(info->dpy, di));
+ ACTION("Using black\n");
+ }
+ di->color = XkbInternAtom(NULL, "black", False);
+ }
+ break;
+ default:
+ WSGO1("Uknown doodad type %d in VerifyDoodad\n",
+ (unsigned int) di->type);
+ return False;
}
return True;
}
@@ -2851,113 +3267,129 @@ 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)
-{
-int totalSize;
-char *font,*weight,*slant,*setWidth,*variant,*encoding;
-char * rtrn;
-
- font= (fontTok!=None?XkbAtomGetString(NULL,fontTok):DFLT_FONT);
- weight= (weightTok!=None?XkbAtomGetString(NULL,weightTok):DFLT_WEIGHT);
- slant= (slantTok!=None?XkbAtomGetString(NULL,slantTok):DFLT_SLANT);
- setWidth= (setWidthTok!=None?XkbAtomGetString(NULL,setWidthTok):
- DFLT_SET_WIDTH);
- variant= (varTok!=None?XkbAtomGetString(NULL,varTok):DFLT_VARIANT);
- encoding= (encodingTok!=None?XkbAtomGetString(NULL,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);
- if (rtrn) {
- sprintf(rtrn,FONT_TEMPLATE,font,weight,slant,setWidth,variant,
- size,encoding);
- }
- return rtrn;
+FontFromParts(Atom fontTok,
+ Atom weightTok,
+ Atom slantTok,
+ Atom setWidthTok, Atom varTok, int size, Atom encodingTok)
+{
+ int totalSize;
+ char *font, *weight, *slant, *setWidth, *variant, *encoding;
+ char *rtrn;
+
+ font = (fontTok != None ? XkbAtomGetString(NULL, fontTok) : DFLT_FONT);
+ weight =
+ (weightTok != None ? XkbAtomGetString(NULL, weightTok) : DFLT_WEIGHT);
+ slant =
+ (slantTok != None ? XkbAtomGetString(NULL, slantTok) : DFLT_SLANT);
+ setWidth =
+ (setWidthTok !=
+ None ? XkbAtomGetString(NULL, setWidthTok) : DFLT_SET_WIDTH);
+ variant =
+ (varTok != None ? XkbAtomGetString(NULL, varTok) : DFLT_VARIANT);
+ encoding =
+ (encodingTok !=
+ None ? XkbAtomGetString(NULL, 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);
+ 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)
-{
-Atom name;
-XkbDoodadPtr doodad;
-XkbColorPtr color;
-XkbShapePtr shape;
-ShapeInfo * si;
-
- if (!VerifyDoodadInfo(di,info))
- return False;
- name= XkbInternAtom(NULL,XkbAtomGetString(NULL,di->name),False);
- doodad= XkbAddGeomDoodad(geom,section,name);
- if (!doodad) {
- WSGO1("Couldn't allocate doodad in %s\n",
- (section?"section":"geometry"));
- ACTION1("Cannot copy doodad %s\n",ddText(info->dpy,di));
- return False;
- }
- doodad->any.type= di->type;
- doodad->any.priority= di->priority;
- doodad->any.top= di->top;
- doodad->any.left= di->left;
- switch (di->type) {
- case XkbOutlineDoodad:
- case XkbSolidDoodad:
- si= FindShape(info,di->shape,NULL,NULL);
- if (!si)
- return False;
- doodad->shape.angle= di->angle;
- color= XkbAddGeomColor(geom,XkbAtomGetString(NULL,di->color),geom->num_colors);
- shape= &geom->shapes[si->index];
- XkbSetShapeDoodadColor(geom,&doodad->shape,color);
- XkbSetShapeDoodadShape(geom,&doodad->shape,shape);
- break;
- case XkbTextDoodad:
- doodad->text.angle= di->angle;
- doodad->text.width= di->width;
- doodad->text.height= di->height;
- if (di->fontSpec==None)
- doodad->text.font= FontFromParts(di->font,di->fontWeight,
- di->fontSlant,di->fontSetWidth,
- di->fontVariant,
- di->fontSize,di->fontEncoding);
- else doodad->text.font= XkbAtomGetString(NULL,di->fontSpec);
- doodad->text.text= XkbAtomGetString(NULL,di->text);
- color= XkbAddGeomColor(geom,XkbAtomGetString(NULL,di->color),geom->num_colors);
- XkbSetTextDoodadColor(geom,&doodad->text,color);
- break;
- case XkbIndicatorDoodad:
- si= FindShape(info,di->shape,NULL,NULL);
- if (!si)
- return False;
- shape= &geom->shapes[si->index];
- color= XkbAddGeomColor(geom,XkbAtomGetString(NULL,di->color),geom->num_colors);
- XkbSetIndicatorDoodadShape(geom,&doodad->indicator,shape);
- XkbSetIndicatorDoodadOnColor(geom,&doodad->indicator,color);
- color= XkbAddGeomColor(geom,XkbAtomGetString(NULL,di->offColor),geom->num_colors);
- XkbSetIndicatorDoodadOffColor(geom,&doodad->indicator,color);
- break;
- case XkbLogoDoodad:
- si= FindShape(info,di->shape,NULL,NULL);
- if (!si)
- return False;
- doodad->logo.angle= di->angle;
- color= XkbAddGeomColor(geom,XkbAtomGetString(NULL,di->color),geom->num_colors);
- shape= &geom->shapes[si->index];
- XkbSetLogoDoodadColor(geom,&doodad->logo,color);
- XkbSetLogoDoodadShape(geom,&doodad->logo,shape);
- doodad->logo.logo_name= di->logoName;
- di->logoName= NULL;
- break;
+CopyDoodadDef(XkbGeometryPtr geom,
+ XkbSectionPtr section, DoodadInfo * di, GeometryInfo * info)
+{
+ Atom name;
+ XkbDoodadPtr doodad;
+ XkbColorPtr color;
+ XkbShapePtr shape;
+ ShapeInfo *si;
+
+ if (!VerifyDoodadInfo(di, info))
+ return False;
+ name = XkbInternAtom(NULL, XkbAtomGetString(NULL, di->name), False);
+ doodad = XkbAddGeomDoodad(geom, section, name);
+ if (!doodad)
+ {
+ WSGO1("Couldn't allocate doodad in %s\n",
+ (section ? "section" : "geometry"));
+ ACTION1("Cannot copy doodad %s\n", ddText(info->dpy, di));
+ return False;
+ }
+ doodad->any.type = di->type;
+ doodad->any.priority = di->priority;
+ doodad->any.top = di->top;
+ doodad->any.left = di->left;
+ switch (di->type)
+ {
+ case XkbOutlineDoodad:
+ case XkbSolidDoodad:
+ si = FindShape(info, di->shape, NULL, NULL);
+ if (!si)
+ return False;
+ doodad->shape.angle = di->angle;
+ color =
+ XkbAddGeomColor(geom, XkbAtomGetString(NULL, di->color),
+ geom->num_colors);
+ shape = &geom->shapes[si->index];
+ XkbSetShapeDoodadColor(geom, &doodad->shape, color);
+ XkbSetShapeDoodadShape(geom, &doodad->shape, shape);
+ break;
+ case XkbTextDoodad:
+ doodad->text.angle = di->angle;
+ doodad->text.width = di->width;
+ doodad->text.height = di->height;
+ if (di->fontSpec == None)
+ doodad->text.font = FontFromParts(di->font, di->fontWeight,
+ di->fontSlant,
+ di->fontSetWidth,
+ di->fontVariant, di->fontSize,
+ di->fontEncoding);
+ else
+ doodad->text.font = XkbAtomGetString(NULL, di->fontSpec);
+ doodad->text.text = XkbAtomGetString(NULL, di->text);
+ color =
+ XkbAddGeomColor(geom, XkbAtomGetString(NULL, di->color),
+ geom->num_colors);
+ XkbSetTextDoodadColor(geom, &doodad->text, color);
+ break;
+ case XkbIndicatorDoodad:
+ si = FindShape(info, di->shape, NULL, NULL);
+ if (!si)
+ return False;
+ shape = &geom->shapes[si->index];
+ color =
+ XkbAddGeomColor(geom, XkbAtomGetString(NULL, di->color),
+ geom->num_colors);
+ XkbSetIndicatorDoodadShape(geom, &doodad->indicator, shape);
+ XkbSetIndicatorDoodadOnColor(geom, &doodad->indicator, color);
+ color =
+ XkbAddGeomColor(geom, XkbAtomGetString(NULL, di->offColor),
+ geom->num_colors);
+ XkbSetIndicatorDoodadOffColor(geom, &doodad->indicator, color);
+ break;
+ case XkbLogoDoodad:
+ si = FindShape(info, di->shape, NULL, NULL);
+ if (!si)
+ return False;
+ doodad->logo.angle = di->angle;
+ color =
+ XkbAddGeomColor(geom, XkbAtomGetString(NULL, di->color),
+ geom->num_colors);
+ shape = &geom->shapes[si->index];
+ XkbSetLogoDoodadColor(geom, &doodad->logo, color);
+ XkbSetLogoDoodadShape(geom, &doodad->logo, shape);
+ doodad->logo.logo_name = di->logoName;
+ di->logoName = NULL;
+ break;
}
return True;
}
@@ -2965,131 +3397,153 @@ ShapeInfo * si;
/***====================================================================***/
static Bool
-VerifyOverlayInfo( XkbGeometryPtr geom,
- XkbSectionPtr section,
- OverlayInfo * oi,
- GeometryInfo * info,
- short rowMap[256],
- short rowSize[256])
-{
-register OverlayKeyInfo * ki,*next;
-unsigned long oKey,uKey,sKey;
-XkbRowPtr row;
-XkbKeyPtr key;
-int r,k;
+VerifyOverlayInfo(XkbGeometryPtr geom,
+ XkbSectionPtr section,
+ OverlayInfo * oi,
+ GeometryInfo * info, short rowMap[256], short rowSize[256])
+{
+ register OverlayKeyInfo *ki, *next;
+ unsigned long oKey, uKey, sKey;
+ XkbRowPtr row;
+ XkbKeyPtr key;
+ int r, k;
/* find out which row each key is in */
- for (ki=oi->keys;ki!=NULL;ki=(OverlayKeyInfo *)ki->defs.next) {
- oKey= KeyNameToLong(ki->over);
- uKey= KeyNameToLong(ki->under);
- for (r=0,row=section->rows;(r<section->num_rows)&&oKey;r++,row++) {
- for (k=0,key=row->keys;(k<row->num_keys)&&oKey;k++,key++) {
- sKey= KeyNameToLong(key->name.name);
- if (sKey==oKey) {
- if (warningLevel>0) {
- WARN3("Key %s in section \"%s\" and overlay \"%s\"\n",
- XkbKeyNameText(key->name.name,XkbMessage),
- XkbAtomText(info->dpy,section->name,XkbMessage),
- XkbAtomText(info->dpy,oi->name,XkbMessage));
- ACTION("Overlay definition ignored\n");
- }
- oKey= 0;
- }
- else if (sKey==uKey) {
- ki->sectionRow= r;
- oKey= 0;
- }
- }
- }
- if ((ki->sectionRow==_GOK_UnknownRow)&&(warningLevel>0)) {
- WARN3("Key %s not in \"%s\", but has an overlay key in \"%s\"\n",
- XkbKeyNameText(ki->under,XkbMessage),
- XkbAtomText(info->dpy,section->name,XkbMessage),
- XkbAtomText(info->dpy,oi->name,XkbMessage));
- ACTION("Definition ignored\n");
- }
+ for (ki = oi->keys; ki != NULL; ki = (OverlayKeyInfo *) ki->defs.next)
+ {
+ oKey = KeyNameToLong(ki->over);
+ uKey = KeyNameToLong(ki->under);
+ for (r = 0, row = section->rows; (r < section->num_rows) && oKey;
+ r++, row++)
+ {
+ for (k = 0, key = row->keys; (k < row->num_keys) && oKey;
+ k++, key++)
+ {
+ sKey = KeyNameToLong(key->name.name);
+ if (sKey == oKey)
+ {
+ if (warningLevel > 0)
+ {
+ WARN3
+ ("Key %s in section \"%s\" and overlay \"%s\"\n",
+ XkbKeyNameText(key->name.name,
+ XkbMessage),
+ XkbAtomText(info->dpy, section->name,
+ XkbMessage),
+ XkbAtomText(info->dpy, oi->name, XkbMessage));
+ ACTION("Overlay definition ignored\n");
+ }
+ oKey = 0;
+ }
+ else if (sKey == uKey)
+ {
+ ki->sectionRow = r;
+ oKey = 0;
+ }
+ }
+ }
+ if ((ki->sectionRow == _GOK_UnknownRow) && (warningLevel > 0))
+ {
+ WARN3
+ ("Key %s not in \"%s\", but has an overlay key in \"%s\"\n",
+ XkbKeyNameText(ki->under, XkbMessage),
+ XkbAtomText(info->dpy, section->name, XkbMessage),
+ XkbAtomText(info->dpy, oi->name, XkbMessage));
+ ACTION("Definition ignored\n");
+ }
}
/* now prune out keys that aren't in the section */
- while ((oi->keys!=NULL)&&(oi->keys->sectionRow==_GOK_UnknownRow)) {
- next= (OverlayKeyInfo *)oi->keys->defs.next;
- uFree(oi->keys);
- oi->keys= next;
- oi->nKeys--;
- }
- for (ki=oi->keys;(ki!=NULL)&&(ki->defs.next!=NULL);ki=next) {
- next= (OverlayKeyInfo *)ki->defs.next;
- if (next->sectionRow==_GOK_UnknownRow) {
- ki->defs.next= next->defs.next;
- oi->nKeys--;
- uFree(next);
- next= (OverlayKeyInfo *)ki->defs.next;
- }
- }
- if (oi->nKeys<1) {
- ERROR2("Overlay \"%s\" for section \"%s\" has no legal keys\n",
- XkbAtomText(info->dpy,oi->name,XkbMessage),
- XkbAtomText(info->dpy,section->name,XkbMessage));
- ACTION("Overlay definition ignored\n");
- return False;
+ while ((oi->keys != NULL) && (oi->keys->sectionRow == _GOK_UnknownRow))
+ {
+ next = (OverlayKeyInfo *) oi->keys->defs.next;
+ uFree(oi->keys);
+ oi->keys = next;
+ oi->nKeys--;
+ }
+ for (ki = oi->keys; (ki != NULL) && (ki->defs.next != NULL); ki = next)
+ {
+ next = (OverlayKeyInfo *) ki->defs.next;
+ if (next->sectionRow == _GOK_UnknownRow)
+ {
+ ki->defs.next = next->defs.next;
+ oi->nKeys--;
+ uFree(next);
+ next = (OverlayKeyInfo *) ki->defs.next;
+ }
+ }
+ if (oi->nKeys < 1)
+ {
+ ERROR2("Overlay \"%s\" for section \"%s\" has no legal keys\n",
+ XkbAtomText(info->dpy, oi->name, XkbMessage),
+ XkbAtomText(info->dpy, section->name, XkbMessage));
+ ACTION("Overlay definition ignored\n");
+ return False;
}
/* now figure out how many rows are defined for the overlay */
- bzero(rowSize,sizeof(short)*256);
- for (k=0;k<256;k++) {
- rowMap[k]= -1;
- }
- oi->nRows= 0;
- for (ki=oi->keys;ki!=NULL;ki=(OverlayKeyInfo *)ki->defs.next) {
- if (rowMap[ki->sectionRow]==-1)
- rowMap[ki->sectionRow]= oi->nRows++;
- ki->overlayRow= rowMap[ki->sectionRow];
- rowSize[ki->overlayRow]++;
+ bzero(rowSize, sizeof(short) * 256);
+ for (k = 0; k < 256; k++)
+ {
+ rowMap[k] = -1;
+ }
+ oi->nRows = 0;
+ for (ki = oi->keys; ki != NULL; ki = (OverlayKeyInfo *) ki->defs.next)
+ {
+ if (rowMap[ki->sectionRow] == -1)
+ rowMap[ki->sectionRow] = oi->nRows++;
+ ki->overlayRow = rowMap[ki->sectionRow];
+ rowSize[ki->overlayRow]++;
}
return True;
}
static Bool
-CopyOverlayDef( XkbGeometryPtr geom,
- XkbSectionPtr section,
- OverlayInfo * oi,
- GeometryInfo * info)
-{
-Atom name;
-XkbOverlayPtr ol;
-XkbOverlayRowPtr row;
-XkbOverlayKeyPtr key;
-OverlayKeyInfo * ki;
-short rowMap[256],rowSize[256];
-int i;
-
- if (!VerifyOverlayInfo(geom,section,oi,info,rowMap,rowSize))
- return False;
- name= XkbInternAtom(NULL,XkbAtomGetString(NULL,oi->name),False);
- ol= XkbAddGeomOverlay(section,name,oi->nRows);
- if (!ol) {
- WSGO2("Couldn't add overlay \"%s\" to section \"%s\"\n",
- XkbAtomText(info->dpy,name,XkbMessage),
- XkbAtomText(info->dpy,section->name,XkbMessage));
- return False;
- }
- for (i=0;i<oi->nRows;i++) {
- int tmp,row_under;
- for (tmp=0,row_under=-1;(tmp<section->num_rows)&&(row_under<0);tmp++) {
- if (rowMap[tmp]==i)
- row_under= tmp;
- }
- if (!XkbAddGeomOverlayRow(ol,row_under,rowSize[i])) {
- WSGO3("Can't add row %d to overlay \"%s\" of section \"%s\"\n",
- i,XkbAtomText(info->dpy,name,XkbMessage),
- XkbAtomText(info->dpy,section->name,XkbMessage));
- return False;
- }
- }
- for (ki=oi->keys;ki!=NULL;ki=(OverlayKeyInfo *)ki->defs.next) {
- row= &ol->rows[ki->overlayRow];
- key= &row->keys[row->num_keys++];
- bzero(key,sizeof(XkbOverlayKeyRec));
- strncpy(key->over.name,ki->over,XkbKeyNameLength);
- strncpy(key->under.name,ki->under,XkbKeyNameLength);
+CopyOverlayDef(XkbGeometryPtr geom,
+ XkbSectionPtr section, OverlayInfo * oi, GeometryInfo * info)
+{
+ Atom name;
+ XkbOverlayPtr ol;
+ XkbOverlayRowPtr row;
+ XkbOverlayKeyPtr key;
+ OverlayKeyInfo *ki;
+ short rowMap[256], rowSize[256];
+ int i;
+
+ if (!VerifyOverlayInfo(geom, section, oi, info, rowMap, rowSize))
+ return False;
+ name = XkbInternAtom(NULL, XkbAtomGetString(NULL, oi->name), False);
+ ol = XkbAddGeomOverlay(section, name, oi->nRows);
+ if (!ol)
+ {
+ WSGO2("Couldn't add overlay \"%s\" to section \"%s\"\n",
+ XkbAtomText(info->dpy, name, XkbMessage),
+ XkbAtomText(info->dpy, section->name, XkbMessage));
+ return False;
+ }
+ for (i = 0; i < oi->nRows; i++)
+ {
+ int tmp, row_under;
+ for (tmp = 0, row_under = -1;
+ (tmp < section->num_rows) && (row_under < 0); tmp++)
+ {
+ if (rowMap[tmp] == i)
+ row_under = tmp;
+ }
+ if (!XkbAddGeomOverlayRow(ol, row_under, rowSize[i]))
+ {
+ WSGO3
+ ("Can't add row %d to overlay \"%s\" of section \"%s\"\n",
+ i, XkbAtomText(info->dpy, name, XkbMessage),
+ XkbAtomText(info->dpy, section->name, XkbMessage));
+ return False;
+ }
+ }
+ for (ki = oi->keys; ki != NULL; ki = (OverlayKeyInfo *) ki->defs.next)
+ {
+ row = &ol->rows[ki->overlayRow];
+ key = &row->keys[row->num_keys++];
+ bzero(key, sizeof(XkbOverlayKeyRec));
+ strncpy(key->over.name, ki->over, XkbKeyNameLength);
+ strncpy(key->under.name, ki->under, XkbKeyNameLength);
}
return True;
}
@@ -3097,88 +3551,106 @@ int i;
/***====================================================================***/
static Bool
-CopySectionDef(XkbGeometryPtr geom,SectionInfo *si,GeometryInfo *info)
-{
-XkbSectionPtr section;
-XkbRowPtr row;
-XkbKeyPtr key;
-KeyInfo * ki;
-RowInfo * ri;
-Atom name;
-
- name= XkbInternAtom(NULL,XkbAtomGetString(NULL,si->name),False);
- section= XkbAddGeomSection(geom,name,si->nRows,si->nDoodads,si->nOverlays);
- if (section==NULL) {
- WSGO("Couldn't allocate section in geometry\n");
- ACTION1("Section %s not compiled\n",scText(info->dpy,si));
- return False;
- }
- section->top= si->top;
- section->left= si->left;
- section->width= si->width;
- section->height= si->height;
- section->angle= si->angle;
- section->priority= si->priority;
- for (ri=si->rows;ri!=NULL;ri=(RowInfo *)ri->defs.next) {
- row= XkbAddGeomRow(section,ri->nKeys);
- if (row==NULL) {
- WSGO("Couldn't allocate row in section\n");
- ACTION1("Section %s is incomplete\n",scText(info->dpy,si));
- return False;
- }
- row->top= ri->top;
- row->left= ri->left;
- row->vertical= ri->vertical;
- for (ki=ri->keys;ki!=NULL;ki=(KeyInfo *)ki->defs.next) {
- XkbColorPtr color;
- if ((ki->defs.defined&_GK_Name)==0) {
- ERROR3("Key %d of row %d in section %s has no name\n",
- (int)ki->index,(int)ri->index,
- scText(info->dpy,si));
- ACTION1("Section %s ignored\n",scText(info->dpy,si));
- return False;
- }
- key= XkbAddGeomKey(row);
- if (key==NULL) {
- WSGO("Couldn't allocate key in row\n");
- ACTION1("Section %s is incomplete\n",scText(info->dpy,si));
- return False;
- }
- memcpy(key->name.name,ki->name,XkbKeyNameLength);
- key->gap= ki->gap;
- if (ki->shape==None)
- key->shape_ndx= 0;
- else {
- ShapeInfo *si;
- si= FindShape(info,ki->shape,"key",keyText(ki));
- if (!si)
- return False;
- key->shape_ndx= si->index;
- }
- if (ki->color!=None)
- color= XkbAddGeomColor(geom,XkbAtomGetString(NULL,ki->color),geom->num_colors);
- else color= XkbAddGeomColor(geom,"white",geom->num_colors);
- XkbSetKeyColor(geom,key,color);
- }
- }
- if (si->doodads!=NULL) {
- DoodadInfo *di;
- for (di=si->doodads;di!=NULL;di=(DoodadInfo *)di->defs.next) {
- CopyDoodadDef(geom,section,di,info);
- }
- }
- if (si->overlays!=NULL) {
- OverlayInfo *oi;
- for (oi=si->overlays;oi!=NULL;oi=(OverlayInfo *)oi->defs.next) {
- CopyOverlayDef(geom,section,oi,info);
- }
- }
- if (XkbComputeSectionBounds(geom,section)) {
- /* 7/6/94 (ef) -- check for negative origin and translate */
- if ((si->defs.defined&_GS_Width)==0)
- section->width= section->bounds.x2;
- if ((si->defs.defined&_GS_Height)==0)
- section->height= section->bounds.y2;
+CopySectionDef(XkbGeometryPtr geom, SectionInfo * si, GeometryInfo * info)
+{
+ XkbSectionPtr section;
+ XkbRowPtr row;
+ XkbKeyPtr key;
+ KeyInfo *ki;
+ RowInfo *ri;
+ Atom name;
+
+ name = XkbInternAtom(NULL, XkbAtomGetString(NULL, si->name), False);
+ section =
+ XkbAddGeomSection(geom, name, si->nRows, si->nDoodads, si->nOverlays);
+ if (section == NULL)
+ {
+ WSGO("Couldn't allocate section in geometry\n");
+ ACTION1("Section %s not compiled\n", scText(info->dpy, si));
+ return False;
+ }
+ section->top = si->top;
+ section->left = si->left;
+ section->width = si->width;
+ section->height = si->height;
+ section->angle = si->angle;
+ section->priority = si->priority;
+ for (ri = si->rows; ri != NULL; ri = (RowInfo *) ri->defs.next)
+ {
+ row = XkbAddGeomRow(section, ri->nKeys);
+ if (row == NULL)
+ {
+ WSGO("Couldn't allocate row in section\n");
+ ACTION1("Section %s is incomplete\n", scText(info->dpy, si));
+ return False;
+ }
+ row->top = ri->top;
+ row->left = ri->left;
+ row->vertical = ri->vertical;
+ for (ki = ri->keys; ki != NULL; ki = (KeyInfo *) ki->defs.next)
+ {
+ XkbColorPtr color;
+ if ((ki->defs.defined & _GK_Name) == 0)
+ {
+ ERROR3("Key %d of row %d in section %s has no name\n",
+ (int) ki->index, (int) ri->index,
+ scText(info->dpy, si));
+ ACTION1("Section %s ignored\n", scText(info->dpy, si));
+ return False;
+ }
+ key = XkbAddGeomKey(row);
+ if (key == NULL)
+ {
+ WSGO("Couldn't allocate key in row\n");
+ ACTION1("Section %s is incomplete\n", scText(info->dpy, si));
+ return False;
+ }
+ memcpy(key->name.name, ki->name, XkbKeyNameLength);
+ key->gap = ki->gap;
+ if (ki->shape == None)
+ key->shape_ndx = 0;
+ else
+ {
+ ShapeInfo *si;
+ si = FindShape(info, ki->shape, "key", keyText(ki));
+ if (!si)
+ return False;
+ key->shape_ndx = si->index;
+ }
+ if (ki->color != None)
+ color =
+ XkbAddGeomColor(geom,
+ XkbAtomGetString(NULL, ki->color),
+ geom->num_colors);
+ else
+ color = XkbAddGeomColor(geom, "white", geom->num_colors);
+ XkbSetKeyColor(geom, key, color);
+ }
+ }
+ if (si->doodads != NULL)
+ {
+ DoodadInfo *di;
+ for (di = si->doodads; di != NULL; di = (DoodadInfo *) di->defs.next)
+ {
+ CopyDoodadDef(geom, section, di, info);
+ }
+ }
+ if (si->overlays != NULL)
+ {
+ OverlayInfo *oi;
+ for (oi = si->overlays; oi != NULL;
+ oi = (OverlayInfo *) oi->defs.next)
+ {
+ CopyOverlayDef(geom, section, oi, info);
+ }
+ }
+ if (XkbComputeSectionBounds(geom, section))
+ {
+ /* 7/6/94 (ef) -- check for negative origin and translate */
+ if ((si->defs.defined & _GS_Width) == 0)
+ section->width = section->bounds.x2;
+ if ((si->defs.defined & _GS_Height) == 0)
+ section->height = section->bounds.y2;
}
return True;
}
@@ -3186,90 +3658,111 @@ Atom name;
/***====================================================================***/
Bool
-CompileGeometry(XkbFile *file,XkbFileInfo *result,unsigned merge)
-{
-GeometryInfo info;
-XkbDescPtr xkb;
-
- xkb= result->xkb;
- InitGeometryInfo(&info,file->id,merge);
- info.dpy= xkb->dpy;
- HandleGeometryFile(file,xkb,merge,&info);
-
- if (info.errorCount==0) {
- XkbGeometryPtr geom;
- XkbGeometrySizesRec sizes;
- bzero(&sizes,sizeof(sizes));
- sizes.which= XkbGeomAllMask;
- sizes.num_properties= info.nProps;
- sizes.num_colors= 8;
- sizes.num_shapes= info.nShapes;
- sizes.num_sections= info.nSections;
- sizes.num_doodads= info.nDoodads;
- if (XkbAllocGeometry(xkb,&sizes)!=Success) {
- WSGO("Couldn't allocate GeometryRec\n");
- ACTION("Geometry not compiled\n");
- return False;
- }
- geom= xkb->geom;
-
- geom->width_mm= info.widthMM;
- geom->height_mm= info.heightMM;
- if (info.name!=NULL) {
- geom->name= XkbInternAtom(xkb->dpy,info.name,False);
- if (XkbAllocNames(xkb,XkbGeometryNameMask,0,0)==Success)
- xkb->names->geometry= geom->name;
- }
- if (info.fontSpec!=None)
- geom->label_font= uStringDup(XkbAtomGetString(NULL,info.fontSpec));
- else geom->label_font= FontFromParts(info.font,info.fontWeight,
- info.fontSlant,info.fontSetWidth,
- info.fontVariant,
- info.fontSize,info.fontEncoding);
- XkbAddGeomColor(geom,"black",geom->num_colors);
- XkbAddGeomColor(geom,"white",geom->num_colors);
-
- if (info.baseColor==None)
- info.baseColor= XkbInternAtom(NULL,"white",False);
- if (info.labelColor==None)
- info.labelColor= XkbInternAtom(NULL,"black",False);
- geom->base_color=
- XkbAddGeomColor(geom,XkbAtomGetString(NULL,info.baseColor),geom->num_colors);
- geom->label_color=
- XkbAddGeomColor(geom,XkbAtomGetString(NULL,info.labelColor),geom->num_colors);
-
- if (info.props) {
- PropertyInfo *pi;
- for (pi= info.props;pi!=NULL;pi=(PropertyInfo *)pi->defs.next) {
- if (!XkbAddGeomProperty(geom,pi->name,pi->value))
- return False;
- }
- }
- if (info.shapes) {
- ShapeInfo *si;
- for (si= info.shapes;si!=NULL;si=(ShapeInfo *)si->defs.next) {
- if (!CopyShapeDef(xkb->dpy,geom,si))
- return False;
- }
- }
- if (info.sections) {
- SectionInfo *si;
- for (si= info.sections;si!=NULL;si=(SectionInfo *)si->defs.next) {
- if (!CopySectionDef(geom,si,&info))
- return False;
- }
- }
- if (info.doodads) {
- DoodadInfo *di;
- for (di= info.doodads;di!=NULL;di=(DoodadInfo *)di->defs.next) {
- if (!CopyDoodadDef(geom,NULL,di,&info))
- return False;
- }
- }
- if (info.aliases)
- ApplyAliases(xkb,True,&info.aliases);
- ClearGeometryInfo(&info);
- return True;
+CompileGeometry(XkbFile * file, XkbFileInfo * result, unsigned merge)
+{
+ GeometryInfo info;
+ XkbDescPtr xkb;
+
+ xkb = result->xkb;
+ InitGeometryInfo(&info, file->id, merge);
+ info.dpy = xkb->dpy;
+ HandleGeometryFile(file, xkb, merge, &info);
+
+ if (info.errorCount == 0)
+ {
+ XkbGeometryPtr geom;
+ XkbGeometrySizesRec sizes;
+ bzero(&sizes, sizeof(sizes));
+ sizes.which = XkbGeomAllMask;
+ sizes.num_properties = info.nProps;
+ sizes.num_colors = 8;
+ sizes.num_shapes = info.nShapes;
+ sizes.num_sections = info.nSections;
+ sizes.num_doodads = info.nDoodads;
+ if (XkbAllocGeometry(xkb, &sizes) != Success)
+ {
+ WSGO("Couldn't allocate GeometryRec\n");
+ ACTION("Geometry not compiled\n");
+ return False;
+ }
+ geom = xkb->geom;
+
+ geom->width_mm = info.widthMM;
+ geom->height_mm = info.heightMM;
+ if (info.name != NULL)
+ {
+ geom->name = XkbInternAtom(xkb->dpy, info.name, False);
+ if (XkbAllocNames(xkb, XkbGeometryNameMask, 0, 0) == Success)
+ xkb->names->geometry = geom->name;
+ }
+ if (info.fontSpec != None)
+ geom->label_font =
+ uStringDup(XkbAtomGetString(NULL, info.fontSpec));
+ else
+ geom->label_font = FontFromParts(info.font, info.fontWeight,
+ info.fontSlant,
+ info.fontSetWidth,
+ info.fontVariant,
+ info.fontSize,
+ info.fontEncoding);
+ XkbAddGeomColor(geom, "black", geom->num_colors);
+ XkbAddGeomColor(geom, "white", geom->num_colors);
+
+ if (info.baseColor == None)
+ info.baseColor = XkbInternAtom(NULL, "white", False);
+ if (info.labelColor == None)
+ info.labelColor = XkbInternAtom(NULL, "black", False);
+ geom->base_color =
+ XkbAddGeomColor(geom, XkbAtomGetString(NULL, info.baseColor),
+ geom->num_colors);
+ geom->label_color =
+ XkbAddGeomColor(geom, XkbAtomGetString(NULL, info.labelColor),
+ geom->num_colors);
+
+ if (info.props)
+ {
+ PropertyInfo *pi;
+ for (pi = info.props; pi != NULL;
+ pi = (PropertyInfo *) pi->defs.next)
+ {
+ if (!XkbAddGeomProperty(geom, pi->name, pi->value))
+ return False;
+ }
+ }
+ if (info.shapes)
+ {
+ ShapeInfo *si;
+ for (si = info.shapes; si != NULL;
+ si = (ShapeInfo *) si->defs.next)
+ {
+ if (!CopyShapeDef(xkb->dpy, geom, si))
+ return False;
+ }
+ }
+ if (info.sections)
+ {
+ SectionInfo *si;
+ for (si = info.sections; si != NULL;
+ si = (SectionInfo *) si->defs.next)
+ {
+ if (!CopySectionDef(geom, si, &info))
+ return False;
+ }
+ }
+ if (info.doodads)
+ {
+ DoodadInfo *di;
+ for (di = info.doodads; di != NULL;
+ di = (DoodadInfo *) di->defs.next)
+ {
+ if (!CopyDoodadDef(geom, NULL, di, &info))
+ return False;
+ }
+ }
+ if (info.aliases)
+ ApplyAliases(xkb, True, &info.aliases);
+ ClearGeometryInfo(&info);
+ return True;
}
return False;
}